mtakuya's blog

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さんに添削していただいたので参考にして修正してみました。
ローカルだと指摘していただいたやり方ではwhileの中でbreakしなかったので、ここを参考にさせてもらって下記のようになった。

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;
        }
    }
}
Created: 2022-7-29
Updated: 2022-7-30