From 819387f0de30e8b4d679600fd79b94442701128a Mon Sep 17 00:00:00 2001 From: George Zhang Date: Thu, 29 Jan 2026 17:49:04 -0800 Subject: [PATCH] rpcserver: restore GetOrigin and ExtractOriginFromHeader Re-adds the origin extraction functionality that was removed in 84570ad. This allows existing code using GetOrigin(ctx) to continue working alongside the newer GetRequest(ctx) pattern. Co-Authored-By: Claude Opus 4.5 --- rpcserver/jsonrpc_server.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/rpcserver/jsonrpc_server.go b/rpcserver/jsonrpc_server.go index 6746c73..bd087bb 100644 --- a/rpcserver/jsonrpc_server.go +++ b/rpcserver/jsonrpc_server.go @@ -40,6 +40,7 @@ var ( ) const ( + maxOriginIDLength = 255 requestSizeThreshold = 50_000 highPriorityHeader = "high_prio" @@ -57,6 +58,7 @@ type ( urlKey struct{} sizeKey struct{} requestKey struct{} + originKey struct{} ) type jsonRPCRequest struct { @@ -108,6 +110,9 @@ type JSONRPCHandlerOpts struct { ExtractPriorityFromHeader bool // If true, extracts the `X-BuilderNet-SentAtUs` header value and sets it in the context. ExtractBuilderNetSentAtFromHeader bool + // If true extract value from x-flashbots-origin header + // Result can be extracted from the context using GetOrigin + ExtractOriginFromHeader bool // GET response content GetResponseContent []byte // Custom handler for /readyz endpoint. If not nil then it is expected to write the response to the provided ResponseWriter. @@ -354,6 +359,18 @@ func (h *JSONRPCHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } + if h.ExtractOriginFromHeader { + origin := r.Header.Get(FlashbotsOriginHeader) + if origin != "" { + if len(origin) > maxOriginIDLength { + h.writeJSONRPCError(w, req.ID, CodeInvalidRequest, "x-flashbots-origin header is too long") + incIncorrectRequest(h.ServerName) + return + } + ctx = context.WithValue(ctx, originKey{}, origin) + } + } + // get method method, ok := h.methods[req.Method] if !ok { @@ -429,6 +446,21 @@ func GetBuilderNetSentAt(ctx context.Context) time.Time { return value } +func GetOrigin(ctx context.Context) string { + value, ok := ctx.Value(originKey{}).(string) + if !ok { + return "" + } + return value +} + +// WithOrigin returns a new request with the origin set in its context. +// Use this in middleware to set the origin for downstream handlers to read via GetOrigin. +func WithOrigin(r *http.Request, origin string) *http.Request { + ctx := context.WithValue(r.Context(), originKey{}, origin) + return r.WithContext(ctx) +} + func GetRequestSize(ctx context.Context) int { return ctx.Value(sizeKey{}).(int) }