-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathheader.zig
More file actions
84 lines (70 loc) · 2.75 KB
/
Copy pathheader.zig
File metadata and controls
84 lines (70 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const std = @import("std");
const curl = @import("curl");
const Easy = curl.Easy;
const println = @import("util.zig").println;
fn iterateHeaders(easy: *Easy) !void {
// Reset old options, e.g. headers.
easy.reset();
const resp = try easy.fetch("https://edgebin.liujiacai.net/response-headers?X-Foo=1&X-Foo=2&X-Foo=3", .{});
std.debug.print("Iterating all headers...\n", .{});
{
var iter = try resp.iterateHeaders(.{});
while (try iter.next()) |header| {
std.debug.print(" {s}: {s}\n", .{ header.name, header.get() });
}
}
// Iterating X-Foo only
{
var iter = try resp.iterateHeaders(.{ .name = "X-Foo" });
const expected_values = .{ "1", "2", "3" };
inline for (expected_values) |expected| {
const header = try iter.next() orelse unreachable;
try std.testing.expectEqualStrings(header.get(), expected);
}
try std.testing.expect((try iter.next()) == null);
}
}
fn iterateRedirectedHeaders(easy: *Easy) !void {
try easy.setFollowLocation(true);
const resp = try easy.fetch("https://edgebin.liujiacai.net/redirect/2", .{});
var diagnostics: curl.Diagnostics = .{};
const redirects = try resp.getRedirectCount(&diagnostics);
try std.testing.expectEqual(redirects, 2);
for (0..redirects + 1) |i| {
std.debug.print("Request #{} headers:\n", .{i});
var iter = try resp.iterateHeaders(.{ .request = i });
while (try iter.next()) |header| {
std.debug.print(" {s}: {s}\n", .{ header.name, header.get() });
}
}
// Iterating content-type only
const expected_values = [_][]const u8{ "/redirect/1", "/get" };
var count: usize = 0;
for (0..redirects + 1) |i| {
var iter = try resp.iterateHeaders(.{ .request = i, .name = "Location" });
while (try iter.next()) |header| {
try std.testing.expectEqualStrings(header.get(), expected_values[count]);
count += 1;
}
}
try std.testing.expectEqual(count, 2);
}
pub fn main(init: std.process.Init) !void {
var gpa = std.heap.DebugAllocator(.{}){};
defer if (gpa.deinit() != .ok) @panic("leak");
const allocator = gpa.allocator();
const ca_bundle = try curl.allocCABundle(allocator, init.io);
defer ca_bundle.deinit();
var easy = try Easy.init(.{ .ca_bundle = ca_bundle });
defer easy.deinit();
if (comptime !curl.hasParseHeaderSupport()) {
std.debug.print("Libcurl version too old, don't support parse headers.\n", .{});
return;
}
println("Iterate headers demo");
try iterateHeaders(&easy);
// Reset old options, e.g. headers.
easy.reset();
println("Redirected headers demo");
try iterateRedirectedHeaders(&easy);
}