@@ -1312,3 +1312,77 @@ func TestTokenInfo(t *testing.T) {
13121312 t .Errorf ("got %q, want %q" , g , w )
13131313 }
13141314}
1315+
1316+ func TestStreamableGET (t * testing.T ) {
1317+ // This test checks the fix for problematic behavior described in #410:
1318+ // Hanging GET headers should be written immediately, even if there are no
1319+ // messages.
1320+ server := NewServer (testImpl , nil )
1321+
1322+ handler := NewStreamableHTTPHandler (func (req * http.Request ) * Server { return server }, nil )
1323+ httpServer := httptest .NewServer (handler )
1324+ defer httpServer .Close ()
1325+
1326+ ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
1327+ defer cancel ()
1328+
1329+ newReq := func (method string , msg jsonrpc.Message ) * http.Request {
1330+ var body io.Reader
1331+ if msg != nil {
1332+ data , err := jsonrpc2 .EncodeMessage (msg )
1333+ if err != nil {
1334+ t .Fatal (err )
1335+ }
1336+ body = bytes .NewReader (data )
1337+ }
1338+ req , err := http .NewRequestWithContext (ctx , method , httpServer .URL , body )
1339+ if err != nil {
1340+ t .Fatal (err )
1341+ }
1342+ req .Header .Set ("Accept" , "application/json, text/event-stream" )
1343+ if msg != nil {
1344+ req .Header .Set ("Content-Type" , "application/json" )
1345+ }
1346+ return req
1347+ }
1348+
1349+ get1 := newReq (http .MethodGet , nil )
1350+ resp , err := http .DefaultClient .Do (get1 )
1351+ if err != nil {
1352+ t .Fatal (err )
1353+ }
1354+ if got , want := resp .StatusCode , http .StatusMethodNotAllowed ; got != want {
1355+ t .Errorf ("initial GET: got status %d, want %d" , got , want )
1356+ }
1357+ defer resp .Body .Close ()
1358+
1359+ post1 := newReq (http .MethodPost , req (1 , methodInitialize , & InitializeParams {}))
1360+ resp , err = http .DefaultClient .Do (post1 )
1361+ if err != nil {
1362+ t .Fatal (err )
1363+ }
1364+ defer resp .Body .Close ()
1365+ if got , want := resp .StatusCode , http .StatusOK ; got != want {
1366+ body , err := io .ReadAll (resp .Body )
1367+ if err != nil {
1368+ t .Fatal (err )
1369+ }
1370+ t .Errorf ("initialize POST: got status %d, want %d; body:\n %s" , got , want , string (body ))
1371+ }
1372+
1373+ sessionID := resp .Header .Get (sessionIDHeader )
1374+ if sessionID == "" {
1375+ t .Fatalf ("initialized missing session ID" )
1376+ }
1377+
1378+ get2 := newReq ("GET" , nil )
1379+ get2 .Header .Set (sessionIDHeader , sessionID )
1380+ resp , err = http .DefaultClient .Do (get2 )
1381+ if err != nil {
1382+ t .Fatal (err )
1383+ }
1384+ defer resp .Body .Close ()
1385+ if got , want := resp .StatusCode , http .StatusOK ; got != want {
1386+ t .Errorf ("GET with session ID: got status %d, want %d" , got , want )
1387+ }
1388+ }
0 commit comments