| 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 <cmath> | 5 #include <cmath> |
| 6 #include <memory> | 6 #include <memory> |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 << expected; | 502 << expected; |
| 503 | 503 |
| 504 // Verify the response HEADERS. | 504 // Verify the response HEADERS. |
| 505 // Copy the response info, because trans goes away. | 505 // Copy the response info, because trans goes away. |
| 506 *response = *trans->GetResponseInfo(); | 506 *response = *trans->GetResponseInfo(); |
| 507 *push_response = *trans2.GetResponseInfo(); | 507 *push_response = *trans2.GetResponseInfo(); |
| 508 | 508 |
| 509 VerifyStreamsClosed(helper); | 509 VerifyStreamsClosed(helper); |
| 510 } | 510 } |
| 511 | 511 |
| 512 void RunBrokenPushTest(SequencedSocketData* data, int expected_rv) { |
| 513 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 514 NetLogWithSource(), nullptr); |
| 515 helper.RunPreTestSetup(); |
| 516 helper.AddData(data); |
| 517 |
| 518 HttpNetworkTransaction* trans = helper.trans(); |
| 519 |
| 520 // Start the transaction with basic parameters. |
| 521 TestCompletionCallback callback; |
| 522 int rv = trans->Start(&CreateGetRequest(), callback.callback(), |
| 523 NetLogWithSource()); |
| 524 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 525 rv = callback.WaitForResult(); |
| 526 EXPECT_EQ(expected_rv, rv); |
| 527 |
| 528 // Finish async network reads/writes. |
| 529 base::RunLoop().RunUntilIdle(); |
| 530 |
| 531 // Verify that we consumed all test data. |
| 532 EXPECT_TRUE(data->AllReadDataConsumed()); |
| 533 EXPECT_TRUE(data->AllWriteDataConsumed()); |
| 534 |
| 535 if (expected_rv == OK) { |
| 536 // Expected main request to succeed, even if push failed. |
| 537 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 538 EXPECT_TRUE(response.headers); |
| 539 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 540 } |
| 541 } |
| 542 |
| 512 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper, | 543 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper, |
| 513 int result) { | 544 int result) { |
| 514 helper->ResetTrans(); | 545 helper->ResetTrans(); |
| 515 } | 546 } |
| 516 | 547 |
| 517 static void StartTransactionCallback(HttpNetworkSession* session, | 548 static void StartTransactionCallback(HttpNetworkSession* session, |
| 518 GURL url, | 549 GURL url, |
| 519 int result) { | 550 int result) { |
| 520 HttpRequestInfo request; | 551 HttpRequestInfo request; |
| 521 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session); | 552 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session); |
| (...skipping 2332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2854 | 2885 |
| 2855 // Verify the response headers. | 2886 // Verify the response headers. |
| 2856 EXPECT_TRUE(response.headers); | 2887 EXPECT_TRUE(response.headers); |
| 2857 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2888 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2858 | 2889 |
| 2859 // Verify the pushed stream. | 2890 // Verify the pushed stream. |
| 2860 EXPECT_TRUE(response2.headers); | 2891 EXPECT_TRUE(response2.headers); |
| 2861 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2892 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2862 } | 2893 } |
| 2863 | 2894 |
| 2895 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidUrl) { |
| 2896 // Coverage on how a non-empty invalid GURL in a PUSH_PROMISE is handled. |
| 2897 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 2898 SpdySerializedFrame req( |
| 2899 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 2900 |
| 2901 // Can't use ConstructSpdyPush here since it wants to parse a URL and |
| 2902 // split it into the appropriate :header pieces. So we have to hand-fill |
| 2903 // those pieces in. |
| 2904 SpdyFramer response_spdy_framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2905 SpdyHeaderBlock push_promise_header_block; |
| 2906 push_promise_header_block[spdy_util_.GetHostKey()] = ""; |
| 2907 push_promise_header_block[spdy_util_.GetSchemeKey()] = ""; |
| 2908 push_promise_header_block[spdy_util_.GetPathKey()] = "/index.html"; |
| 2909 |
| 2910 SpdyPushPromiseIR push_promise(1, 2, std::move(push_promise_header_block)); |
| 2911 SpdySerializedFrame push_promise_frame( |
| 2912 response_spdy_framer.SerializeFrame(push_promise)); |
| 2913 |
| 2914 SpdySerializedFrame stream2_rst( |
| 2915 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR)); |
| 2916 |
| 2917 MockWrite writes[] = {CreateMockWrite(req, 0), |
| 2918 CreateMockWrite(stream2_rst, 2)}; |
| 2919 MockRead reads[] = { |
| 2920 CreateMockRead(push_promise_frame, 1), MockRead(ASYNC, 0, 3) /* EOF */ |
| 2921 }; |
| 2922 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2923 RunBrokenPushTest(&data, ERR_CONNECTION_CLOSED); |
| 2924 } |
| 2925 |
| 2864 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { | 2926 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { |
| 2865 SpdySerializedFrame stream1_syn( | 2927 SpdySerializedFrame stream1_syn( |
| 2866 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2928 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2867 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 2929 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 2868 0, ERROR_CODE_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); | 2930 0, ERROR_CODE_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); |
| 2869 MockWrite writes[] = { | 2931 MockWrite writes[] = { |
| 2870 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), | 2932 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), |
| 2871 }; | 2933 }; |
| 2872 | 2934 |
| 2873 SpdySerializedFrame stream1_reply( | 2935 SpdySerializedFrame stream1_reply( |
| 2874 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 2936 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 2875 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2937 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2876 nullptr, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2938 nullptr, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2877 MockRead reads[] = { | 2939 MockRead reads[] = { |
| 2878 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2940 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2879 }; | 2941 }; |
| 2880 | |
| 2881 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2942 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2882 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2943 RunBrokenPushTest(&data, OK); |
| 2883 NetLogWithSource(), nullptr); | |
| 2884 | |
| 2885 helper.RunPreTestSetup(); | |
| 2886 helper.AddData(&data); | |
| 2887 | |
| 2888 HttpNetworkTransaction* trans = helper.trans(); | |
| 2889 | |
| 2890 // Start the transaction with basic parameters. | |
| 2891 TestCompletionCallback callback; | |
| 2892 int rv = trans->Start(&CreateGetRequest(), callback.callback(), | |
| 2893 NetLogWithSource()); | |
| 2894 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | |
| 2895 rv = callback.WaitForResult(); | |
| 2896 EXPECT_THAT(rv, IsOk()); | |
| 2897 | |
| 2898 // Finish async network reads/writes. | |
| 2899 base::RunLoop().RunUntilIdle(); | |
| 2900 | |
| 2901 // Verify that we consumed all test data. | |
| 2902 EXPECT_TRUE(data.AllReadDataConsumed()); | |
| 2903 EXPECT_TRUE(data.AllWriteDataConsumed()); | |
| 2904 | |
| 2905 // Verify the response headers. | |
| 2906 HttpResponseInfo response = *trans->GetResponseInfo(); | |
| 2907 EXPECT_TRUE(response.headers); | |
| 2908 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | |
| 2909 } | 2944 } |
| 2910 | 2945 |
| 2911 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { | 2946 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { |
| 2912 SpdySerializedFrame stream1_syn( | 2947 SpdySerializedFrame stream1_syn( |
| 2913 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2948 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2914 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2949 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2915 SpdySerializedFrame stream2_rst( | 2950 SpdySerializedFrame stream2_rst( |
| 2916 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_STREAM_CLOSED)); | 2951 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_STREAM_CLOSED)); |
| 2917 MockWrite writes[] = { | 2952 MockWrite writes[] = { |
| 2918 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), | 2953 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), |
| 2919 }; | 2954 }; |
| 2920 | 2955 |
| 2921 SpdySerializedFrame stream1_reply( | 2956 SpdySerializedFrame stream1_reply( |
| 2922 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 2957 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 2923 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2958 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2924 nullptr, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2959 nullptr, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2925 MockRead reads[] = { | 2960 MockRead reads[] = { |
| 2926 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2961 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2927 CreateMockRead(stream1_body, 4), | 2962 CreateMockRead(stream1_body, 4), |
| 2928 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause | 2963 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause |
| 2929 }; | 2964 }; |
| 2930 | 2965 |
| 2931 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2966 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2932 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2967 RunBrokenPushTest(&data, OK); |
| 2933 NetLogWithSource(), nullptr); | |
| 2934 | |
| 2935 helper.RunPreTestSetup(); | |
| 2936 helper.AddData(&data); | |
| 2937 | |
| 2938 HttpNetworkTransaction* trans = helper.trans(); | |
| 2939 | |
| 2940 // Start the transaction with basic parameters. | |
| 2941 TestCompletionCallback callback; | |
| 2942 int rv = trans->Start(&CreateGetRequest(), callback.callback(), | |
| 2943 NetLogWithSource()); | |
| 2944 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | |
| 2945 rv = callback.WaitForResult(); | |
| 2946 EXPECT_THAT(rv, IsOk()); | |
| 2947 | |
| 2948 // Finish async network reads/writes. | |
| 2949 base::RunLoop().RunUntilIdle(); | |
| 2950 | |
| 2951 // Verify that we consumed all test data. | |
| 2952 EXPECT_TRUE(data.AllReadDataConsumed()); | |
| 2953 EXPECT_TRUE(data.AllWriteDataConsumed()); | |
| 2954 | |
| 2955 // Verify the response headers. | |
| 2956 HttpResponseInfo response = *trans->GetResponseInfo(); | |
| 2957 EXPECT_TRUE(response.headers); | |
| 2958 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | |
| 2959 } | 2968 } |
| 2960 | 2969 |
| 2961 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) { | 2970 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) { |
| 2962 SpdySerializedFrame stream1_syn( | 2971 SpdySerializedFrame stream1_syn( |
| 2963 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2972 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2964 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2973 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2965 SpdySerializedFrame stream2_rst( | 2974 SpdySerializedFrame stream2_rst( |
| 2966 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR)); | 2975 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR)); |
| 2967 MockWrite writes[] = { | 2976 MockWrite writes[] = { |
| 2968 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), | 2977 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), |
| 2969 }; | 2978 }; |
| 2970 | 2979 |
| 2971 SpdySerializedFrame stream1_reply( | 2980 SpdySerializedFrame stream1_reply( |
| 2972 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 2981 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 2973 SpdyHeaderBlock incomplete_headers; | 2982 SpdyHeaderBlock incomplete_headers; |
| 2974 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; | 2983 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; |
| 2975 incomplete_headers["hello"] = "bye"; | 2984 incomplete_headers["hello"] = "bye"; |
| 2976 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 2985 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 2977 std::move(incomplete_headers), 2, 1)); | 2986 std::move(incomplete_headers), 2, 1)); |
| 2978 MockRead reads[] = { | 2987 MockRead reads[] = { |
| 2979 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2988 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2980 CreateMockRead(stream1_body, 4), | 2989 CreateMockRead(stream1_body, 4), |
| 2981 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause | 2990 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause |
| 2982 }; | 2991 }; |
| 2983 | 2992 |
| 2984 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2993 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2985 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2994 RunBrokenPushTest(&data, OK); |
| 2986 NetLogWithSource(), nullptr); | |
| 2987 | |
| 2988 helper.RunPreTestSetup(); | |
| 2989 helper.AddData(&data); | |
| 2990 | |
| 2991 HttpNetworkTransaction* trans = helper.trans(); | |
| 2992 | |
| 2993 // Start the transaction with basic parameters. | |
| 2994 TestCompletionCallback callback; | |
| 2995 int rv = trans->Start(&CreateGetRequest(), callback.callback(), | |
| 2996 NetLogWithSource()); | |
| 2997 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | |
| 2998 rv = callback.WaitForResult(); | |
| 2999 EXPECT_THAT(rv, IsOk()); | |
| 3000 | |
| 3001 // Finish async network reads/writes. | |
| 3002 base::RunLoop().RunUntilIdle(); | |
| 3003 | |
| 3004 // Verify that we consumed all test data. | |
| 3005 EXPECT_TRUE(data.AllReadDataConsumed()); | |
| 3006 EXPECT_TRUE(data.AllWriteDataConsumed()); | |
| 3007 | |
| 3008 // Verify the response headers. | |
| 3009 HttpResponseInfo response = *trans->GetResponseInfo(); | |
| 3010 EXPECT_TRUE(response.headers); | |
| 3011 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | |
| 3012 } | 2995 } |
| 3013 | 2996 |
| 3014 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. | 2997 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. |
| 3015 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { | 2998 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { |
| 3016 SpdySerializedFrame stream1_syn( | 2999 SpdySerializedFrame stream1_syn( |
| 3017 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3000 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3018 SpdySerializedFrame stream2_priority( | 3001 SpdySerializedFrame stream2_priority( |
| 3019 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true)); | 3002 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true)); |
| 3020 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 3003 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 3021 2, ERROR_CODE_PROTOCOL_ERROR, "Push on even stream id.")); | 3004 2, ERROR_CODE_PROTOCOL_ERROR, "Push on even stream id.")); |
| (...skipping 3534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6556 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { | 6539 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6557 std::unique_ptr<SSLSocketDataProvider> ssl_provider( | 6540 std::unique_ptr<SSLSocketDataProvider> ssl_provider( |
| 6558 new SSLSocketDataProvider(ASYNC, OK)); | 6541 new SSLSocketDataProvider(ASYNC, OK)); |
| 6559 // Set to TLS_RSA_WITH_NULL_MD5 | 6542 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6560 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); | 6543 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6561 | 6544 |
| 6562 RunTLSUsageCheckTest(std::move(ssl_provider)); | 6545 RunTLSUsageCheckTest(std::move(ssl_provider)); |
| 6563 } | 6546 } |
| 6564 | 6547 |
| 6565 } // namespace net | 6548 } // namespace net |
| OLD | NEW |