Skip to content

Commit 1762106

Browse files
authored
readyz handler (#50)
See also flashbots/rbuilder#643
1 parent d93016d commit 1762106

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

proxy/receiver_api.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
_ "embed"
66
"errors"
77
"log/slog"
8+
"net/http"
89
"time"
910

1011
"github.com/ethereum/go-ethereum/common"
@@ -70,12 +71,34 @@ func (prx *ReceiverProxy) UserJSONRPCHandler(maxRequestBodySizeBytes int64) (*rp
7071
Log: prx.Log,
7172
MaxRequestBodySizeBytes: maxRequestBodySizeBytes,
7273
VerifyRequestSignatureFromHeader: true,
74+
ReadyHandler: prx.readyHandler,
7375
},
7476
)
7577

7678
return handler, err
7779
}
7880

81+
// readyHandler calls /readyz on rbuilder
82+
func (prx *ReceiverProxy) readyHandler(w http.ResponseWriter, r *http.Request) error {
83+
resp, err := http.Get(prx.localBuilderEndpoint + "/readyz")
84+
if err != nil {
85+
prx.Log.Warn("Failed to check builder readiness", slog.Any("error", err))
86+
http.Error(w, "not ready", http.StatusServiceUnavailable)
87+
return nil
88+
}
89+
defer resp.Body.Close()
90+
91+
if resp.StatusCode != http.StatusOK {
92+
http.Error(w, "not ready", http.StatusServiceUnavailable)
93+
return nil
94+
}
95+
96+
// If the builder is ready, return 200 OK
97+
w.WriteHeader(http.StatusOK)
98+
_, _ = w.Write([]byte("ready"))
99+
return nil
100+
}
101+
79102
func (prx *ReceiverProxy) ValidateSigner(ctx context.Context, req *ParsedRequest, systemEndpoint bool) error {
80103
req.signer = rpcserver.GetSigner(ctx)
81104
if !systemEndpoint {

proxy/receiver_proxy.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ type ReceiverProxy struct {
3939

4040
OrderflowSigner *signature.Signer
4141

42-
localBuilder rpcclient.RPCClient
42+
localBuilder rpcclient.RPCClient
43+
localBuilderEndpoint string
4344

4445
UserHandler http.Handler
4546
SystemHandler http.Handler
@@ -109,6 +110,7 @@ func NewReceiverProxy(config ReceiverProxyConfig) (*ReceiverProxy, error) {
109110
ConfigHub: NewBuilderConfigHub(config.Log, config.BuilderConfigHubEndpoint),
110111
OrderflowSigner: orderflowSigner,
111112
localBuilder: localBuilder,
113+
localBuilderEndpoint: config.LocalBuilderEndpoint,
112114
requestUniqueKeysRLU: expirable.NewLRU[uuid.UUID, struct{}](requestsRLUSize, nil, requestsRLUTTL),
113115
replacementNonceRLU: expirable.NewLRU[replacementNonceKey, int](replacementNonceSize, nil, replacementNonceTTL),
114116
userAPIRateLimiter: userAPIRateLimiter,

proxy/receiver_proxy_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,3 +671,20 @@ func TestValidateLocalBundles(t *testing.T) {
671671

672672
proxiesFlushQueue()
673673
}
674+
675+
func TestJSONRPCServerReadyzOK(t *testing.T) {
676+
tempDir := t.TempDir()
677+
certPath := path.Join(tempDir, "cert")
678+
keyPath := path.Join(tempDir, "key")
679+
proxy, err := StartTestOrderflowProxy("1", certPath, keyPath)
680+
require.NoError(t, err)
681+
682+
req := httptest.NewRequest(http.MethodGet, "/readyz", nil)
683+
684+
rr := httptest.NewRecorder()
685+
proxy.localServer.Handler.ServeHTTP(rr, req)
686+
respBody, err := io.ReadAll(rr.Body)
687+
require.NoError(t, err)
688+
require.Equal(t, http.StatusOK, rr.Code)
689+
require.Contains(t, string(respBody), "ready")
690+
}

0 commit comments

Comments
 (0)