| ... | ... | @@ -1063,3 +1063,77 @@ fn createTestServer(S: type) !*TestServer { |
| 1063 | 1063 | test_server.server_thread = try std.Thread.spawn(.{}, S.run, .{&test_server.net_server}); |
| 1064 | 1064 | return test_server; |
| 1065 | 1065 | } |
| 1066 | |
| 1067 | test "redirect to different connection" { |
| 1068 | const test_server_new = try createTestServer(struct { |
| 1069 | fn run(net_server: *std.net.Server) anyerror!void { |
| 1070 | var header_buffer: [888]u8 = undefined; |
| 1071 | |
| 1072 | const conn = try net_server.accept(); |
| 1073 | defer conn.stream.close(); |
| 1074 | |
| 1075 | var server = http.Server.init(conn, &header_buffer); |
| 1076 | var request = try server.receiveHead(); |
| 1077 | try expectEqualStrings(request.head.target, "/ok"); |
| 1078 | try request.respond("good job, you pass", .{}); |
| 1079 | } |
| 1080 | }); |
| 1081 | defer test_server_new.destroy(); |
| 1082 | |
| 1083 | const global = struct { |
| 1084 | var other_port: ?u16 = null; |
| 1085 | }; |
| 1086 | global.other_port = test_server_new.port(); |
| 1087 | |
| 1088 | const test_server_orig = try createTestServer(struct { |
| 1089 | fn run(net_server: *std.net.Server) anyerror!void { |
| 1090 | var header_buffer: [999]u8 = undefined; |
| 1091 | var send_buffer: [100]u8 = undefined; |
| 1092 | |
| 1093 | const conn = try net_server.accept(); |
| 1094 | defer conn.stream.close(); |
| 1095 | |
| 1096 | const new_loc = try std.fmt.bufPrint(&send_buffer, "http://127.0.0.1:{d}/ok", .{ |
| 1097 | global.other_port.?, |
| 1098 | }); |
| 1099 | |
| 1100 | var server = http.Server.init(conn, &header_buffer); |
| 1101 | var request = try server.receiveHead(); |
| 1102 | try expectEqualStrings(request.head.target, "/help"); |
| 1103 | try request.respond("", .{ |
| 1104 | .status = .found, |
| 1105 | .extra_headers = &.{ |
| 1106 | .{ .name = "location", .value = new_loc }, |
| 1107 | }, |
| 1108 | }); |
| 1109 | } |
| 1110 | }); |
| 1111 | defer test_server_orig.destroy(); |
| 1112 | |
| 1113 | const gpa = std.testing.allocator; |
| 1114 | |
| 1115 | var client: http.Client = .{ .allocator = gpa }; |
| 1116 | defer client.deinit(); |
| 1117 | |
| 1118 | var loc_buf: [100]u8 = undefined; |
| 1119 | const location = try std.fmt.bufPrint(&loc_buf, "http://127.0.0.1:{d}/help", .{ |
| 1120 | test_server_orig.port(), |
| 1121 | }); |
| 1122 | const uri = try std.Uri.parse(location); |
| 1123 | |
| 1124 | { |
| 1125 | var server_header_buffer: [666]u8 = undefined; |
| 1126 | var req = try client.open(.GET, uri, .{ |
| 1127 | .server_header_buffer = &server_header_buffer, |
| 1128 | }); |
| 1129 | defer req.deinit(); |
| 1130 | |
| 1131 | try req.send(.{}); |
| 1132 | try req.wait(); |
| 1133 | |
| 1134 | const body = try req.reader().readAllAlloc(gpa, 8192); |
| 1135 | defer gpa.free(body); |
| 1136 | |
| 1137 | try expectEqualStrings("good job, you pass", body); |
| 1138 | } |
| 1139 | } |