Function fetch [src]
Perform a one-shot HTTP request with the provided options.
This function is threadsafe.
Prototype
pub fn fetch(client: *Client, options: FetchOptions) !FetchResult
Parameters
client: *Client
options: FetchOptions
Source
pub fn fetch(client: *Client, options: FetchOptions) !FetchResult {
const uri = switch (options.location) {
.url => |u| try Uri.parse(u),
.uri => |u| u,
};
var server_header_buffer: [16 * 1024]u8 = undefined;
const method: http.Method = options.method orelse
if (options.payload != null) .POST else .GET;
var req = try open(client, method, uri, .{
.server_header_buffer = options.server_header_buffer orelse &server_header_buffer,
.redirect_behavior = options.redirect_behavior orelse
if (options.payload == null) @enumFromInt(3) else .unhandled,
.headers = options.headers,
.extra_headers = options.extra_headers,
.privileged_headers = options.privileged_headers,
.keep_alive = options.keep_alive,
});
defer req.deinit();
if (options.payload) |payload| req.transfer_encoding = .{ .content_length = payload.len };
try req.send();
if (options.payload) |payload| try req.writeAll(payload);
try req.finish();
try req.wait();
switch (options.response_storage) {
.ignore => {
// Take advantage of request internals to discard the response body
// and make the connection available for another request.
req.response.skip = true;
assert(try req.transferRead(&.{}) == 0); // No buffer is necessary when skipping.
},
.dynamic => |list| {
const max_append_size = options.max_append_size orelse 2 * 1024 * 1024;
try req.reader().readAllArrayList(list, max_append_size);
},
.static => |list| {
const buf = b: {
const buf = list.unusedCapacitySlice();
if (options.max_append_size) |len| {
if (len < buf.len) break :b buf[0..len];
}
break :b buf;
};
list.items.len += try req.reader().readAll(buf);
},
}
return .{
.status = req.response.status,
};
}