@@ -329,46 +329,36 @@ pub export fn gitlab_api_mcp_request(
329329 break :blk body [0.. blen ];
330330 } else null ;
331331
332- // Open request
333- var server_header_buffer : [16384 ]u8 = undefined ;
334- var req = client .open (http_method , uri , .{
335- .server_header_buffer = & server_header_buffer ,
332+ // Fetch the request (Zig 0.15 API — replaces open/send/wait)
333+ var response_storage = std .ArrayList (u8 ).init (allocator );
334+ defer response_storage .deinit ();
335+
336+ const fetch_result = client .fetch (.{
337+ .method = http_method ,
338+ .location = .{ .uri = uri },
336339 .extra_headers = & headers_buf ,
340+ .payload = body_slice ,
341+ .response_storage = .{ .dynamic = & response_storage },
337342 }) catch return -4 ;
338- defer req .deinit ();
339-
340- if (body_slice ) | b | {
341- req .transfer_encoding = .{ .content_length = b .len };
342- }
343-
344- req .send () catch return -4 ;
345-
346- if (body_slice ) | b | {
347- req .writer ().writeAll (b ) catch return -4 ;
348- }
349-
350- req .finish () catch return -4 ;
351- req .wait () catch return -4 ;
352343
353344 // Handle rate limiting (HTTP 429)
354- const status_code = @intFromEnum (req . response .status );
345+ const status_code = @intFromEnum (fetch_result .status );
355346 if (status_code == 429 ) {
356347 slot .state = .rate_limited ;
357348 slot .rate_limit_remaining = 0 ;
358349 return -3 ;
359350 }
360351
361- // Read response body
362- const bytes_read = req .reader ().readAll (out_buf [0.. cap ]) catch return -4 ;
363-
364352 // Handle server errors
353+ const bytes_read = @min (response_storage .items .len , cap );
354+ @memcpy (out_buf [0.. bytes_read ], response_storage .items [0.. bytes_read ]);
355+ out_len .* = @intCast (bytes_read );
356+
365357 if (status_code >= 500 ) {
366358 slot .state = .err ;
367- out_len .* = @intCast (bytes_read );
368359 return -4 ;
369360 }
370361
371- out_len .* = @intCast (bytes_read );
372362 return 0 ;
373363}
374364
@@ -445,27 +435,27 @@ pub export fn gitlab_api_mcp_graphql(
445435 .{ .name = "User-Agent" , .value = "boj-server/1.0 (gitlab-api-mcp cartridge)" },
446436 };
447437
448- var server_header_buffer : [16384 ]u8 = undefined ;
449- var req = client .open (.POST , uri , .{
450- .server_header_buffer = & server_header_buffer ,
438+ // Fetch the request (Zig 0.15 API — replaces open/send/wait)
439+ var response_storage = std .ArrayList (u8 ).init (allocator );
440+ defer response_storage .deinit ();
441+
442+ const fetch_result = client .fetch (.{
443+ .method = .POST ,
444+ .location = .{ .uri = uri },
451445 .extra_headers = & headers_buf ,
446+ .payload = gql_body ,
447+ .response_storage = .{ .dynamic = & response_storage },
452448 }) catch return -4 ;
453- defer req .deinit ();
454449
455- req .transfer_encoding = .{ .content_length = gql_body .len };
456- req .send () catch return -4 ;
457- req .writer ().writeAll (gql_body ) catch return -4 ;
458- req .finish () catch return -4 ;
459- req .wait () catch return -4 ;
460-
461- const status_code = @intFromEnum (req .response .status );
450+ const status_code = @intFromEnum (fetch_result .status );
462451 if (status_code == 429 ) {
463452 slot .state = .rate_limited ;
464453 slot .rate_limit_remaining = 0 ;
465454 return -3 ;
466455 }
467456
468- const bytes_read = req .reader ().readAll (out_buf [0.. cap ]) catch return -5 ;
457+ const bytes_read = @min (response_storage .items .len , cap );
458+ @memcpy (out_buf [0.. bytes_read ], response_storage .items [0.. bytes_read ]);
469459 out_len .* = @intCast (bytes_read );
470460 return 0 ;
471461}
@@ -537,27 +527,27 @@ pub export fn gitlab_api_mcp_setup_mirror(
537527 .{ .name = "User-Agent" , .value = "boj-server/1.0 (gitlab-api-mcp cartridge)" },
538528 };
539529
540- var server_header_buffer : [16384 ]u8 = undefined ;
541- var req = client .open (.POST , uri , .{
542- .server_header_buffer = & server_header_buffer ,
530+ // Fetch the request (Zig 0.15 API — replaces open/send/wait)
531+ var response_storage = std .ArrayList (u8 ).init (allocator );
532+ defer response_storage .deinit ();
533+
534+ const fetch_result = client .fetch (.{
535+ .method = .POST ,
536+ .location = .{ .uri = uri },
543537 .extra_headers = & headers_buf_mirror ,
538+ .payload = mirror_body ,
539+ .response_storage = .{ .dynamic = & response_storage },
544540 }) catch return -4 ;
545- defer req .deinit ();
546-
547- req .transfer_encoding = .{ .content_length = mirror_body .len };
548- req .send () catch return -4 ;
549- req .writer ().writeAll (mirror_body ) catch return -4 ;
550- req .finish () catch return -4 ;
551- req .wait () catch return -4 ;
552541
553- const status_code = @intFromEnum (req . response .status );
542+ const status_code = @intFromEnum (fetch_result .status );
554543 if (status_code == 429 ) {
555544 slot .state = .rate_limited ;
556545 slot .rate_limit_remaining = 0 ;
557546 return -3 ;
558547 }
559548
560- const bytes_read = req .reader ().readAll (out_buf [0.. cap ]) catch return -5 ;
549+ const bytes_read = @min (response_storage .items .len , cap );
550+ @memcpy (out_buf [0.. bytes_read ], response_storage .items [0.. bytes_read ]);
561551 out_len .* = @intCast (bytes_read );
562552 return 0 ;
563553}
0 commit comments