mtakuya's blog

2022-07-29
ZigでHTTPクライアントの作成


HTTPクライアントの作成(TCPクライアントサンプル) を参考にZigでインチキHTTPクライアントを作成してみた。 Zig初心者なので添削して欲しい。

zig version 0.10.0-dev.3361+c650ccfca

const std = @import("std");
const print = std.debug.print;
const net = std.net;

pub fn main() !void {
    var buffer: [1024]u8 = undefined;
    const allocator = std.heap.FixedBufferAllocator.init(&buffer).allocator();
    const socket = try net.tcpConnectToHost(allocator, "www.google.com", 80);
    defer socket.close();
    
        var response_buffer: [1024]u8 = undefined;
        _ = try socket.write("GET / HTTP/1.1\r\n");
        _ = try socket.write("\r\n");
    
        const len = try socket.read(&response_buffer);
        const response = response_buffer[0..len];
        print("{s}\n", .{response});
}

ありがたいことに、mattnさんに添削していただいたので参考にして修正してみました。

const std = @import("std");
const net = std.net;
const mem = std.mem;

pub fn main() !void {
    var buffer: [1024]u8 = undefined;
    const allocator = std.heap.FixedBufferAllocator.init(&buffer).allocator();
    const socket = try net.tcpConnectToHost(allocator, "www.google.com", 80);
    defer socket.close();
    var response_buffer: [1024]u8 = undefined;
    var writer = std.io.getStdOut().writer();
    _ = try socket.write("GET / HTTP/1.1\r\n");
    _ = try socket.write("HOST: www.google.com\r\n");
    _ = try socket.write("\r\n");
    
    while(true) {
        const len = try socket.read(&response_buffer);
        const response = response_buffer[0..len];
        try writer.writeAll(response);
        if (mem.endsWith(u8, response_buffer[0..len], "0\r\n\r\n")) {
            break;
        }
    }
}