@@ -418,6 +418,81 @@ func TestSSEServer(t *testing.T) {
418
418
cancel ()
419
419
})
420
420
421
+ t .Run ("test useFullURLForMessageEndpoint" , func (t * testing.T ) {
422
+ mcpServer := NewMCPServer ("test" , "1.0.0" )
423
+ sseServer := NewSSEServer (mcpServer )
424
+
425
+ mux := http .NewServeMux ()
426
+ mux .Handle ("/mcp/" , sseServer )
427
+
428
+ ts := httptest .NewServer (mux )
429
+ defer ts .Close ()
430
+
431
+ sseServer .baseURL = ts .URL + "/mcp"
432
+ sseServer .useFullURLForMessageEndpoint = false
433
+ ctx , cancel := context .WithCancel (context .Background ())
434
+ defer cancel ()
435
+
436
+ req , err := http .NewRequestWithContext (ctx , "GET" , fmt .Sprintf ("%s/sse" , sseServer .baseURL ), nil )
437
+ if err != nil {
438
+ t .Fatalf ("Failed to create request: %v" , err )
439
+ }
440
+
441
+ resp , err := http .DefaultClient .Do (req )
442
+ if err != nil {
443
+ t .Fatalf ("Failed to connect to SSE endpoint: %v" , err )
444
+ }
445
+ defer resp .Body .Close ()
446
+
447
+ if resp .StatusCode != http .StatusOK {
448
+ t .Errorf ("Expected status 200, got %d" , resp .StatusCode )
449
+ }
450
+
451
+ // Read the endpoint event
452
+ buf := make ([]byte , 1024 )
453
+ n , err := resp .Body .Read (buf )
454
+ if err != nil {
455
+ t .Fatalf ("Failed to read SSE response: %v" , err )
456
+ }
457
+
458
+ endpointEvent := string (buf [:n ])
459
+ messageURL := strings .TrimSpace (
460
+ strings .Split (strings .Split (endpointEvent , "data: " )[1 ], "\n " )[0 ],
461
+ )
462
+ if ! strings .HasPrefix (messageURL , sseServer .messageEndpoint ) {
463
+ t .Errorf ("Expected messageURL to be %s, got %s" , sseServer .messageEndpoint , messageURL )
464
+ }
465
+
466
+ // The messageURL should already be correct since we set the baseURL correctly
467
+ // Test message endpoint
468
+ initRequest := map [string ]interface {}{
469
+ "jsonrpc" : "2.0" ,
470
+ "id" : 1 ,
471
+ "method" : "initialize" ,
472
+ "params" : map [string ]interface {}{
473
+ "protocolVersion" : "2024-11-05" ,
474
+ "clientInfo" : map [string ]interface {}{
475
+ "name" : "test-client" ,
476
+ "version" : "1.0.0" ,
477
+ },
478
+ },
479
+ }
480
+ requestBody , _ := json .Marshal (initRequest )
481
+
482
+ resp , err = http .Post (sseServer .baseURL + messageURL , "application/json" , bytes .NewBuffer (requestBody ))
483
+ if err != nil {
484
+ t .Fatalf ("Failed to send message: %v" , err )
485
+ }
486
+ defer resp .Body .Close ()
487
+
488
+ if resp .StatusCode != http .StatusAccepted {
489
+ t .Errorf ("Expected status 202, got %d" , resp .StatusCode )
490
+ }
491
+
492
+ // Clean up SSE connection
493
+ cancel ()
494
+ })
495
+
421
496
t .Run ("works as http.Handler with custom basePath" , func (t * testing.T ) {
422
497
mcpServer := NewMCPServer ("test" , "1.0.0" )
423
498
sseServer := NewSSEServer (mcpServer , WithBasePath ("/mcp" ))
@@ -621,11 +696,13 @@ func TestSSEServer(t *testing.T) {
621
696
baseURL := "http://localhost:8080/test"
622
697
messageEndpoint := "/message-test"
623
698
sseEndpoint := "/sse-test"
699
+ useFullURLForMessageEndpoint := false
624
700
srv := & http.Server {}
625
701
rands := []SSEOption {
626
702
WithBasePath (basePath ),
627
703
WithBaseURL (baseURL ),
628
704
WithMessageEndpoint (messageEndpoint ),
705
+ WithUseFullURLForMessageEndpoint (useFullURLForMessageEndpoint ),
629
706
WithSSEEndpoint (sseEndpoint ),
630
707
WithHTTPServer (srv ),
631
708
}
@@ -641,6 +718,9 @@ func TestSSEServer(t *testing.T) {
641
718
if sseServer .basePath != basePath {
642
719
t .Fatalf ("basePath %v, got: %v" , basePath , sseServer .basePath )
643
720
}
721
+ if sseServer .useFullURLForMessageEndpoint != useFullURLForMessageEndpoint {
722
+ t .Fatalf ("useFullURLForMessageEndpoint %v, got: %v" , useFullURLForMessageEndpoint , sseServer .useFullURLForMessageEndpoint )
723
+ }
644
724
645
725
if sseServer .baseURL != baseURL {
646
726
t .Fatalf ("baseURL %v, got: %v" , baseURL , sseServer .baseURL )
0 commit comments