aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/v2/server.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2015-12-16 18:12:06 +0800
committerFelix Lange <fjl@twurst.com>2015-12-16 18:12:06 +0800
commite6408617049d10a6366eef33ea9e97b58c7e30f9 (patch)
treee68b2711bbe3a745e67f022595dbe9ecd2a6f4b8 /rpc/v2/server.go
parentb9aedeab0b1cf56860f5ca53333a4f348395259c (diff)
parentf3aac71fad041dedd239f0a86f7c7c43614cbf4f (diff)
downloaddexon-e6408617049d10a6366eef33ea9e97b58c7e30f9.tar.gz
dexon-e6408617049d10a6366eef33ea9e97b58c7e30f9.tar.zst
dexon-e6408617049d10a6366eef33ea9e97b58c7e30f9.zip
Merge pull request #2061 from zsfelfoldi/rpc-context
rpc: optionally passing context argument to rpc v2 api methods
Diffstat (limited to 'rpc/v2/server.go')
-rw-r--r--rpc/v2/server.go21
1 files changed, 14 insertions, 7 deletions
diff --git a/rpc/v2/server.go b/rpc/v2/server.go
index ff6b69015..4c04f04d2 100644
--- a/rpc/v2/server.go
+++ b/rpc/v2/server.go
@@ -25,6 +25,7 @@ import (
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/logger/glog"
+ "golang.org/x/net/context"
)
// NewServer will create a new server instance with no registered handlers.
@@ -120,6 +121,9 @@ func (s *Server) ServeCodec(codec ServerCodec) {
codec.Close()
}()
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
for {
reqs, batch, err := s.readRequest(codec)
if err != nil {
@@ -129,9 +133,9 @@ func (s *Server) ServeCodec(codec ServerCodec) {
}
if batch {
- go s.execBatch(codec, reqs)
+ go s.execBatch(ctx, codec, reqs)
} else {
- go s.exec(codec, reqs[0])
+ go s.exec(ctx, codec, reqs[0])
}
}
}
@@ -220,7 +224,7 @@ func (s *Server) unsubscribe(subid string) bool {
}
// handle executes a request and returns the response from the callback.
-func (s *Server) handle(codec ServerCodec, req *serverRequest) interface{} {
+func (s *Server) handle(ctx context.Context, codec ServerCodec, req *serverRequest) interface{} {
if req.err != nil {
return codec.CreateErrorResponse(&req.id, req.err)
}
@@ -255,6 +259,9 @@ func (s *Server) handle(codec ServerCodec, req *serverRequest) interface{} {
}
arguments := []reflect.Value{req.callb.rcvr}
+ if req.callb.hasCtx {
+ arguments = append(arguments, reflect.ValueOf(ctx))
+ }
if len(req.args) > 0 {
arguments = append(arguments, req.args...)
}
@@ -277,12 +284,12 @@ func (s *Server) handle(codec ServerCodec, req *serverRequest) interface{} {
}
// exec executes the given request and writes the result back using the codec.
-func (s *Server) exec(codec ServerCodec, req *serverRequest) {
+func (s *Server) exec(ctx context.Context, codec ServerCodec, req *serverRequest) {
var response interface{}
if req.err != nil {
response = codec.CreateErrorResponse(&req.id, req.err)
} else {
- response = s.handle(codec, req)
+ response = s.handle(ctx, codec, req)
}
if err := codec.Write(response); err != nil {
@@ -293,13 +300,13 @@ func (s *Server) exec(codec ServerCodec, req *serverRequest) {
// execBatch executes the given requests and writes the result back using the codec. It will only write the response
// back when the last request is processed.
-func (s *Server) execBatch(codec ServerCodec, requests []*serverRequest) {
+func (s *Server) execBatch(ctx context.Context, codec ServerCodec, requests []*serverRequest) {
responses := make([]interface{}, len(requests))
for i, req := range requests {
if req.err != nil {
responses[i] = codec.CreateErrorResponse(&req.id, req.err)
} else {
- responses[i] = s.handle(codec, req)
+ responses[i] = s.handle(ctx, codec, req)
}
}