| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/spdy/spdy_stream.h" | 5 #include "net/spdy/spdy_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cstddef> | 10 #include <cstddef> |
| (...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1079 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 1079 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 1080 delegate.TakeReceivedData()); | 1080 delegate.TakeReceivedData()); |
| 1081 | 1081 |
| 1082 // Finish async network reads and writes. | 1082 // Finish async network reads and writes. |
| 1083 base::RunLoop().RunUntilIdle(); | 1083 base::RunLoop().RunUntilIdle(); |
| 1084 | 1084 |
| 1085 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1085 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1086 EXPECT_TRUE(data.AllReadDataConsumed()); | 1086 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 1087 } | 1087 } |
| 1088 | 1088 |
| 1089 TEST_F(SpdyStreamTest, StatusMustStartWithNumber) { | 1089 TEST_F(SpdyStreamTest, StatusMustBeNumber) { |
| 1090 SpdySerializedFrame req( | 1090 SpdySerializedFrame req( |
| 1091 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1091 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1092 AddWrite(req); | 1092 AddWrite(req); |
| 1093 | 1093 |
| 1094 SpdyHeaderBlock incorrect_headers; | 1094 SpdyHeaderBlock incorrect_headers; |
| 1095 incorrect_headers[":status"] = "nan"; | 1095 incorrect_headers[":status"] = "nan"; |
| 1096 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( | 1096 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( |
| 1097 1, std::move(incorrect_headers), false)); | 1097 1, std::move(incorrect_headers), false)); |
| 1098 AddRead(reply); | 1098 AddRead(reply); |
| 1099 | 1099 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1129 | 1129 |
| 1130 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); | 1130 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1131 | 1131 |
| 1132 // Finish async network reads and writes. | 1132 // Finish async network reads and writes. |
| 1133 base::RunLoop().RunUntilIdle(); | 1133 base::RunLoop().RunUntilIdle(); |
| 1134 | 1134 |
| 1135 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1135 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1136 EXPECT_TRUE(data.AllReadDataConsumed()); | 1136 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 1137 } | 1137 } |
| 1138 | 1138 |
| 1139 TEST_F(SpdyStreamTest, StatusCanHaveExtraText) { | 1139 TEST_F(SpdyStreamTest, StatusCannotHaveExtraText) { |
| 1140 SpdySerializedFrame req( | 1140 SpdySerializedFrame req( |
| 1141 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1141 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1142 AddWrite(req); | 1142 AddWrite(req); |
| 1143 | 1143 |
| 1144 SpdyHeaderBlock headers_with_status_text; | 1144 SpdyHeaderBlock headers_with_status_text; |
| 1145 headers_with_status_text[":status"] = | 1145 headers_with_status_text[":status"] = |
| 1146 "200 Some random extra text describing status"; | 1146 "200 Some random extra text describing status"; |
| 1147 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( | 1147 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( |
| 1148 1, std::move(headers_with_status_text), false)); | 1148 1, std::move(headers_with_status_text), false)); |
| 1149 AddRead(reply); | 1149 AddRead(reply); |
| 1150 | 1150 |
| 1151 SpdySerializedFrame body( | 1151 SpdySerializedFrame body( |
| 1152 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); | 1152 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); |
| 1153 AddRead(body); | 1153 AddRead(body); |
| 1154 | 1154 |
| 1155 SpdySerializedFrame rst( |
| 1156 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_PROTOCOL_ERROR)); |
| 1157 AddWrite(rst); |
| 1158 |
| 1155 AddReadEOF(); | 1159 AddReadEOF(); |
| 1156 | 1160 |
| 1157 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 1161 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 1158 GetNumWrites()); | 1162 GetNumWrites()); |
| 1159 MockConnect connect_data(SYNCHRONOUS, OK); | 1163 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1160 data.set_connect_data(connect_data); | 1164 data.set_connect_data(connect_data); |
| 1161 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1165 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1162 | 1166 |
| 1163 AddSSLSocketData(); | 1167 AddSSLSocketData(); |
| 1164 | 1168 |
| 1165 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 1169 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 1166 | 1170 |
| 1167 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( | 1171 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 1168 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); | 1172 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 1169 ASSERT_TRUE(stream); | 1173 ASSERT_TRUE(stream); |
| 1170 | 1174 |
| 1171 StreamDelegateDoNothing delegate(stream); | 1175 StreamDelegateDoNothing delegate(stream); |
| 1172 stream->SetDelegate(&delegate); | 1176 stream->SetDelegate(&delegate); |
| 1173 | 1177 |
| 1174 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 1178 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 1175 | 1179 |
| 1176 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 1180 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 1177 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), | 1181 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 1178 NO_MORE_DATA_TO_SEND)); | 1182 NO_MORE_DATA_TO_SEND)); |
| 1179 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 1183 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 1180 | 1184 |
| 1181 EXPECT_THAT(delegate.WaitForClose(), IsOk()); | 1185 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1182 EXPECT_EQ("200 Some random extra text describing status", | |
| 1183 delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | |
| 1184 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | |
| 1185 delegate.TakeReceivedData()); | |
| 1186 | 1186 |
| 1187 // Finish async network reads and writes. | 1187 // Finish async network reads and writes. |
| 1188 base::RunLoop().RunUntilIdle(); | 1188 base::RunLoop().RunUntilIdle(); |
| 1189 |
| 1190 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1191 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 1192 } |
| 1193 |
| 1194 TEST_F(SpdyStreamTest, StatusMustBePresent) { |
| 1195 SpdySerializedFrame req( |
| 1196 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1197 AddWrite(req); |
| 1198 |
| 1199 SpdyHeaderBlock headers_without_status; |
| 1200 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( |
| 1201 1, std::move(headers_without_status), false)); |
| 1202 AddRead(reply); |
| 1203 |
| 1204 SpdySerializedFrame body( |
| 1205 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); |
| 1206 AddRead(body); |
| 1207 |
| 1208 SpdySerializedFrame rst( |
| 1209 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_PROTOCOL_ERROR)); |
| 1210 AddWrite(rst); |
| 1211 |
| 1212 AddReadEOF(); |
| 1213 |
| 1214 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 1215 GetNumWrites()); |
| 1216 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1217 data.set_connect_data(connect_data); |
| 1218 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1219 |
| 1220 AddSSLSocketData(); |
| 1221 |
| 1222 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 1223 |
| 1224 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 1225 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 1226 ASSERT_TRUE(stream); |
| 1227 |
| 1228 StreamDelegateDoNothing delegate(stream); |
| 1229 stream->SetDelegate(&delegate); |
| 1230 |
| 1231 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 1232 |
| 1233 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 1234 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 1235 NO_MORE_DATA_TO_SEND)); |
| 1236 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 1237 |
| 1238 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1239 |
| 1240 // Finish async network reads and writes. |
| 1241 base::RunLoop().RunUntilIdle(); |
| 1189 | 1242 |
| 1190 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1243 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1191 EXPECT_TRUE(data.AllReadDataConsumed()); | 1244 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 1192 } | 1245 } |
| 1193 | 1246 |
| 1194 // Call IncreaseSendWindowSize on a stream with a large enough delta to overflow | 1247 // Call IncreaseSendWindowSize on a stream with a large enough delta to overflow |
| 1195 // an int32_t. The SpdyStream should handle that case gracefully. | 1248 // an int32_t. The SpdyStream should handle that case gracefully. |
| 1196 TEST_F(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 1249 TEST_F(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
| 1197 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1250 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1198 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); | 1251 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1499 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 1552 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
| 1500 | 1553 |
| 1501 // FIN | 1554 // FIN |
| 1502 data.Resume(); | 1555 data.Resume(); |
| 1503 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 1556 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1504 } | 1557 } |
| 1505 | 1558 |
| 1506 } // namespace test | 1559 } // namespace test |
| 1507 | 1560 |
| 1508 } // namespace net | 1561 } // namespace net |
| OLD | NEW |