rpc: allow RPC requests on GET too
This commit is contained in:
		
							
								
								
									
										46
									
								
								rpc/http.go
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								rpc/http.go
									
									
									
									
									
								
							| @@ -18,21 +18,19 @@ package rpc | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"net" |  | ||||||
| 	"net/http" |  | ||||||
| 	"strconv" |  | ||||||
| 	"strings" |  | ||||||
| 	"time" |  | ||||||
|  |  | ||||||
| 	"errors" |  | ||||||
| 	"sync" |  | ||||||
|  |  | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
|  | 	"net" | ||||||
|  | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"sync" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| 	"github.com/ethereum/go-ethereum/logger/glog" | 	"github.com/ethereum/go-ethereum/logger/glog" | ||||||
| @@ -44,8 +42,8 @@ const ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	httpServerMu sync.Mutex   // prevent concurrent access to the httpListener and httpServer | 	httpServerMu  sync.Mutex   // prevent concurrent access to the httpListener and httpServer | ||||||
| 	httpListener net.Listener // listener for the http server | 	httpListener  net.Listener // listener for the http server | ||||||
| 	httpRPCServer *Server      // the node can only start 1 HTTP RPC server instance | 	httpRPCServer *Server      // the node can only start 1 HTTP RPC server instance | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -57,8 +55,7 @@ var ( | |||||||
| type httpMessageStream struct { | type httpMessageStream struct { | ||||||
| 	conn             net.Conn          // TCP connection | 	conn             net.Conn          // TCP connection | ||||||
| 	rw               *bufio.ReadWriter // buffered where HTTP requests/responses are read/written from/to | 	rw               *bufio.ReadWriter // buffered where HTTP requests/responses are read/written from/to | ||||||
| 	currentReq       *http.Request     // pending request, codec can pass in a too small buffer for a single read | 	currentReq       *http.Request     // pending request, codec can pass in a too small buffer for a single read we need to keep track of the current requests if it was not read at once | ||||||
| 					   // we need to keep track of the current requests if it was not read at once |  | ||||||
| 	payloadBytesRead int64             // number of bytes which are read from the current request | 	payloadBytesRead int64             // number of bytes which are read from the current request | ||||||
| 	allowedOrigins   *set.Set          // allowed CORS domains | 	allowedOrigins   *set.Set          // allowed CORS domains | ||||||
| 	origin           string            // origin of this connection/request | 	origin           string            // origin of this connection/request | ||||||
| @@ -147,7 +144,7 @@ func (h *httpMessageStream) Read(buf []byte) (n int, err error) { | |||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if strings.EqualFold(h.currentReq.Method, "POST") { | 		if strings.EqualFold(h.currentReq.Method, "GET") || strings.EqualFold(h.currentReq.Method, "POST") { | ||||||
| 			n, err := h.currentReq.Body.Read(buf) | 			n, err := h.currentReq.Body.Read(buf) | ||||||
| 			h.payloadBytesRead += int64(n) | 			h.payloadBytesRead += int64(n) | ||||||
|  |  | ||||||
| @@ -164,12 +161,9 @@ func (h *httpMessageStream) Read(buf []byte) (n int, err error) { | |||||||
| 				h.currentReq = nil | 				h.currentReq = nil | ||||||
| 				h.payloadBytesRead = 0 | 				h.payloadBytesRead = 0 | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			// partial read of body | 			// partial read of body | ||||||
| 			return n, err | 			return n, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		h.currentReq = nil |  | ||||||
| 		return 0, fmt.Errorf("unsupported HTTP method '%s'", h.currentReq.Method) | 		return 0, fmt.Errorf("unsupported HTTP method '%s'", h.currentReq.Method) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -212,17 +206,17 @@ func httpTimestamp(t time.Time) []byte { | |||||||
| 	t = t.UTC() | 	t = t.UTC() | ||||||
| 	yy, mm, dd := t.Date() | 	yy, mm, dd := t.Date() | ||||||
| 	hh, mn, ss := t.Clock() | 	hh, mn, ss := t.Clock() | ||||||
| 	day := days[3 * t.Weekday():] | 	day := days[3*t.Weekday():] | ||||||
| 	mon := months[3 * (mm - 1):] | 	mon := months[3*(mm-1):] | ||||||
|  |  | ||||||
| 	return append(b, | 	return append(b, | ||||||
| 		day[0], day[1], day[2], ',', ' ', | 		day[0], day[1], day[2], ',', ' ', | ||||||
| 		byte('0' + dd / 10), byte('0' + dd % 10), ' ', | 		byte('0'+dd/10), byte('0'+dd%10), ' ', | ||||||
| 		mon[0], mon[1], mon[2], ' ', | 		mon[0], mon[1], mon[2], ' ', | ||||||
| 		byte('0' + yy / 1000), byte('0' + (yy / 100) % 10), byte('0' + (yy / 10) % 10), byte('0' + yy % 10), ' ', | 		byte('0'+yy/1000), byte('0'+(yy/100)%10), byte('0'+(yy/10)%10), byte('0'+yy%10), ' ', | ||||||
| 		byte('0' + hh / 10), byte('0' + hh % 10), ':', | 		byte('0'+hh/10), byte('0'+hh%10), ':', | ||||||
| 		byte('0' + mn / 10), byte('0' + mn % 10), ':', | 		byte('0'+mn/10), byte('0'+mn%10), ':', | ||||||
| 		byte('0' + ss / 10), byte('0' + ss % 10), ' ', | 		byte('0'+ss/10), byte('0'+ss%10), ' ', | ||||||
| 		'G', 'M', 'T') | 		'G', 'M', 'T') | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user