A SpaceTraders Agent

fix http abstraction

altagos.dev 04cfde05 b4302ee5

verified
+22 -11
+22 -11
src/st/http.zig
··· 3 const Io = std.Io; 4 const json = std.json; 5 6 const models = @import("models.zig"); 7 - 8 - const TIME_SLEEP_FACTOR: f64 = 0.98; 9 10 const log = std.log.scoped(.SpaceTraders); 11 ··· 307 ); 308 } 309 310 pub fn requestRaw( 311 client: *Client, 312 comptime T: type, ··· 321 var req = try client.http.request(opts.method, uri, .{ 322 .headers = .{ 323 .authorization = opts.authorization(client), 324 - .user_agent = .{ .override = "SPACE/0.1" }, 325 .content_type = .{ .override = "application/json" }, 326 }, 327 }); ··· 366 client.average_latency.store(new_average, .seq_cst); 367 _ = client.total_latency.fetchAdd(latency, .seq_cst); 368 369 - log.debug("latency: {} ms - average: {}ms", .{ latency, new_average }); 370 - 371 log.debug( 372 - "\x1b[2m[path = {s}]\x1b[0m received {s}{d} {s}\x1b[0m", 373 - .{ url[client.base_url.len..], colour, response.head.status, response.head.reason }, 374 ); 375 376 // var header_iter = response.head.iterateHeaders(); ··· 382 var transfer_buffer: [64]u8 = undefined; 383 var decompress: std.http.Decompress = undefined; 384 385 - const decompressed_body_reader = response.readerDecompressing(&transfer_buffer, &decompress, &decompress_buffer); 386 387 - var json_reader: json.Reader = .init(client.allocator, decompressed_body_reader); 388 defer json_reader.deinit(); 389 390 const result = json.parseFromTokenSource(T, client.allocator, &json_reader, .{ 391 .ignore_unknown_fields = true, 392 }) catch |err| { 393 - log.err("Error parsing response: {}", .{err}); 394 - 395 return RequestError.InvalidResponse; 396 }; 397
··· 3 const Io = std.Io; 4 const json = std.json; 5 6 + const buildin = @import("builtin"); 7 const models = @import("models.zig"); 8 9 const log = std.log.scoped(.SpaceTraders); 10 ··· 306 ); 307 } 308 309 + const user_agent = blk: { 310 + const os = std.fmt.comptimePrint("{}", .{buildin.os.tag})[1..]; 311 + const arch = std.fmt.comptimePrint("{}", .{buildin.cpu.arch})[1..]; 312 + break :blk "space/0.1 (" ++ buildin.zig_version_string ++ "/" ++ os ++ "/" ++ arch ++ "; https://tangled.org/altagos.dev/space; +agent)"; 313 + }; 314 + 315 pub fn requestRaw( 316 client: *Client, 317 comptime T: type, ··· 326 var req = try client.http.request(opts.method, uri, .{ 327 .headers = .{ 328 .authorization = opts.authorization(client), 329 + .user_agent = .{ .override = user_agent }, 330 .content_type = .{ .override = "application/json" }, 331 }, 332 }); ··· 371 client.average_latency.store(new_average, .seq_cst); 372 _ = client.total_latency.fetchAdd(latency, .seq_cst); 373 374 log.debug( 375 + "\x1b[2m[latency = {d}ms path = {s}]\x1b[0m received {s}{d} {s}\x1b[0m", 376 + .{ latency, url[client.base_url.len..], colour, response.head.status, response.head.reason }, 377 ); 378 379 // var header_iter = response.head.iterateHeaders(); ··· 385 var transfer_buffer: [64]u8 = undefined; 386 var decompress: std.http.Decompress = undefined; 387 388 + const decompressed_body_reader = response.readerDecompressing( 389 + &transfer_buffer, 390 + &decompress, 391 + &decompress_buffer, 392 + ); 393 394 + const body = decompressed_body_reader.allocRemaining(client.allocator, .unlimited) catch 395 + return RequestError.OutOfMemory; 396 + defer client.allocator.free(body); 397 + 398 + var reader: Io.Reader = .fixed(body); 399 + var json_reader: json.Reader = .init(client.allocator, &reader); 400 defer json_reader.deinit(); 401 402 const result = json.parseFromTokenSource(T, client.allocator, &json_reader, .{ 403 .ignore_unknown_fields = true, 404 }) catch |err| { 405 + log.err("Error parsing response: {} - Body:\n{s}", .{ err, body }); 406 return RequestError.InvalidResponse; 407 }; 408