rpcsrv: align default error code with C# implementation

We had 400, 405 and 500 in getHTTPCodeForError, but none is explicitly
set in C#.

1. **405 code** (unknown method, `neorpc.MethodNotFoundCode`). The
resulting HTTP code returned by C# server is 200 OK:
```
anna@kiwi:~/Documents/GitProjects/bane-labs/go-ethereum$ curl -v -d '{
"jsonrpc": "2.0", "id": 1, "method": "unknown-method", "params": [] }'
http://seed1t5.neo.org:20332 | json_pp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time
  Current
                                 Dload  Upload   Total   Spent    Left
                                 Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--
       0*   Trying 34.133.235.69:20332...
* Connected to seed1t5.neo.org (34.133.235.69) port 20332 (#0)
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--
       0> POST / HTTP/1.1
> Host: seed1t5.neo.org:20332
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 71
> Content-Type: application/x-www-form-urlencoded
>
} [71 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Tue, 12 Nov 2024 13:45:51 GMT
< Server: Kestrel
< Transfer-Encoding: chunked
<
{ [461 bytes data]
100   520    0   449  100    71    729    115 --:--:-- --:--:-- --:--:--
   844
* Connection #0 to host seed1t5.neo.org left intact
{
   "error" : {
      "code" : -32601,
      "data" : "   at Neo.Plugins.Result.True_Or(Boolean result,
      RpcError err)\n   at Neo.Plugins.RpcServer.ProcessRequestAsync
      (HttpContext context, JObject request)",
      "message" : "Method not found - The method 'unknown-method'
      doesn't exists. -    at Neo.Plugins.Result.True_Or(Boolean result,
       RpcError err)\n   at Neo.Plugins.RpcServer.ProcessRequestAsync
       (HttpContext context, JObject request)"
   },
   "id" : 1,
   "jsonrpc" : "2.0"
}
```
2. **400 code** (malformed request, `neorpc.BadRequestCode`). The
resulting HTTP code returned by C# server is 200 OK:
```
anna@kiwi:~/Documents/GitProjects/bane-labs/go-ethereum$ curl -v -d '{
"jsonrpc": "2.0", "id": 1, "method": "getapplicationlog", "params": ["]
}' http://seed1t5.neo.org:20332 | json_pp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time
  Current
                                 Dload  Upload   Total   Spent    Left
                                 Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--
       0*   Trying 34.133.235.69:20332...
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--
       0* Connected to seed1t5.neo.org (34.133.235.69) port 20332 (#0)
> POST / HTTP/1.1
> Host: seed1t5.neo.org:20332
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 75
> Content-Type: application/x-www-form-urlencoded
>
} [75 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Tue, 12 Nov 2024 13:50:12 GMT
< Server: Kestrel
< Transfer-Encoding: chunked
<
{ [86 bytes data]
100   150    0    75  100    75     84     84 --:--:-- --:--:-- --:--:--
   169
* Connection #0 to host seed1t5.neo.org left intact
{
   "error" : {
      "code" : -32700,
      "message" : "Bad request"
   },
   "id" : null,
   "jsonrpc" : "2.0"
}
```
3. **500 code** (internal server error, `neorpc
.InternalServerErrorCode`). It's difficult to reproduce this error on
real network for C# server, but the resulting code is expected to be the
 same, 200 OK.

Close #3586

Signed-off-by: Ekaterina Pavlova <ekt@morphbits.io>
This commit is contained in:
Ekaterina Pavlova 2024-11-06 16:26:30 +03:00
parent 66fbcb2f00
commit 0afd9ac0bb
2 changed files with 0 additions and 23 deletions

View file

@ -1,8 +1,6 @@
package rpcsrv
import (
"net/http"
"github.com/nspcc-dev/neo-go/pkg/neorpc"
)
@ -36,18 +34,3 @@ func (ab abstractBatch) RunForErrors(f func(jsonErr *neorpc.Error)) {
a.RunForErrors(f)
}
}
func getHTTPCodeForError(respErr *neorpc.Error) int {
var httpCode int
switch respErr.Code {
case neorpc.BadRequestCode:
httpCode = http.StatusBadRequest
case neorpc.MethodNotFoundCode:
httpCode = http.StatusMethodNotAllowed
case neorpc.InternalServerErrorCode:
httpCode = http.StatusInternalServerError
default:
httpCode = http.StatusUnprocessableEntity
}
return httpCode
}

View file

@ -3100,12 +3100,6 @@ func (s *Server) writeHTTPServerResponse(r *params.Request, w http.ResponseWrite
if s.config.EnableCORSWorkaround {
setCORSOriginHeaders(w.Header())
}
if r.In != nil {
resp := resp.(abstract)
if resp.Error != nil {
w.WriteHeader(getHTTPCodeForError(resp.Error))
}
}
encoder := json.NewEncoder(w)
err := encoder.Encode(resp)