Move and rename BlockchainCodec, BlockchainCodecRequest.

These are not specifically "blockchain", rather they are
specific to how gorilla/rpc works.
This commit is contained in:
Jonathan Moody 2022-09-27 17:07:16 -05:00
parent 979d0d16b6
commit 4005996992
2 changed files with 44 additions and 44 deletions

View file

@ -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

View file

@ -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))