|
902 | 902 | end |
903 | 903 | end |
904 | 904 |
|
| 905 | +@testset "HTTP server stream handlers keep an explicit Content-Length for HEAD and 304" begin |
| 906 | + server = HT.listen!("127.0.0.1", 0; listenany = true) do stream |
| 907 | + request = HT.startread(stream) |
| 908 | + HT.setheader(stream, "Content-Length" => "12345") |
| 909 | + if request.target == "/nocontent" |
| 910 | + HT.setstatus(stream, 204) |
| 911 | + elseif request.target == "/notmodified" |
| 912 | + HT.setstatus(stream, 304) |
| 913 | + else |
| 914 | + HT.setstatus(stream, 200) |
| 915 | + end |
| 916 | + HT.startwrite(stream) |
| 917 | + return nothing |
| 918 | + end |
| 919 | + address = HT.server_addr(server) |
| 920 | + try |
| 921 | + head_raw = _raw_http_request(HT.port(server), "HEAD /head HTTP/1.1\r\nHost: $(address)\r\nConnection: close\r\n\r\n") |
| 922 | + @test occursin("HTTP/1.1 200 OK", head_raw) |
| 923 | + @test occursin("Content-Length: 12345\r\n", head_raw) |
| 924 | + head_parts = split(head_raw, "\r\n\r\n"; limit = 2) |
| 925 | + @test length(head_parts) == 2 |
| 926 | + @test head_parts[2] == "" |
| 927 | + |
| 928 | + not_modified_raw = _raw_http_request(HT.port(server), "GET /notmodified HTTP/1.1\r\nHost: $(address)\r\nConnection: close\r\n\r\n") |
| 929 | + @test occursin("HTTP/1.1 304 Not Modified", not_modified_raw) |
| 930 | + @test occursin("Content-Length: 12345\r\n", not_modified_raw) |
| 931 | + not_modified_parts = split(not_modified_raw, "\r\n\r\n"; limit = 2) |
| 932 | + @test length(not_modified_parts) == 2 |
| 933 | + @test not_modified_parts[2] == "" |
| 934 | + |
| 935 | + no_content_raw = _raw_http_request(HT.port(server), "GET /nocontent HTTP/1.1\r\nHost: $(address)\r\nConnection: close\r\n\r\n") |
| 936 | + @test occursin("HTTP/1.1 204 No Content", no_content_raw) |
| 937 | + @test !occursin("content-length", lowercase(no_content_raw)) |
| 938 | + finally |
| 939 | + _run_test_operation(() -> HT.forceclose(server)) |
| 940 | + _run_test_operation(() -> wait(server)) |
| 941 | + end |
| 942 | +end |
| 943 | + |
905 | 944 | @testset "HTTP server timeout and handler error responses" begin |
906 | 945 | timeout_server = HT.Server( |
907 | 946 | address = "127.0.0.1:0", |
@@ -1090,6 +1129,25 @@ end |
1090 | 1129 | end |
1091 | 1130 | end |
1092 | 1131 |
|
| 1132 | +@testset "HTTP server ordinary handlers keep an explicit Content-Length for 304" begin |
| 1133 | + server = HT.serve!("127.0.0.1", 0; listenany = true) do request |
| 1134 | + return HT.Response(304; headers = ["Content-Length" => "12345"], request = request) |
| 1135 | + end |
| 1136 | + address = HT.server_addr(server) |
| 1137 | + try |
| 1138 | + raw = _raw_http_request(HT.port(server), "GET /notmodified HTTP/1.1\r\nHost: $(address)\r\nConnection: close\r\n\r\n") |
| 1139 | + @test occursin("HTTP/1.1 304 Not Modified", raw) |
| 1140 | + @test occursin("Content-Length: 12345\r\n", raw) |
| 1141 | + @test !occursin("transfer-encoding", lowercase(raw)) |
| 1142 | + parts = split(raw, "\r\n\r\n"; limit = 2) |
| 1143 | + @test length(parts) == 2 |
| 1144 | + @test parts[2] == "" |
| 1145 | + finally |
| 1146 | + _run_test_operation(() -> HT.forceclose(server)) |
| 1147 | + _run_test_operation(() -> wait(server)) |
| 1148 | + end |
| 1149 | +end |
| 1150 | + |
1093 | 1151 | @testset "HTTP server ordinary handlers receive buffered request bodies" begin |
1094 | 1152 | @test HT.Server(handler = _ -> HT.Response(200), max_body_bytes = 0).max_body_bytes == 0 |
1095 | 1153 | @test_throws ArgumentError HT.Server(handler = _ -> HT.Response(200), max_body_bytes = -1) |
|
0 commit comments