Remove OG zig code (unneeded for now)
This commit is contained in:
parent
f5c55ef8c8
commit
e270017c86
3 changed files with 0 additions and 212 deletions
28
src/env.zig
28
src/env.zig
|
|
@ -1,28 +0,0 @@
|
|||
const std = @import("std");
|
||||
|
||||
pub const Env = struct {
|
||||
github_token: ?[]const u8,
|
||||
pub fn init(env_map: *const std.process.Environ.Map) !Env {
|
||||
const github_token = env_map.get("GITHUB_TOKEN") orelse null;
|
||||
return .{ .github_token = github_token };
|
||||
}
|
||||
};
|
||||
|
||||
test "Validate that missing github token is null" {
|
||||
const allocator = std.testing.allocator;
|
||||
var env_map = std.process.Environ.Map.init(allocator);
|
||||
defer env_map.deinit();
|
||||
|
||||
const env: Env = try .init(&env_map);
|
||||
try std.testing.expect(env.github_token == null);
|
||||
}
|
||||
|
||||
test "Validate that present github token isn't null" {
|
||||
const allocator = std.testing.allocator;
|
||||
var env_map = std.process.Environ.Map.init(allocator);
|
||||
try env_map.put("GITHUB_TOKEN", "some_token");
|
||||
defer env_map.deinit();
|
||||
|
||||
const env: Env = try .init(&env_map);
|
||||
try std.testing.expect(std.mem.eql(u8, env.github_token.?, "some_token"));
|
||||
}
|
||||
|
|
@ -1,155 +0,0 @@
|
|||
const std = @import("std");
|
||||
|
||||
const HttpError = error{UnexpectedStatus};
|
||||
pub const HttpClientWrapper = @This();
|
||||
|
||||
client: std.http.Client,
|
||||
|
||||
const ResponseOptions = struct {
|
||||
token: ?[]const u8 = null,
|
||||
extra_headers: []const std.http.Header = &.{},
|
||||
};
|
||||
|
||||
// The caller is in charge of freeing the memory
|
||||
pub fn makeAuthorizationHeaderFromToken(allocator: std.mem.Allocator, token: []const u8) ![]u8 {
|
||||
return try std.fmt.allocPrint(allocator, "Authorization: Bearer {s}", .{token});
|
||||
}
|
||||
|
||||
// Get raw response
|
||||
pub fn getRawResponse(
|
||||
client_wrapper: *HttpClientWrapper,
|
||||
allocator: std.mem.Allocator,
|
||||
url: []const u8,
|
||||
response_options: ResponseOptions,
|
||||
) ![]u8 {
|
||||
var auth_header: []u8 = undefined;
|
||||
|
||||
defer allocator.free(auth_header);
|
||||
if (response_options.token) |token| {
|
||||
auth_header = try makeAuthorizationHeaderFromToken(allocator, token);
|
||||
} else {
|
||||
auth_header = "";
|
||||
}
|
||||
|
||||
//Get the endpoint
|
||||
const endpoint = try std.Uri.parse(url);
|
||||
var request = try client_wrapper.client.request(.GET, endpoint, .{
|
||||
.headers = .{ .authorization = .{ .override = auth_header } },
|
||||
.extra_headers = response_options.extra_headers,
|
||||
});
|
||||
|
||||
defer request.deinit();
|
||||
|
||||
try request.sendBodiless();
|
||||
var response = try request.receiveHead(&.{});
|
||||
|
||||
var transfer_buffer: [64]u8 = undefined;
|
||||
var decompress: std.http.Decompress = undefined;
|
||||
var decompress_buffer: [std.compress.flate.max_window_len]u8 = undefined;
|
||||
const response_reader = response.readerDecompressing(
|
||||
transfer_buffer[0..],
|
||||
&decompress,
|
||||
decompress_buffer[0..],
|
||||
);
|
||||
|
||||
if (response.head.status.class() != .success) {
|
||||
return HttpError.UnexpectedStatus;
|
||||
}
|
||||
|
||||
return response_reader.allocRemaining(allocator, .unlimited);
|
||||
}
|
||||
|
||||
pub fn getResponse(
|
||||
client_wrapper: *HttpClientWrapper,
|
||||
comptime T: type,
|
||||
allocator: std.mem.Allocator,
|
||||
url: []const u8,
|
||||
) !std.json.Parsed(T) {
|
||||
//Get the endpoint
|
||||
const endpoint = try std.Uri.parse(url);
|
||||
var request = try client_wrapper.client.request(.GET, endpoint, .{});
|
||||
defer request.deinit();
|
||||
|
||||
try request.sendBodiless();
|
||||
var response = try request.receiveHead(&.{});
|
||||
|
||||
var transfer_buffer: [64]u8 = undefined;
|
||||
var decompress: std.http.Decompress = undefined;
|
||||
var decompress_buffer: [std.compress.flate.max_window_len]u8 = undefined;
|
||||
const response_reader = response.readerDecompressing(
|
||||
transfer_buffer[0..],
|
||||
&decompress,
|
||||
decompress_buffer[0..],
|
||||
);
|
||||
|
||||
if (response.head.status.class() != .success) {
|
||||
return HttpError.UnexpectedStatus;
|
||||
}
|
||||
|
||||
var json_reader: std.json.Reader = .init(allocator, response_reader);
|
||||
defer json_reader.deinit();
|
||||
|
||||
const parsed: std.json.Parsed(T) = try std.json.parseFromTokenSource(
|
||||
T,
|
||||
allocator,
|
||||
&json_reader,
|
||||
.{
|
||||
.ignore_unknown_fields = true,
|
||||
.allocate = .alloc_always,
|
||||
},
|
||||
);
|
||||
return parsed;
|
||||
}
|
||||
|
||||
pub fn deinit(client_wrapper: *HttpClientWrapper) void {
|
||||
client_wrapper.client.deinit();
|
||||
}
|
||||
|
||||
// Tests
|
||||
|
||||
test "makeAuthorizationHeader makes the right header" {
|
||||
const token = "Some Bearer Token";
|
||||
const allocator = std.testing.allocator;
|
||||
|
||||
const header = try makeAuthorizationHeaderFromToken(allocator, token);
|
||||
defer allocator.free(header);
|
||||
|
||||
try std.testing.expect(std.mem.eql(u8, header, "Authorization: Bearer Some Bearer Token"));
|
||||
}
|
||||
|
||||
test "Test getResponse" {
|
||||
const io = std.Io.Threaded.global_single_threaded.io();
|
||||
const allocator = std.testing.allocator;
|
||||
|
||||
const HelloMessage = struct { message: []u8 };
|
||||
|
||||
const http_client: std.http.Client = .{ .allocator = allocator, .io = io };
|
||||
var test_client: HttpClientWrapper = .{ .client = http_client };
|
||||
defer test_client.deinit();
|
||||
|
||||
const parsed = try test_client.getResponse(
|
||||
HelloMessage,
|
||||
allocator,
|
||||
"http://localhost:8080/hello",
|
||||
);
|
||||
defer parsed.deinit();
|
||||
try std.testing.expect(std.mem.eql(u8, parsed.value.message, "hello"));
|
||||
}
|
||||
|
||||
test "Test getRawResponse" {
|
||||
const io = std.Io.Threaded.global_single_threaded.io();
|
||||
const allocator = std.testing.allocator;
|
||||
|
||||
const http_client: std.http.Client = .{ .allocator = allocator, .io = io };
|
||||
var test_client: HttpClientWrapper = .{ .client = http_client };
|
||||
defer test_client.deinit();
|
||||
|
||||
const response = try test_client.getRawResponse(
|
||||
allocator,
|
||||
"http://localhost:8080/hello-raw",
|
||||
.{},
|
||||
);
|
||||
defer allocator.free(response);
|
||||
|
||||
try std.testing.expect(std.mem.eql(u8, response, "hello\n"));
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
const env_config = @import("env.zig");
|
||||
const http_utils = @import("http_utils/http_client_wrapper.zig");
|
||||
const std = @import("std");
|
||||
|
||||
test "Test get github file contents passing authorization and content-type" {
|
||||
const io = std.Io.Threaded.global_single_threaded.io();
|
||||
const allocator = std.testing.allocator;
|
||||
|
||||
const http_client: std.http.Client = .{ .allocator = allocator, .io = io };
|
||||
var test_client: http_utils.HttpClientWrapper = .{ .client = http_client };
|
||||
defer test_client.deinit();
|
||||
|
||||
var env_map = try std.process.Environ.createMap(std.testing.environ, allocator);
|
||||
defer env_map.deinit();
|
||||
const env: env_config.Env = try .init(&env_map);
|
||||
|
||||
const extra_headers: []const std.http.Header = &.{
|
||||
.{ .name = "Accept", .value = "application/vnd.github.raw+json" },
|
||||
.{ .name = "X-GitHub-Api-Version", .value = "2026-03-10" },
|
||||
};
|
||||
const response = try test_client.getRawResponse(
|
||||
allocator,
|
||||
"https://api.github.com/repos/aselimov/upvoters/contents/README.md",
|
||||
.{ .token = env.github_token, .extra_headers = extra_headers },
|
||||
);
|
||||
defer allocator.free(response);
|
||||
|
||||
try std.testing.expect(std.mem.containsAtLeast(u8, response, 1, "upvoters"));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue