@@ -36,13 +36,6 @@ type sseSession struct {
3636// content. This can be used to inject context values from headers, for example.
3737type SSEContextFunc func (ctx context.Context , r * http.Request ) context.Context
3838
39- // DynamicBasePathFunc allows the user to provide a function to generate the
40- // base path for a given request and sessionID. This is useful for cases where
41- // the base path is not known at the time of SSE server creation, such as when
42- // using a reverse proxy or when the base path is dynamically generated. The
43- // function should return the base path (e.g., "/mcp/tenant123").
44- type DynamicBasePathFunc func (r * http.Request , sessionID string ) string
45-
4639func (s * sseSession ) SessionID () string {
4740 return s .sessionID
4841}
@@ -100,7 +93,7 @@ type SSEServer struct {
10093 sseEndpoint string
10194 sessions sync.Map
10295 srv * http.Server
103- contextFunc SSEContextFunc
96+ contextFunc HTTPContextFunc
10497 dynamicBasePathFunc DynamicBasePathFunc
10598
10699 keepAlive bool
@@ -109,63 +102,43 @@ type SSEServer struct {
109102 mu sync.RWMutex
110103}
111104
112- // SSEOption defines a function type for configuring SSEServer
113- type SSEOption func (* SSEServer )
105+ // Ensure SSEServer implements httpTransportConfigurable
106+ var _ httpTransportConfigurable = (* SSEServer )( nil )
114107
115- // WithBaseURL sets the base URL for the SSE server
116- func WithBaseURL (baseURL string ) SSEOption {
117- return func (s * SSEServer ) {
118- if baseURL != "" {
119- u , err := url .Parse (baseURL )
120- if err != nil {
121- return
122- }
123- if u .Scheme != "http" && u .Scheme != "https" {
124- return
125- }
126- // Check if the host is empty or only contains a port
127- if u .Host == "" || strings .HasPrefix (u .Host , ":" ) {
128- return
129- }
130- if len (u .Query ()) > 0 {
131- return
132- }
108+ // setBasePath sets the static base path (internal use only)
109+ func (s * SSEServer ) setBasePath (basePath string ) {
110+ s .basePath = normalizeURLPath (basePath )
111+ }
112+
113+ // setDynamicBasePath sets the dynamic base path function (internal use only)
114+ func (s * SSEServer ) setDynamicBasePath (fn DynamicBasePathFunc ) {
115+ if fn != nil {
116+ s .dynamicBasePathFunc = func (r * http.Request , sid string ) string {
117+ bp := fn (r , sid )
118+ return normalizeURLPath (bp )
133119 }
134- s .baseURL = strings .TrimSuffix (baseURL , "/" )
135120 }
136121}
137122
138- // WithStaticBasePath adds a new option for setting a static base path
139- func WithStaticBasePath (basePath string ) SSEOption {
140- return func (s * SSEServer ) {
141- s .basePath = normalizeURLPath (basePath )
142- }
123+ // setKeepAliveInterval sets the keep-alive interval (internal use only)
124+ func (s * SSEServer ) setKeepAliveInterval (interval time.Duration ) {
125+ s .keepAlive = true
126+ s .keepAliveInterval = interval
143127}
144128
145- // WithBasePath adds a new option for setting a static base path.
146- //
147- // Deprecated: Use WithStaticBasePath instead. This will be removed in a future version.
148- //
149- //go:deprecated
150- func WithBasePath (basePath string ) SSEOption {
151- return WithStaticBasePath (basePath )
129+ // setKeepAlive enables or disables keep-alive (internal use only)
130+ func (s * SSEServer ) setKeepAlive (keepAlive bool ) {
131+ s .keepAlive = keepAlive
152132}
153133
154- // WithDynamicBasePath accepts a function for generating the base path. This is
155- // useful for cases where the base path is not known at the time of SSE server
156- // creation, such as when using a reverse proxy or when the server is mounted
157- // at a dynamic path.
158- func WithDynamicBasePath (fn DynamicBasePathFunc ) SSEOption {
159- return func (s * SSEServer ) {
160- if fn != nil {
161- s .dynamicBasePathFunc = func (r * http.Request , sid string ) string {
162- bp := fn (r , sid )
163- return normalizeURLPath (bp )
164- }
165- }
166- }
134+ // setContextFunc sets the context customization function (internal use only)
135+ func (s * SSEServer ) setContextFunc (fn HTTPContextFunc ) {
136+ s .contextFunc = fn
167137}
168138
139+ // SSEOption defines a function type for configuring SSEServer
140+ type SSEOption func (* SSEServer )
141+
169142// WithMessageEndpoint sets the message endpoint path
170143func WithMessageEndpoint (endpoint string ) SSEOption {
171144 return func (s * SSEServer ) {
@@ -200,36 +173,19 @@ func WithSSEEndpoint(endpoint string) SSEOption {
200173 }
201174}
202175
203- // WithHTTPServer sets the HTTP server instance
204- func WithHTTPServer (srv * http.Server ) SSEOption {
205- return func (s * SSEServer ) {
206- s .srv = srv
207- }
208- }
209-
210- func WithKeepAliveInterval (keepAliveInterval time.Duration ) SSEOption {
211- return func (s * SSEServer ) {
212- s .keepAlive = true
213- s .keepAliveInterval = keepAliveInterval
214- }
215- }
216-
217- func WithKeepAlive (keepAlive bool ) SSEOption {
218- return func (s * SSEServer ) {
219- s .keepAlive = keepAlive
220- }
221- }
222-
223176// WithSSEContextFunc sets a function that will be called to customise the context
224177// to the server using the incoming request.
178+ //
179+ // Deprecated: Use WithContextFunc instead. This will be removed in a future version.
180+ //go:deprecated
225181func WithSSEContextFunc (fn SSEContextFunc ) SSEOption {
226182 return func (s * SSEServer ) {
227- s . contextFunc = fn
183+ WithHTTPContextFunc ( HTTPContextFunc ( fn ))( s )
228184 }
229185}
230186
231187// NewSSEServer creates a new SSE server instance with the given MCP server and options.
232- func NewSSEServer (server * MCPServer , opts ... SSEOption ) * SSEServer {
188+ func NewSSEServer (server * MCPServer , opts ... interface {} ) * SSEServer {
233189 s := & SSEServer {
234190 server : server ,
235191 sseEndpoint : "/sse" ,
@@ -241,16 +197,23 @@ func NewSSEServer(server *MCPServer, opts ...SSEOption) *SSEServer {
241197
242198 // Apply all options
243199 for _ , opt := range opts {
244- opt (s )
200+ switch o := opt .(type ) {
201+ case SSEOption :
202+ o (s )
203+ case HTTPTransportOption :
204+ o (s )
205+ default :
206+ // Optionally: log or panic for unknown option type
207+ }
245208 }
246209
247210 return s
248211}
249212
250- // NewTestServer creates a test server for testing purposes
251- func NewTestServer (server * MCPServer , opts ... SSEOption ) * httptest.Server {
213+ // NewTestServer creates a test server for testing purposes.
214+ // It takes the same options as NewSSEServer (variadic ...interface{}).
215+ func NewTestServer (server * MCPServer , opts ... interface {}) * httptest.Server {
252216 sseServer := NewSSEServer (server , opts ... )
253-
254217 testServer := httptest .NewServer (sseServer )
255218 sseServer .baseURL = testServer .URL
256219 return testServer
0 commit comments