| 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 <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 1953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 request.method = "POST"; | 1964 request.method = "POST"; |
| 1965 request.url = GURL(kRequestUrl); | 1965 request.url = GURL(kRequestUrl); |
| 1966 // Create an empty UploadData. | 1966 // Create an empty UploadData. |
| 1967 request.upload_data_stream = NULL; | 1967 request.upload_data_stream = NULL; |
| 1968 | 1968 |
| 1969 // When request.upload_data_stream is NULL for post, content-length is | 1969 // When request.upload_data_stream is NULL for post, content-length is |
| 1970 // expected to be 0. | 1970 // expected to be 0. |
| 1971 scoped_ptr<SpdyFrame> req( | 1971 scoped_ptr<SpdyFrame> req( |
| 1972 spdy_util_.ConstructSpdyPost(kRequestUrl, 1, 0, LOWEST, NULL, 0)); | 1972 spdy_util_.ConstructSpdyPost(kRequestUrl, 1, 0, LOWEST, NULL, 0)); |
| 1973 // Set the FIN bit since there will be no body. | 1973 // Set the FIN bit since there will be no body. |
| 1974 test::SetFrameFlags(req.get(), CONTROL_FLAG_FIN, spdy_util_.spdy_version()); | 1974 int flags = CONTROL_FLAG_FIN; |
| 1975 if (spdy_util_.spdy_version() >= SPDY4) { |
| 1976 flags |= HEADERS_FLAG_PRIORITY; |
| 1977 } |
| 1978 test::SetFrameFlags(req.get(), flags, spdy_util_.spdy_version()); |
| 1975 MockWrite writes[] = { | 1979 MockWrite writes[] = { |
| 1976 CreateMockWrite(*req), | 1980 CreateMockWrite(*req), |
| 1977 }; | 1981 }; |
| 1978 | 1982 |
| 1979 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1983 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 1980 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 1984 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 1981 MockRead reads[] = { | 1985 MockRead reads[] = { |
| 1982 CreateMockRead(*resp), | 1986 CreateMockRead(*resp), |
| 1983 CreateMockRead(*body), | 1987 CreateMockRead(*body), |
| 1984 MockRead(ASYNC, 0, 0) // EOF | 1988 MockRead(ASYNC, 0, 0) // EOF |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2006 HttpRequestInfo request; | 2010 HttpRequestInfo request; |
| 2007 request.method = "POST"; | 2011 request.method = "POST"; |
| 2008 request.url = GURL(kRequestUrl); | 2012 request.url = GURL(kRequestUrl); |
| 2009 request.upload_data_stream = &stream; | 2013 request.upload_data_stream = &stream; |
| 2010 | 2014 |
| 2011 const uint64 kContentLength = 0; | 2015 const uint64 kContentLength = 0; |
| 2012 scoped_ptr<SpdyFrame> req( | 2016 scoped_ptr<SpdyFrame> req( |
| 2013 spdy_util_.ConstructSpdyPost( | 2017 spdy_util_.ConstructSpdyPost( |
| 2014 kRequestUrl, 1, kContentLength, LOWEST, NULL, 0)); | 2018 kRequestUrl, 1, kContentLength, LOWEST, NULL, 0)); |
| 2015 // Set the FIN bit since there will be no body. | 2019 // Set the FIN bit since there will be no body. |
| 2016 test::SetFrameFlags(req.get(), CONTROL_FLAG_FIN, spdy_util_.spdy_version()); | 2020 int flags = CONTROL_FLAG_FIN; |
| 2021 if (spdy_util_.spdy_version() >= SPDY4) { |
| 2022 flags |= HEADERS_FLAG_PRIORITY; |
| 2023 } |
| 2024 test::SetFrameFlags(req.get(), flags, spdy_util_.spdy_version()); |
| 2017 MockWrite writes[] = { | 2025 MockWrite writes[] = { |
| 2018 CreateMockWrite(*req), | 2026 CreateMockWrite(*req), |
| 2019 }; | 2027 }; |
| 2020 | 2028 |
| 2021 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 2029 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 2022 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 2030 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 2023 MockRead reads[] = { | 2031 MockRead reads[] = { |
| 2024 CreateMockRead(*resp), | 2032 CreateMockRead(*resp), |
| 2025 CreateMockRead(*body), | 2033 CreateMockRead(*body), |
| 2026 MockRead(ASYNC, 0, 0) // EOF | 2034 MockRead(ASYNC, 0, 0) // EOF |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2148 TransactionHelperResult out = helper.output(); | 2156 TransactionHelperResult out = helper.output(); |
| 2149 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 2157 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
| 2150 } | 2158 } |
| 2151 | 2159 |
| 2152 // Test that the transaction doesn't crash when we get two replies on the same | 2160 // Test that the transaction doesn't crash when we get two replies on the same |
| 2153 // stream ID. See http://crbug.com/45639. | 2161 // stream ID. See http://crbug.com/45639. |
| 2154 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { | 2162 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { |
| 2155 scoped_ptr<SpdyFrame> req( | 2163 scoped_ptr<SpdyFrame> req( |
| 2156 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 2164 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 2157 scoped_ptr<SpdyFrame> rst( | 2165 scoped_ptr<SpdyFrame> rst( |
| 2158 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_STREAM_IN_USE)); | 2166 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 2159 MockWrite writes[] = { | 2167 MockWrite writes[] = { |
| 2160 CreateMockWrite(*req), | 2168 CreateMockWrite(*req), |
| 2161 CreateMockWrite(*rst), | 2169 CreateMockWrite(*rst), |
| 2162 }; | 2170 }; |
| 2163 | 2171 |
| 2164 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2172 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2165 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 2173 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 2166 MockRead reads[] = { | 2174 MockRead reads[] = { |
| 2167 CreateMockRead(*resp), | 2175 CreateMockRead(*resp), |
| 2168 CreateMockRead(*resp), | 2176 CreateMockRead(*resp), |
| (...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3028 // Verify the SYN_REPLY. | 3036 // Verify the SYN_REPLY. |
| 3029 EXPECT_TRUE(response.headers.get() != NULL); | 3037 EXPECT_TRUE(response.headers.get() != NULL); |
| 3030 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); | 3038 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); |
| 3031 | 3039 |
| 3032 // Verify the pushed stream. | 3040 // Verify the pushed stream. |
| 3033 EXPECT_TRUE(response2.headers.get() != NULL); | 3041 EXPECT_TRUE(response2.headers.get() != NULL); |
| 3034 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); | 3042 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); |
| 3035 } | 3043 } |
| 3036 | 3044 |
| 3037 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { | 3045 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { |
| 3046 if (spdy_util_.spdy_version() == SPDY4) { |
| 3047 // TODO(jgraettinger): We don't support associated stream |
| 3048 // checks in SPDY4 yet. |
| 3049 return; |
| 3050 } |
| 3038 scoped_ptr<SpdyFrame> stream1_syn( | 3051 scoped_ptr<SpdyFrame> stream1_syn( |
| 3039 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 3052 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 3040 scoped_ptr<SpdyFrame> stream1_body( | 3053 scoped_ptr<SpdyFrame> stream1_body( |
| 3041 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 3054 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 3042 scoped_ptr<SpdyFrame> stream2_rst( | 3055 scoped_ptr<SpdyFrame> stream2_rst( |
| 3043 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 3056 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 3044 MockWrite writes[] = { | 3057 MockWrite writes[] = { |
| 3045 CreateMockWrite(*stream1_syn, 1), | 3058 CreateMockWrite(*stream1_syn, 1), |
| 3046 CreateMockWrite(*stream2_rst, 4), | 3059 CreateMockWrite(*stream2_rst, 4), |
| 3047 }; | 3060 }; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3089 << " Write index: " | 3102 << " Write index: " |
| 3090 << data.write_index(); | 3103 << data.write_index(); |
| 3091 | 3104 |
| 3092 // Verify the SYN_REPLY. | 3105 // Verify the SYN_REPLY. |
| 3093 HttpResponseInfo response = *trans->GetResponseInfo(); | 3106 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 3094 EXPECT_TRUE(response.headers.get() != NULL); | 3107 EXPECT_TRUE(response.headers.get() != NULL); |
| 3095 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); | 3108 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); |
| 3096 } | 3109 } |
| 3097 | 3110 |
| 3098 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { | 3111 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { |
| 3112 if (spdy_util_.spdy_version() == SPDY4) { |
| 3113 // TODO(jgraettinger): We don't support associated stream |
| 3114 // checks in SPDY4 yet. |
| 3115 return; |
| 3116 } |
| 3099 scoped_ptr<SpdyFrame> stream1_syn( | 3117 scoped_ptr<SpdyFrame> stream1_syn( |
| 3100 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 3118 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 3101 scoped_ptr<SpdyFrame> stream1_body( | 3119 scoped_ptr<SpdyFrame> stream1_body( |
| 3102 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 3120 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 3103 scoped_ptr<SpdyFrame> stream2_rst( | 3121 scoped_ptr<SpdyFrame> stream2_rst( |
| 3104 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); | 3122 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); |
| 3105 MockWrite writes[] = { | 3123 MockWrite writes[] = { |
| 3106 CreateMockWrite(*stream1_syn, 1), | 3124 CreateMockWrite(*stream1_syn, 1), |
| 3107 CreateMockWrite(*stream2_rst, 4), | 3125 CreateMockWrite(*stream2_rst, 4), |
| 3108 }; | 3126 }; |
| (...skipping 2465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5574 DelayedSocketData data(1, reads, arraysize(reads), | 5592 DelayedSocketData data(1, reads, arraysize(reads), |
| 5575 writes, arraysize(writes)); | 5593 writes, arraysize(writes)); |
| 5576 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 5594 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 5577 BoundNetLog(), GetParam(), NULL); | 5595 BoundNetLog(), GetParam(), NULL); |
| 5578 helper.RunToCompletion(&data); | 5596 helper.RunToCompletion(&data); |
| 5579 TransactionHelperResult out = helper.output(); | 5597 TransactionHelperResult out = helper.output(); |
| 5580 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 5598 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
| 5581 } | 5599 } |
| 5582 | 5600 |
| 5583 TEST_P(SpdyNetworkTransactionTest, ServerPushCrossOriginCorrectness) { | 5601 TEST_P(SpdyNetworkTransactionTest, ServerPushCrossOriginCorrectness) { |
| 5602 if (spdy_util_.spdy_version() == SPDY4) { |
| 5603 // TODO(jgraettinger): We don't support associated stream |
| 5604 // checks in SPDY4 yet. |
| 5605 return; |
| 5606 } |
| 5584 // In this test we want to verify that we can't accidentally push content | 5607 // In this test we want to verify that we can't accidentally push content |
| 5585 // which can't be pushed by this content server. | 5608 // which can't be pushed by this content server. |
| 5586 // This test assumes that: | 5609 // This test assumes that: |
| 5587 // - if we're requesting http://www.foo.com/barbaz | 5610 // - if we're requesting http://www.foo.com/barbaz |
| 5588 // - the browser has made a connection to "www.foo.com". | 5611 // - the browser has made a connection to "www.foo.com". |
| 5589 | 5612 |
| 5590 // A list of the URL to fetch, followed by the URL being pushed. | 5613 // A list of the URL to fetch, followed by the URL being pushed. |
| 5591 static const char* const kTestCases[] = { | 5614 static const char* const kTestCases[] = { |
| 5592 "http://www.google.com/foo.html", | 5615 "http://www.google.com/foo.html", |
| 5593 "http://www.google.com:81/foo.js", // Bad port | 5616 "http://www.google.com:81/foo.js", // Bad port |
| (...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6467 // since we're send-stalled. | 6490 // since we're send-stalled. |
| 6468 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); | 6491 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); |
| 6469 | 6492 |
| 6470 // Read in WINDOW_UPDATE or SETTINGS frame. | 6493 // Read in WINDOW_UPDATE or SETTINGS frame. |
| 6471 data.RunFor((GetParam().protocol >= kProtoSPDY31) ? 8 : 7); | 6494 data.RunFor((GetParam().protocol >= kProtoSPDY31) ? 8 : 7); |
| 6472 rv = callback.WaitForResult(); | 6495 rv = callback.WaitForResult(); |
| 6473 helper.VerifyDataConsumed(); | 6496 helper.VerifyDataConsumed(); |
| 6474 } | 6497 } |
| 6475 | 6498 |
| 6476 } // namespace net | 6499 } // namespace net |
| OLD | NEW |