Move and rename BlockchainCodec, BlockchainCodecRequest.
These are not specifically "blockchain", rather they are specific to how gorilla/rpc works.
This commit is contained in:
parent
979d0d16b6
commit
4005996992
2 changed files with 44 additions and 44 deletions
|
@ -10,9 +10,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gorilla/rpc"
|
|
||||||
"github.com/lbryio/herald.go/db"
|
"github.com/lbryio/herald.go/db"
|
||||||
"github.com/lbryio/herald.go/internal"
|
"github.com/lbryio/herald.go/internal"
|
||||||
"github.com/lbryio/lbcd/chaincfg"
|
"github.com/lbryio/lbcd/chaincfg"
|
||||||
|
@ -23,42 +21,6 @@ import (
|
||||||
"golang.org/x/exp/constraints"
|
"golang.org/x/exp/constraints"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BlockchainCodec struct {
|
|
||||||
rpc.Codec
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *BlockchainCodec) NewRequest(r *http.Request) rpc.CodecRequest {
|
|
||||||
return &BlockchainCodecRequest{c.Codec.NewRequest(r)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockchainCodecRequest provides ability to rewrite the incoming
|
|
||||||
// request "method" field. For example:
|
|
||||||
// blockchain.block.get_header -> blockchain_block.Get_header
|
|
||||||
// blockchain.address.listunspent -> blockchain_address.Listunspent
|
|
||||||
// This makes the "method" string compatible with Gorilla/RPC
|
|
||||||
// requirements.
|
|
||||||
type BlockchainCodecRequest struct {
|
|
||||||
rpc.CodecRequest
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cr *BlockchainCodecRequest) Method() (string, error) {
|
|
||||||
rawMethod, err := cr.CodecRequest.Method()
|
|
||||||
if err != nil {
|
|
||||||
return rawMethod, err
|
|
||||||
}
|
|
||||||
parts := strings.Split(rawMethod, ".")
|
|
||||||
if len(parts) < 2 {
|
|
||||||
return rawMethod, fmt.Errorf("blockchain rpc: service/method ill-formed: %q", rawMethod)
|
|
||||||
}
|
|
||||||
service := strings.Join(parts[0:len(parts)-1], "_")
|
|
||||||
method := parts[len(parts)-1]
|
|
||||||
if len(method) < 1 {
|
|
||||||
return rawMethod, fmt.Errorf("blockchain rpc: method ill-formed: %q", method)
|
|
||||||
}
|
|
||||||
method = strings.ToUpper(string(method[0])) + string(method[1:])
|
|
||||||
return service + "." + method, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockchainService methods handle "blockchain.block.*" RPCs
|
// BlockchainService methods handle "blockchain.block.*" RPCs
|
||||||
type BlockchainService struct {
|
type BlockchainService struct {
|
||||||
DB *db.ReadOnlyDBColumnFamily
|
DB *db.ReadOnlyDBColumnFamily
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
gorilla_mux "github.com/gorilla/mux"
|
||||||
"github.com/gorilla/rpc"
|
gorilla_rpc "github.com/gorilla/rpc"
|
||||||
"github.com/gorilla/rpc/json"
|
gorilla_json "github.com/gorilla/rpc/json"
|
||||||
"github.com/lbryio/herald.go/db"
|
"github.com/lbryio/herald.go/db"
|
||||||
pb "github.com/lbryio/herald.go/protobuf/go"
|
pb "github.com/lbryio/herald.go/protobuf/go"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
@ -31,13 +33,49 @@ func (t *ClaimtrieService) Resolve(r *http.Request, args *ResolveData, result **
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type gorillaRpcCodec struct {
|
||||||
|
gorilla_rpc.Codec
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *gorillaRpcCodec) NewRequest(r *http.Request) gorilla_rpc.CodecRequest {
|
||||||
|
return &gorillaRpcCodecRequest{c.Codec.NewRequest(r)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// gorillaRpcCodecRequest provides ability to rewrite the incoming
|
||||||
|
// request "method" field. For example:
|
||||||
|
// blockchain.block.get_header -> blockchain_block.Get_header
|
||||||
|
// blockchain.address.listunspent -> blockchain_address.Listunspent
|
||||||
|
// This makes the "method" string compatible with Gorilla/RPC
|
||||||
|
// requirements.
|
||||||
|
type gorillaRpcCodecRequest struct {
|
||||||
|
gorilla_rpc.CodecRequest
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *gorillaRpcCodecRequest) Method() (string, error) {
|
||||||
|
rawMethod, err := cr.CodecRequest.Method()
|
||||||
|
if err != nil {
|
||||||
|
return rawMethod, err
|
||||||
|
}
|
||||||
|
parts := strings.Split(rawMethod, ".")
|
||||||
|
if len(parts) < 2 {
|
||||||
|
return rawMethod, fmt.Errorf("blockchain rpc: service/method ill-formed: %q", rawMethod)
|
||||||
|
}
|
||||||
|
service := strings.Join(parts[0:len(parts)-1], "_")
|
||||||
|
method := parts[len(parts)-1]
|
||||||
|
if len(method) < 1 {
|
||||||
|
return rawMethod, fmt.Errorf("blockchain rpc: method ill-formed: %q", method)
|
||||||
|
}
|
||||||
|
method = strings.ToUpper(string(method[0])) + string(method[1:])
|
||||||
|
return service + "." + method, err
|
||||||
|
}
|
||||||
|
|
||||||
// StartJsonRPC starts the json rpc server and registers the endpoints.
|
// StartJsonRPC starts the json rpc server and registers the endpoints.
|
||||||
func (s *Server) StartJsonRPC() error {
|
func (s *Server) StartJsonRPC() error {
|
||||||
port := ":" + s.Args.JSONRPCPort
|
port := ":" + s.Args.JSONRPCPort
|
||||||
|
|
||||||
s1 := rpc.NewServer() // Create a new RPC server
|
s1 := gorilla_rpc.NewServer() // Create a new RPC server
|
||||||
// Register the type of data requested as JSON, with custom codec.
|
// Register the type of data requested as JSON, with custom codec.
|
||||||
s1.RegisterCodec(&BlockchainCodec{json.NewCodec()}, "application/json")
|
s1.RegisterCodec(&gorillaRpcCodec{gorilla_json.NewCodec()}, "application/json")
|
||||||
|
|
||||||
// Register "blockchain.claimtrie.*"" handlers.
|
// Register "blockchain.claimtrie.*"" handlers.
|
||||||
claimtrieSvc := &ClaimtrieService{s.DB}
|
claimtrieSvc := &ClaimtrieService{s.DB}
|
||||||
|
@ -61,7 +99,7 @@ func (s *Server) StartJsonRPC() error {
|
||||||
log.Errorf("RegisterService: %v\n", err)
|
log.Errorf("RegisterService: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
r := mux.NewRouter()
|
r := gorilla_mux.NewRouter()
|
||||||
r.Handle("/rpc", s1)
|
r.Handle("/rpc", s1)
|
||||||
log.Fatal(http.ListenAndServe(port, r))
|
log.Fatal(http.ListenAndServe(port, r))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue