OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_stream_parser.h" | 5 #include "net/http/http_stream_parser.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <string> | 10 #include <string> |
(...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 TEST(HttpStreamParser, ReceivedBytesNormal) { | 1028 TEST(HttpStreamParser, ReceivedBytesNormal) { |
1029 std::string headers = "HTTP/1.1 200 OK\r\n" | 1029 std::string headers = "HTTP/1.1 200 OK\r\n" |
1030 "Content-Length: 7\r\n\r\n"; | 1030 "Content-Length: 7\r\n\r\n"; |
1031 std::string body = "content"; | 1031 std::string body = "content"; |
1032 std::string response = headers + body; | 1032 std::string response = headers + body; |
1033 | 1033 |
1034 SimpleGetRunner get_runner; | 1034 SimpleGetRunner get_runner; |
1035 get_runner.AddRead(response); | 1035 get_runner.AddRead(response); |
1036 get_runner.SetupParserAndSendRequest(); | 1036 get_runner.SetupParserAndSendRequest(); |
1037 get_runner.ReadHeaders(); | 1037 get_runner.ReadHeaders(); |
1038 int64 headers_size = headers.size(); | 1038 int64_t headers_size = headers.size(); |
1039 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1039 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1040 int body_size = body.size(); | 1040 int body_size = body.size(); |
1041 int read_lengths[] = {body_size, 0}; | 1041 int read_lengths[] = {body_size, 0}; |
1042 get_runner.ReadBody(body_size, read_lengths); | 1042 get_runner.ReadBody(body_size, read_lengths); |
1043 int64 response_size = response.size(); | 1043 int64_t response_size = response.size(); |
1044 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1044 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1045 } | 1045 } |
1046 | 1046 |
1047 // Test that bytes that represent "next" response are not counted | 1047 // Test that bytes that represent "next" response are not counted |
1048 // as current response "received_bytes". | 1048 // as current response "received_bytes". |
1049 TEST(HttpStreamParser, ReceivedBytesExcludesNextResponse) { | 1049 TEST(HttpStreamParser, ReceivedBytesExcludesNextResponse) { |
1050 std::string headers = "HTTP/1.1 200 OK\r\n" | 1050 std::string headers = "HTTP/1.1 200 OK\r\n" |
1051 "Content-Length: 8\r\n\r\n"; | 1051 "Content-Length: 8\r\n\r\n"; |
1052 std::string body = "content8"; | 1052 std::string body = "content8"; |
1053 std::string response = headers + body; | 1053 std::string response = headers + body; |
1054 std::string next_response = "HTTP/1.1 200 OK\r\n\r\nFOO"; | 1054 std::string next_response = "HTTP/1.1 200 OK\r\n\r\nFOO"; |
1055 std::string data = response + next_response; | 1055 std::string data = response + next_response; |
1056 | 1056 |
1057 SimpleGetRunner get_runner; | 1057 SimpleGetRunner get_runner; |
1058 get_runner.AddRead(data); | 1058 get_runner.AddRead(data); |
1059 get_runner.SetupParserAndSendRequest(); | 1059 get_runner.SetupParserAndSendRequest(); |
1060 get_runner.ReadHeaders(); | 1060 get_runner.ReadHeaders(); |
1061 EXPECT_EQ(39, get_runner.parser()->received_bytes()); | 1061 EXPECT_EQ(39, get_runner.parser()->received_bytes()); |
1062 int64 headers_size = headers.size(); | 1062 int64_t headers_size = headers.size(); |
1063 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1063 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1064 int body_size = body.size(); | 1064 int body_size = body.size(); |
1065 int read_lengths[] = {body_size, 0}; | 1065 int read_lengths[] = {body_size, 0}; |
1066 get_runner.ReadBody(body_size, read_lengths); | 1066 get_runner.ReadBody(body_size, read_lengths); |
1067 int64 response_size = response.size(); | 1067 int64_t response_size = response.size(); |
1068 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1068 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1069 int64 next_response_size = next_response.size(); | 1069 int64_t next_response_size = next_response.size(); |
1070 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); | 1070 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); |
1071 } | 1071 } |
1072 | 1072 |
1073 // Test that "received_bytes" calculation works fine when last read | 1073 // Test that "received_bytes" calculation works fine when last read |
1074 // contains more data than requested by user. | 1074 // contains more data than requested by user. |
1075 // We send data in two reads: | 1075 // We send data in two reads: |
1076 // 1) Headers + beginning of response | 1076 // 1) Headers + beginning of response |
1077 // 2) remaining part of response + next response start | 1077 // 2) remaining part of response + next response start |
1078 // We setup user read buffer so it fully accepts the beginnig of response | 1078 // We setup user read buffer so it fully accepts the beginnig of response |
1079 // body, but it is larger that remaining part of body. | 1079 // body, but it is larger that remaining part of body. |
1080 TEST(HttpStreamParser, ReceivedBytesMultiReadExcludesNextResponse) { | 1080 TEST(HttpStreamParser, ReceivedBytesMultiReadExcludesNextResponse) { |
1081 std::string headers = "HTTP/1.1 200 OK\r\n" | 1081 std::string headers = "HTTP/1.1 200 OK\r\n" |
1082 "Content-Length: 36\r\n\r\n"; | 1082 "Content-Length: 36\r\n\r\n"; |
1083 int64 user_buf_len = 32; | 1083 int64_t user_buf_len = 32; |
1084 std::string body_start = std::string(user_buf_len, '#'); | 1084 std::string body_start = std::string(user_buf_len, '#'); |
1085 int body_start_size = body_start.size(); | 1085 int body_start_size = body_start.size(); |
1086 EXPECT_EQ(user_buf_len, body_start_size); | 1086 EXPECT_EQ(user_buf_len, body_start_size); |
1087 std::string response_start = headers + body_start; | 1087 std::string response_start = headers + body_start; |
1088 std::string body_end = "abcd"; | 1088 std::string body_end = "abcd"; |
1089 std::string next_response = "HTTP/1.1 200 OK\r\n\r\nFOO"; | 1089 std::string next_response = "HTTP/1.1 200 OK\r\n\r\nFOO"; |
1090 std::string response_end = body_end + next_response; | 1090 std::string response_end = body_end + next_response; |
1091 | 1091 |
1092 SimpleGetRunner get_runner; | 1092 SimpleGetRunner get_runner; |
1093 get_runner.AddRead(response_start); | 1093 get_runner.AddRead(response_start); |
1094 get_runner.AddRead(response_end); | 1094 get_runner.AddRead(response_end); |
1095 get_runner.SetupParserAndSendRequest(); | 1095 get_runner.SetupParserAndSendRequest(); |
1096 get_runner.ReadHeaders(); | 1096 get_runner.ReadHeaders(); |
1097 int64 headers_size = headers.size(); | 1097 int64_t headers_size = headers.size(); |
1098 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1098 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1099 int body_end_size = body_end.size(); | 1099 int body_end_size = body_end.size(); |
1100 int read_lengths[] = {body_start_size, body_end_size, 0}; | 1100 int read_lengths[] = {body_start_size, body_end_size, 0}; |
1101 get_runner.ReadBody(body_start_size, read_lengths); | 1101 get_runner.ReadBody(body_start_size, read_lengths); |
1102 int64 response_size = response_start.size() + body_end_size; | 1102 int64_t response_size = response_start.size() + body_end_size; |
1103 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1103 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1104 int64 next_response_size = next_response.size(); | 1104 int64_t next_response_size = next_response.size(); |
1105 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); | 1105 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); |
1106 } | 1106 } |
1107 | 1107 |
1108 // Test that "received_bytes" calculation works fine when there is no | 1108 // Test that "received_bytes" calculation works fine when there is no |
1109 // network activity at all; that is when all data is read from read buffer. | 1109 // network activity at all; that is when all data is read from read buffer. |
1110 // In this case read buffer contains two responses. We expect that only | 1110 // In this case read buffer contains two responses. We expect that only |
1111 // bytes that correspond to the first one are taken into account. | 1111 // bytes that correspond to the first one are taken into account. |
1112 TEST(HttpStreamParser, ReceivedBytesFromReadBufExcludesNextResponse) { | 1112 TEST(HttpStreamParser, ReceivedBytesFromReadBufExcludesNextResponse) { |
1113 std::string headers = "HTTP/1.1 200 OK\r\n" | 1113 std::string headers = "HTTP/1.1 200 OK\r\n" |
1114 "Content-Length: 7\r\n\r\n"; | 1114 "Content-Length: 7\r\n\r\n"; |
1115 std::string body = "content"; | 1115 std::string body = "content"; |
1116 std::string response = headers + body; | 1116 std::string response = headers + body; |
1117 std::string next_response = "HTTP/1.1 200 OK\r\n\r\nFOO"; | 1117 std::string next_response = "HTTP/1.1 200 OK\r\n\r\nFOO"; |
1118 std::string data = response + next_response; | 1118 std::string data = response + next_response; |
1119 | 1119 |
1120 SimpleGetRunner get_runner; | 1120 SimpleGetRunner get_runner; |
1121 get_runner.AddInitialData(data); | 1121 get_runner.AddInitialData(data); |
1122 get_runner.SetupParserAndSendRequest(); | 1122 get_runner.SetupParserAndSendRequest(); |
1123 get_runner.ReadHeaders(); | 1123 get_runner.ReadHeaders(); |
1124 int64 headers_size = headers.size(); | 1124 int64_t headers_size = headers.size(); |
1125 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1125 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1126 int body_size = body.size(); | 1126 int body_size = body.size(); |
1127 int read_lengths[] = {body_size, 0}; | 1127 int read_lengths[] = {body_size, 0}; |
1128 get_runner.ReadBody(body_size, read_lengths); | 1128 get_runner.ReadBody(body_size, read_lengths); |
1129 int64 response_size = response.size(); | 1129 int64_t response_size = response.size(); |
1130 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1130 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1131 int64 next_response_size = next_response.size(); | 1131 int64_t next_response_size = next_response.size(); |
1132 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); | 1132 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); |
1133 } | 1133 } |
1134 | 1134 |
1135 // Test calculating "received_bytes" when part of request has been already | 1135 // Test calculating "received_bytes" when part of request has been already |
1136 // loaded and placed to read buffer by previous stream parser. | 1136 // loaded and placed to read buffer by previous stream parser. |
1137 TEST(HttpStreamParser, ReceivedBytesUseReadBuf) { | 1137 TEST(HttpStreamParser, ReceivedBytesUseReadBuf) { |
1138 std::string buffer = "HTTP/1.1 200 OK\r\n"; | 1138 std::string buffer = "HTTP/1.1 200 OK\r\n"; |
1139 std::string remaining_headers = "Content-Length: 7\r\n\r\n"; | 1139 std::string remaining_headers = "Content-Length: 7\r\n\r\n"; |
1140 int64 headers_size = buffer.size() + remaining_headers.size(); | 1140 int64_t headers_size = buffer.size() + remaining_headers.size(); |
1141 std::string body = "content"; | 1141 std::string body = "content"; |
1142 std::string response = remaining_headers + body; | 1142 std::string response = remaining_headers + body; |
1143 | 1143 |
1144 SimpleGetRunner get_runner; | 1144 SimpleGetRunner get_runner; |
1145 get_runner.AddInitialData(buffer); | 1145 get_runner.AddInitialData(buffer); |
1146 get_runner.AddRead(response); | 1146 get_runner.AddRead(response); |
1147 get_runner.SetupParserAndSendRequest(); | 1147 get_runner.SetupParserAndSendRequest(); |
1148 get_runner.ReadHeaders(); | 1148 get_runner.ReadHeaders(); |
1149 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1149 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1150 int body_size = body.size(); | 1150 int body_size = body.size(); |
(...skipping 14 matching lines...) Expand all Loading... |
1165 "0\r\n\r\n"; | 1165 "0\r\n\r\n"; |
1166 std::string next_response = "foo bar\r\n"; | 1166 std::string next_response = "foo bar\r\n"; |
1167 std::string data = response + next_response; | 1167 std::string data = response + next_response; |
1168 | 1168 |
1169 SimpleGetRunner get_runner; | 1169 SimpleGetRunner get_runner; |
1170 get_runner.AddInitialData(data); | 1170 get_runner.AddInitialData(data); |
1171 get_runner.SetupParserAndSendRequest(); | 1171 get_runner.SetupParserAndSendRequest(); |
1172 get_runner.ReadHeaders(); | 1172 get_runner.ReadHeaders(); |
1173 int read_lengths[] = {4, 3, 6, 2, 6, 0}; | 1173 int read_lengths[] = {4, 3, 6, 2, 6, 0}; |
1174 get_runner.ReadBody(7, read_lengths); | 1174 get_runner.ReadBody(7, read_lengths); |
1175 int64 response_size = response.size(); | 1175 int64_t response_size = response.size(); |
1176 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1176 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1177 int64 next_response_size = next_response.size(); | 1177 int64_t next_response_size = next_response.size(); |
1178 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); | 1178 EXPECT_EQ(next_response_size, get_runner.read_buffer()->offset()); |
1179 } | 1179 } |
1180 | 1180 |
1181 // Test that data transfered in multiple reads is correctly processed. | 1181 // Test that data transfered in multiple reads is correctly processed. |
1182 // We feed data into 4-bytes reads. Also we set length of read | 1182 // We feed data into 4-bytes reads. Also we set length of read |
1183 // buffer to 5-bytes to test all possible buffer misaligments. | 1183 // buffer to 5-bytes to test all possible buffer misaligments. |
1184 TEST(HttpStreamParser, ReceivedBytesMultipleReads) { | 1184 TEST(HttpStreamParser, ReceivedBytesMultipleReads) { |
1185 std::string headers = "HTTP/1.1 200 OK\r\n" | 1185 std::string headers = "HTTP/1.1 200 OK\r\n" |
1186 "Content-Length: 33\r\n\r\n"; | 1186 "Content-Length: 33\r\n\r\n"; |
1187 std::string body = "foo bar baz\r\n" | 1187 std::string body = "foo bar baz\r\n" |
1188 "sputnik mir babushka"; | 1188 "sputnik mir babushka"; |
1189 std::string response = headers + body; | 1189 std::string response = headers + body; |
1190 | 1190 |
1191 size_t receive_length = 4; | 1191 size_t receive_length = 4; |
1192 std::vector<std::string> blocks; | 1192 std::vector<std::string> blocks; |
1193 for (size_t i = 0; i < response.size(); i += receive_length) { | 1193 for (size_t i = 0; i < response.size(); i += receive_length) { |
1194 size_t length = std::min(receive_length, response.size() - i); | 1194 size_t length = std::min(receive_length, response.size() - i); |
1195 blocks.push_back(response.substr(i, length)); | 1195 blocks.push_back(response.substr(i, length)); |
1196 } | 1196 } |
1197 | 1197 |
1198 SimpleGetRunner get_runner; | 1198 SimpleGetRunner get_runner; |
1199 for (std::vector<std::string>::size_type i = 0; i < blocks.size(); ++i) | 1199 for (std::vector<std::string>::size_type i = 0; i < blocks.size(); ++i) |
1200 get_runner.AddRead(blocks[i]); | 1200 get_runner.AddRead(blocks[i]); |
1201 get_runner.SetupParserAndSendRequest(); | 1201 get_runner.SetupParserAndSendRequest(); |
1202 get_runner.ReadHeaders(); | 1202 get_runner.ReadHeaders(); |
1203 int64 headers_size = headers.size(); | 1203 int64_t headers_size = headers.size(); |
1204 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1204 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1205 int read_lengths[] = {1, 4, 4, 4, 4, 4, 4, 4, 4, 0}; | 1205 int read_lengths[] = {1, 4, 4, 4, 4, 4, 4, 4, 4, 0}; |
1206 get_runner.ReadBody(receive_length + 1, read_lengths); | 1206 get_runner.ReadBody(receive_length + 1, read_lengths); |
1207 int64 response_size = response.size(); | 1207 int64_t response_size = response.size(); |
1208 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1208 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1209 } | 1209 } |
1210 | 1210 |
1211 // Test that "continue" HTTP header is counted as "received_bytes". | 1211 // Test that "continue" HTTP header is counted as "received_bytes". |
1212 TEST(HttpStreamParser, ReceivedBytesIncludesContinueHeader) { | 1212 TEST(HttpStreamParser, ReceivedBytesIncludesContinueHeader) { |
1213 std::string status100 = "HTTP/1.1 100 OK\r\n\r\n"; | 1213 std::string status100 = "HTTP/1.1 100 OK\r\n\r\n"; |
1214 std::string headers = "HTTP/1.1 200 OK\r\n" | 1214 std::string headers = "HTTP/1.1 200 OK\r\n" |
1215 "Content-Length: 7\r\n\r\n"; | 1215 "Content-Length: 7\r\n\r\n"; |
1216 int64 headers_size = status100.size() + headers.size(); | 1216 int64_t headers_size = status100.size() + headers.size(); |
1217 std::string body = "content"; | 1217 std::string body = "content"; |
1218 std::string response = headers + body; | 1218 std::string response = headers + body; |
1219 | 1219 |
1220 SimpleGetRunner get_runner; | 1220 SimpleGetRunner get_runner; |
1221 get_runner.AddRead(status100); | 1221 get_runner.AddRead(status100); |
1222 get_runner.AddRead(response); | 1222 get_runner.AddRead(response); |
1223 get_runner.SetupParserAndSendRequest(); | 1223 get_runner.SetupParserAndSendRequest(); |
1224 get_runner.ReadHeaders(); | 1224 get_runner.ReadHeaders(); |
1225 EXPECT_EQ(100, get_runner.response_info()->headers->response_code()); | 1225 EXPECT_EQ(100, get_runner.response_info()->headers->response_code()); |
1226 int64 status100_size = status100.size(); | 1226 int64_t status100_size = status100.size(); |
1227 EXPECT_EQ(status100_size, get_runner.parser()->received_bytes()); | 1227 EXPECT_EQ(status100_size, get_runner.parser()->received_bytes()); |
1228 get_runner.ReadHeaders(); | 1228 get_runner.ReadHeaders(); |
1229 EXPECT_EQ(200, get_runner.response_info()->headers->response_code()); | 1229 EXPECT_EQ(200, get_runner.response_info()->headers->response_code()); |
1230 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); | 1230 EXPECT_EQ(headers_size, get_runner.parser()->received_bytes()); |
1231 int64 response_size = headers_size + body.size(); | 1231 int64_t response_size = headers_size + body.size(); |
1232 int body_size = body.size(); | 1232 int body_size = body.size(); |
1233 int read_lengths[] = {body_size, 0}; | 1233 int read_lengths[] = {body_size, 0}; |
1234 get_runner.ReadBody(body_size, read_lengths); | 1234 get_runner.ReadBody(body_size, read_lengths); |
1235 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); | 1235 EXPECT_EQ(response_size, get_runner.parser()->received_bytes()); |
1236 } | 1236 } |
1237 | 1237 |
1238 // Test that an HttpStreamParser can be read from after it's received headers | 1238 // Test that an HttpStreamParser can be read from after it's received headers |
1239 // and data structures owned by its owner have been deleted. This happens | 1239 // and data structures owned by its owner have been deleted. This happens |
1240 // when a ResponseBodyDrainer is used. | 1240 // when a ResponseBodyDrainer is used. |
1241 TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) { | 1241 TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 ASSERT_EQ(kBodySize, parser.ReadResponseBody( | 1282 ASSERT_EQ(kBodySize, parser.ReadResponseBody( |
1283 body_buffer.get(), kBodySize, callback.callback())); | 1283 body_buffer.get(), kBodySize, callback.callback())); |
1284 | 1284 |
1285 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); | 1285 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
1286 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), parser.received_bytes()); | 1286 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), parser.received_bytes()); |
1287 } | 1287 } |
1288 | 1288 |
1289 } // namespace | 1289 } // namespace |
1290 | 1290 |
1291 } // namespace net | 1291 } // namespace net |
OLD | NEW |