@@ -42,10 +42,11 @@ const (
4242 // but the requested entity does not; unknown applications use
4343 // JSONRPC_APPLICATION_NOT_FOUND. For forward-looking keys, this can be the
4444 // "not created yet" signal and may be safe to poll depending on the method.
45- JSONRPC_RESOURCE_NOT_FOUND int = - 32001 //nolint: revive
45+ JSONRPC_RESOURCE_NOT_FOUND int = - 31001 //nolint: revive
4646 // Application not found: the application identifier itself is unknown to
4747 // this node. A configuration error that will not resolve by retrying.
48- JSONRPC_APPLICATION_NOT_FOUND int = - 32002 //nolint: revive
48+ JSONRPC_APPLICATION_NOT_FOUND int = - 31002 //nolint: revive
49+ JSONRPC_RATE_LIMIT_EXCEEDED int = - 32002 //nolint: revive
4950 JSONRPC_PARSE_ERROR int = - 32700 //nolint: revive
5051 JSONRPC_INVALID_REQUEST int = - 32600 //nolint: revive
5152 JSONRPC_METHOD_NOT_FOUND int = - 32601 //nolint: revive
@@ -195,40 +196,44 @@ func (s *Service) handleRPC(w http.ResponseWriter, r *http.Request) {
195196 }
196197
197198 budgetResp := newBudgetWriter (w , MAX_RESPONSE_SIZE )
198- reqLoop:
199199 for i , rawReq := range reqSeq {
200200
201- switch r .Context ().Err () {
202- case context .DeadlineExceeded :
203- s .Logger .Warn ("RPC method dispatch timeout" )
204- fallthrough
205- case context .Canceled :
206- break reqLoop
207- }
208-
209201 if i > 0 && ! s .writeByte (w , ',' ) {
210202 return
211203 }
212204
213205 var responded bool
214206 var req RPCRequest
215- if err := json .Unmarshal (rawReq , & req ); err != nil {
216- responded = s .writeRPCError (w , nil , JSONRPC_INVALID_REQUEST , "invalid request" )
217- } else {
218- s .Logger .Debug (fmt .Sprintf ("Dispatching RPC request: %s" , req .Method ))
219- buffer := budgetResp .NewLimitedWriter ()
220- if buffer == nil {
221- responded = s .writeRPCError (w , req .ID , JSONRPC_INVALID_REQUEST , "response size budget exceeded" )
207+
208+ switch r .Context ().Err () {
209+ case context .Canceled :
210+ return
211+ case context .DeadlineExceeded :
212+ s .Logger .Warn ("RPC method dispatch timeout" )
213+ if err := json .Unmarshal (rawReq , & req ); err != nil {
214+ responded = s .writeRPCError (w , nil , JSONRPC_INVALID_REQUEST , "invalid request" )
215+ } else {
216+ responded = s .writeRPCError (w , req .ID , JSONRPC_RATE_LIMIT_EXCEEDED , "batch deadline exceeded" )
217+ }
218+ default :
219+ if err := json .Unmarshal (rawReq , & req ); err != nil {
220+ responded = s .writeRPCError (w , nil , JSONRPC_INVALID_REQUEST , "invalid request" )
222221 } else {
223- err := s .dispatchOneRequest (buffer , r , req )
224- switch {
225- case err == nil :
226- responded = s .handleResponseResult (w , buffer .Flush ())
227- case errors .Is (err , io .ErrShortBuffer ):
222+ s .Logger .Debug (fmt .Sprintf ("Dispatching RPC request: %s" , req .Method ))
223+ buffer := budgetResp .NewLimitedWriter ()
224+ if buffer == nil {
228225 responded = s .writeRPCError (w , req .ID , JSONRPC_INVALID_REQUEST , "response size budget exceeded" )
229- default :
230- s .Logger .Error ("RPC method response encode failed" , "method" , req .Method , "error" , err )
231- responded = s .writeRPCError (w , req .ID , JSONRPC_INTERNAL_ERROR , "Internal server error" )
226+ } else {
227+ err := s .dispatchOneRequest (buffer , r , req )
228+ switch {
229+ case err == nil :
230+ responded = s .handleResponseResult (w , buffer .Flush ())
231+ case errors .Is (err , io .ErrShortBuffer ):
232+ responded = s .writeRPCError (w , req .ID , JSONRPC_INVALID_REQUEST , "response size budget exceeded" )
233+ default :
234+ s .Logger .Error ("RPC method response encode failed" , "method" , req .Method , "error" , err )
235+ responded = s .writeRPCError (w , req .ID , JSONRPC_INTERNAL_ERROR , "Internal server error" )
236+ }
232237 }
233238 }
234239 }
0 commit comments