📚

【Zig】TCP クライアントで HTTP/2 フレームを送信する

2024/10/19に公開

まず nghttpd で TLS なしの HTTP/2 サーバーを起動させる

/usr/sbin/nghttpd 8000 --no-tls -v -d ./web

次のようなクライアントを用意する。ループの停止条件は手抜きして応答の ACK フレームが来たときとしている。

const std = @import("std");
const net = std.net;
const print = std.debug.print;
const h2 = @import("h2frames.zig");
// https://gist.github.com/masakielastic/6b77b78079f7a980eb5ccdf533ca7b1f

pub fn main() !void {
    const port = try std.fmt.parseInt(u16, "8000", 10);
    const peer = try net.Address.parseIp4("127.0.0.1", port);
    const stream = try net.tcpConnectToAddress(peer);
    defer stream.close();

    var writer = stream.writer();
    var reader = stream.reader();

    _ = try writer.write(h2.h2frames());

    while (true) {
       var buffer: [1024]u8 = undefined;
       const size = try reader.read(&buffer);
       print("{s}\n", .{std.fmt.fmtSliceHexLower(buffer[0..size])});

       if (buffer[4] == 1) {
           break;
       }
    }
}

Discussion