@@ -7,6 +7,8 @@ package mcp
77import (
88 "context"
99 "io"
10+ "net/http"
11+ "net/http/httptest"
1012 "strings"
1113 "testing"
1214
@@ -124,3 +126,109 @@ func TestIOConnRead(t *testing.T) {
124126 })
125127 }
126128}
129+
130+ func TestScanEventsBufferError (t * testing.T ) {
131+ ctx := context .Background ()
132+ tests := []struct {
133+ name string
134+ clientTransport func (url string ) Transport
135+ serverHandler func (server * Server ) http.Handler
136+ responseLength int
137+ expectedContainsError string
138+ }{
139+ {
140+ name : "sse-large-output" ,
141+ clientTransport : func (url string ) Transport {
142+ return & SSEClientTransport {
143+ Endpoint : url ,
144+ MaxLineSize : 1024 ,
145+ }
146+ },
147+ serverHandler : func (server * Server ) http.Handler {
148+ return NewSSEHandler (func (req * http.Request ) * Server { return server }, nil )
149+ },
150+ responseLength : 10000 ,
151+ expectedContainsError : "exceeded max line length" ,
152+ },
153+ {
154+ name : "streamable-large-output" ,
155+ clientTransport : func (url string ) Transport {
156+ return & StreamableClientTransport {
157+ Endpoint : url ,
158+ MaxLineSize : 1024 ,
159+ }
160+ },
161+ serverHandler : func (server * Server ) http.Handler {
162+ return NewStreamableHTTPHandler (func (req * http.Request ) * Server { return server }, nil )
163+ },
164+ responseLength : 10000 ,
165+ expectedContainsError : "exceeded max line length" ,
166+ },
167+ {
168+ name : "sse-small-output" ,
169+ clientTransport : func (url string ) Transport {
170+ return & SSEClientTransport {
171+ Endpoint : url ,
172+ MaxLineSize : 1024 ,
173+ }
174+ },
175+ serverHandler : func (server * Server ) http.Handler {
176+ return NewSSEHandler (func (req * http.Request ) * Server { return server }, nil )
177+ },
178+ responseLength : 512 ,
179+ },
180+ {
181+ name : "streamable-small-output" ,
182+ clientTransport : func (url string ) Transport {
183+ return & StreamableClientTransport {
184+ Endpoint : url ,
185+ MaxLineSize : 1024 ,
186+ }
187+ },
188+ serverHandler : func (server * Server ) http.Handler {
189+ return NewStreamableHTTPHandler (func (req * http.Request ) * Server { return server }, nil )
190+ },
191+ responseLength : 512 ,
192+ },
193+ }
194+ for _ , tt := range tests {
195+ t .Run (tt .name , func (t * testing.T ) {
196+ largeResponse := strings .Repeat ("x" , tt .responseLength )
197+ server := NewServer (testImpl , nil )
198+ AddTool (server , & Tool {Name : "largeTool" , Description : "returns large response" }, func (ctx context.Context , req * CallToolRequest , args any ) (* CallToolResult , any , error ) {
199+ return & CallToolResult {Content : []Content {& TextContent {Text : largeResponse }}}, nil , nil
200+ })
201+
202+ httpHandler := tt .serverHandler (server )
203+ httpServer := httptest .NewServer (mustNotPanic (t , httpHandler ))
204+ defer httpServer .Close ()
205+
206+ client := NewClient (testImpl , nil )
207+ clientTransport := tt .clientTransport (httpServer .URL )
208+ session , err := client .Connect (ctx , clientTransport , nil )
209+ if err != nil {
210+ t .Fatalf ("client.Connect() failed: %v" , err )
211+ }
212+ defer session .Close ()
213+
214+ _ , err = session .CallTool (ctx , & CallToolParams {
215+ Name : "largeTool" ,
216+ Arguments : map [string ]any {},
217+ })
218+ if tt .expectedContainsError != "" {
219+ if tt .expectedContainsError != "" && err == nil {
220+ t .Fatal ("expected error due to small buffer, got nil" )
221+ }
222+
223+ if ! strings .Contains (err .Error (), "exceeded max line length" ) {
224+ t .Fatalf ("expected buffer-related error, got: %v" , err )
225+ }
226+ } else {
227+ if err != nil {
228+ t .Fatalf ("client.CallTool() unexpectedly failed: %v" , err )
229+ }
230+ }
231+
232+ })
233+ }
234+ }
0 commit comments