• rene's avatar
    node: allow websocket and HTTP on the same port (#20810) · 07d909ff
    rene authored
    This change makes it possible to run geth with JSON-RPC over HTTP and
    WebSocket on the same TCP port. The default port for WebSocket
    is still 8546. 
    
        geth --rpc --rpcport 8545 --ws --wsport 8545
    
    This also removes a lot of deprecated API surface from package rpc.
    The rpc package is now purely about serving JSON-RPC and no longer
    provides a way to start an HTTP server.
    Unverified
    07d909ff
rpcstack_test.go 977 Bytes
package node

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/ethereum/go-ethereum/rpc"
	"github.com/stretchr/testify/assert"
)

func TestNewWebsocketUpgradeHandler_websocket(t *testing.T) {
	srv := rpc.NewServer()

	handler := NewWebsocketUpgradeHandler(nil, srv.WebsocketHandler([]string{}))
	ts := httptest.NewServer(handler)
	defer ts.Close()

	responses := make(chan *http.Response)
	go func(responses chan *http.Response) {
		client := &http.Client{}

		req, _ := http.NewRequest(http.MethodGet, ts.URL, nil)
		req.Header.Set("Connection", "upgrade")
		req.Header.Set("Upgrade", "websocket")
		req.Header.Set("Sec-WebSocket-Version", "13")
		req.Header.Set("Sec-Websocket-Key", "SGVsbG8sIHdvcmxkIQ==")

		resp, err := client.Do(req)
		if err != nil {
			t.Error("could not issue a GET request to the test http server", err)
		}
		responses <- resp
	}(responses)

	response := <-responses
	assert.Equal(t, "websocket", response.Header.Get("Upgrade"))
}