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 <memory> | 5 #include <memory> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 #include "net/http/http_network_session.h" | 76 #include "net/http/http_network_session.h" |
77 #include "net/http/http_request_headers.h" | 77 #include "net/http/http_request_headers.h" |
78 #include "net/http/http_response_headers.h" | 78 #include "net/http/http_response_headers.h" |
79 #include "net/http/http_util.h" | 79 #include "net/http/http_util.h" |
80 #include "net/log/net_log_event_type.h" | 80 #include "net/log/net_log_event_type.h" |
81 #include "net/log/net_log_source.h" | 81 #include "net/log/net_log_source.h" |
82 #include "net/log/test_net_log.h" | 82 #include "net/log/test_net_log.h" |
83 #include "net/log/test_net_log_entry.h" | 83 #include "net/log/test_net_log_entry.h" |
84 #include "net/log/test_net_log_util.h" | 84 #include "net/log/test_net_log_util.h" |
85 #include "net/nqe/external_estimate_provider.h" | 85 #include "net/nqe/external_estimate_provider.h" |
| 86 #include "net/proxy/proxy_server.h" |
86 #include "net/proxy/proxy_service.h" | 87 #include "net/proxy/proxy_service.h" |
87 #include "net/socket/ssl_client_socket.h" | 88 #include "net/socket/ssl_client_socket.h" |
88 #include "net/ssl/channel_id_service.h" | 89 #include "net/ssl/channel_id_service.h" |
89 #include "net/ssl/default_channel_id_store.h" | 90 #include "net/ssl/default_channel_id_store.h" |
90 #include "net/ssl/ssl_connection_status_flags.h" | 91 #include "net/ssl/ssl_connection_status_flags.h" |
91 #include "net/ssl/ssl_server_config.h" | 92 #include "net/ssl/ssl_server_config.h" |
92 #include "net/ssl/token_binding.h" | 93 #include "net/ssl/token_binding.h" |
93 #include "net/test/cert_test_util.h" | 94 #include "net/test/cert_test_util.h" |
94 #include "net/test/embedded_test_server/embedded_test_server.h" | 95 #include "net/test/embedded_test_server/embedded_test_server.h" |
95 #include "net/test/embedded_test_server/http_request.h" | 96 #include "net/test/embedded_test_server/http_request.h" |
(...skipping 2057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2153 TestDelegate d; | 2154 TestDelegate d; |
2154 std::unique_ptr<URLRequest> req( | 2155 std::unique_ptr<URLRequest> req( |
2155 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d)); | 2156 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d)); |
2156 req->set_method("GET"); | 2157 req->set_method("GET"); |
2157 | 2158 |
2158 req->Start(); | 2159 req->Start(); |
2159 base::RunLoop().Run(); | 2160 base::RunLoop().Run(); |
2160 | 2161 |
2161 // Check we see a failed request. | 2162 // Check we see a failed request. |
2162 // The proxy server is not set before failure. | 2163 // The proxy server is not set before failure. |
2163 EXPECT_TRUE(req->proxy_server().IsEmpty()); | 2164 EXPECT_FALSE(req->proxy_server().is_valid()); |
2164 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, d.request_status()); | 2165 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, d.request_status()); |
2165 | 2166 |
2166 EXPECT_EQ(1, network_delegate.error_count()); | 2167 EXPECT_EQ(1, network_delegate.error_count()); |
2167 EXPECT_THAT(network_delegate.last_error(), | 2168 EXPECT_THAT(network_delegate.last_error(), |
2168 IsError(ERR_PROXY_CONNECTION_FAILED)); | 2169 IsError(ERR_PROXY_CONNECTION_FAILED)); |
2169 EXPECT_EQ(1, network_delegate.completed_requests()); | 2170 EXPECT_EQ(1, network_delegate.completed_requests()); |
2170 } | 2171 } |
2171 | 2172 |
2172 // Make sure that NetworkDelegate::NotifyCompleted is called if | 2173 // Make sure that NetworkDelegate::NotifyCompleted is called if |
2173 // content is empty. | 2174 // content is empty. |
(...skipping 1423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3597 TestDelegate d; | 3598 TestDelegate d; |
3598 { | 3599 { |
3599 std::unique_ptr<URLRequest> r(context.CreateRequest( | 3600 std::unique_ptr<URLRequest> r(context.CreateRequest( |
3600 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d)); | 3601 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d)); |
3601 r->Start(); | 3602 r->Start(); |
3602 EXPECT_TRUE(r->is_pending()); | 3603 EXPECT_TRUE(r->is_pending()); |
3603 | 3604 |
3604 base::RunLoop().Run(); | 3605 base::RunLoop().Run(); |
3605 | 3606 |
3606 // The proxy server is not set before failure. | 3607 // The proxy server is not set before failure. |
3607 EXPECT_TRUE(r->proxy_server().IsEmpty()); | 3608 EXPECT_FALSE(r->proxy_server().is_valid()); |
3608 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status()); | 3609 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status()); |
3609 EXPECT_EQ(1, d.response_started_count()); | 3610 EXPECT_EQ(1, d.response_started_count()); |
3610 // We should not have followed the redirect. | 3611 // We should not have followed the redirect. |
3611 EXPECT_EQ(0, d.received_redirect_count()); | 3612 EXPECT_EQ(0, d.received_redirect_count()); |
3612 } | 3613 } |
3613 } | 3614 } |
3614 | 3615 |
3615 // This is the same as the previous test, but checks that the network delegate | 3616 // This is the same as the previous test, but checks that the network delegate |
3616 // registers the error. | 3617 // registers the error. |
3617 TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) { | 3618 TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) { |
3618 ASSERT_TRUE(http_test_server()->Start()); | 3619 ASSERT_TRUE(http_test_server()->Start()); |
3619 | 3620 |
3620 TestNetworkDelegate network_delegate; // Must outlive URLRequest. | 3621 TestNetworkDelegate network_delegate; // Must outlive URLRequest. |
3621 TestURLRequestContextWithProxy context( | 3622 TestURLRequestContextWithProxy context( |
3622 http_test_server()->host_port_pair().ToString(), &network_delegate); | 3623 http_test_server()->host_port_pair().ToString(), &network_delegate); |
3623 | 3624 |
3624 TestDelegate d; | 3625 TestDelegate d; |
3625 { | 3626 { |
3626 std::unique_ptr<URLRequest> r(context.CreateRequest( | 3627 std::unique_ptr<URLRequest> r(context.CreateRequest( |
3627 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d)); | 3628 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d)); |
3628 r->Start(); | 3629 r->Start(); |
3629 EXPECT_TRUE(r->is_pending()); | 3630 EXPECT_TRUE(r->is_pending()); |
3630 | 3631 |
3631 base::RunLoop().Run(); | 3632 base::RunLoop().Run(); |
3632 | 3633 |
3633 // The proxy server is not set before failure. | 3634 // The proxy server is not set before failure. |
3634 EXPECT_TRUE(r->proxy_server().IsEmpty()); | 3635 EXPECT_FALSE(r->proxy_server().is_valid()); |
3635 EXPECT_EQ(1, d.response_started_count()); | 3636 EXPECT_EQ(1, d.response_started_count()); |
3636 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status()); | 3637 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status()); |
3637 // We should not have followed the redirect. | 3638 // We should not have followed the redirect. |
3638 EXPECT_EQ(0, d.received_redirect_count()); | 3639 EXPECT_EQ(0, d.received_redirect_count()); |
3639 | 3640 |
3640 EXPECT_EQ(1, network_delegate.error_count()); | 3641 EXPECT_EQ(1, network_delegate.error_count()); |
3641 EXPECT_THAT(network_delegate.last_error(), | 3642 EXPECT_THAT(network_delegate.last_error(), |
3642 IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 3643 IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
3643 } | 3644 } |
3644 } | 3645 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3700 http_test_server()->host_port_pair().ToString(), &network_delegate); | 3701 http_test_server()->host_port_pair().ToString(), &network_delegate); |
3701 | 3702 |
3702 { | 3703 { |
3703 std::unique_ptr<URLRequest> r(context.CreateRequest( | 3704 std::unique_ptr<URLRequest> r(context.CreateRequest( |
3704 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d)); | 3705 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d)); |
3705 | 3706 |
3706 r->Start(); | 3707 r->Start(); |
3707 base::RunLoop().Run(); | 3708 base::RunLoop().Run(); |
3708 | 3709 |
3709 // The proxy server is not set before cancellation. | 3710 // The proxy server is not set before cancellation. |
3710 EXPECT_TRUE(r->proxy_server().IsEmpty()); | 3711 EXPECT_FALSE(r->proxy_server().is_valid()); |
3711 EXPECT_EQ(ERR_EMPTY_RESPONSE, d.request_status()); | 3712 EXPECT_EQ(ERR_EMPTY_RESPONSE, d.request_status()); |
3712 EXPECT_EQ(1, network_delegate.created_requests()); | 3713 EXPECT_EQ(1, network_delegate.created_requests()); |
3713 EXPECT_EQ(0, network_delegate.destroyed_requests()); | 3714 EXPECT_EQ(0, network_delegate.destroyed_requests()); |
3714 } | 3715 } |
3715 EXPECT_EQ(1, network_delegate.destroyed_requests()); | 3716 EXPECT_EQ(1, network_delegate.destroyed_requests()); |
3716 } | 3717 } |
3717 | 3718 |
3718 // Helper function for NetworkDelegateCancelRequestAsynchronously and | 3719 // Helper function for NetworkDelegateCancelRequestAsynchronously and |
3719 // NetworkDelegateCancelRequestSynchronously. Sets up a blocking network | 3720 // NetworkDelegateCancelRequestSynchronously. Sets up a blocking network |
3720 // delegate operating in |block_mode| and a request for |url|. It blocks the | 3721 // delegate operating in |block_mode| and a request for |url|. It blocks the |
(...skipping 11 matching lines...) Expand all Loading... |
3732 context.Init(); | 3733 context.Init(); |
3733 | 3734 |
3734 { | 3735 { |
3735 std::unique_ptr<URLRequest> r( | 3736 std::unique_ptr<URLRequest> r( |
3736 context.CreateRequest(url, DEFAULT_PRIORITY, &d)); | 3737 context.CreateRequest(url, DEFAULT_PRIORITY, &d)); |
3737 | 3738 |
3738 r->Start(); | 3739 r->Start(); |
3739 base::RunLoop().Run(); | 3740 base::RunLoop().Run(); |
3740 | 3741 |
3741 // The proxy server is not set before cancellation. | 3742 // The proxy server is not set before cancellation. |
3742 EXPECT_TRUE(r->proxy_server().IsEmpty()); | 3743 if (stage == BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST || |
| 3744 stage == BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS) { |
| 3745 EXPECT_FALSE(r->proxy_server().is_valid()); |
| 3746 } else if (stage == BlockingNetworkDelegate::ON_HEADERS_RECEIVED) { |
| 3747 EXPECT_TRUE(r->proxy_server().is_direct()); |
| 3748 } else { |
| 3749 NOTREACHED(); |
| 3750 } |
3743 EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, d.request_status()); | 3751 EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, d.request_status()); |
3744 EXPECT_EQ(1, network_delegate.created_requests()); | 3752 EXPECT_EQ(1, network_delegate.created_requests()); |
3745 EXPECT_EQ(0, network_delegate.destroyed_requests()); | 3753 EXPECT_EQ(0, network_delegate.destroyed_requests()); |
3746 } | 3754 } |
3747 EXPECT_EQ(1, network_delegate.destroyed_requests()); | 3755 EXPECT_EQ(1, network_delegate.destroyed_requests()); |
3748 } | 3756 } |
3749 | 3757 |
3750 // The following 3 tests check that the network delegate can cancel a request | 3758 // The following 3 tests check that the network delegate can cancel a request |
3751 // synchronously in various stages of the request. | 3759 // synchronously in various stages of the request. |
3752 TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) { | 3760 TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3823 EXPECT_EQ(307, r->response_headers()->response_code()); | 3831 EXPECT_EQ(307, r->response_headers()->response_code()); |
3824 std::string location; | 3832 std::string location; |
3825 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location", | 3833 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location", |
3826 &location)); | 3834 &location)); |
3827 EXPECT_EQ(redirect_url, GURL(location)); | 3835 EXPECT_EQ(redirect_url, GURL(location)); |
3828 | 3836 |
3829 // Let the request finish. | 3837 // Let the request finish. |
3830 r->FollowDeferredRedirect(); | 3838 r->FollowDeferredRedirect(); |
3831 base::RunLoop().Run(); | 3839 base::RunLoop().Run(); |
3832 EXPECT_EQ(OK, d.request_status()); | 3840 EXPECT_EQ(OK, d.request_status()); |
3833 EXPECT_TRUE(r->proxy_server().Equals(http_test_server()->host_port_pair())); | 3841 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP, |
| 3842 http_test_server()->host_port_pair()), |
| 3843 r->proxy_server()); |
3834 // before_send_headers_with_proxy_count only increments for headers sent | 3844 // before_send_headers_with_proxy_count only increments for headers sent |
3835 // through an untunneled proxy. | 3845 // through an untunneled proxy. |
3836 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count()); | 3846 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count()); |
3837 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals( | 3847 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals( |
3838 http_test_server()->host_port_pair())); | 3848 http_test_server()->host_port_pair())); |
3839 | 3849 |
3840 EXPECT_EQ(OK, d.request_status()); | 3850 EXPECT_EQ(OK, d.request_status()); |
3841 EXPECT_EQ(redirect_url, r->url()); | 3851 EXPECT_EQ(redirect_url, r->url()); |
3842 EXPECT_EQ(original_url, r->original_url()); | 3852 EXPECT_EQ(original_url, r->original_url()); |
3843 EXPECT_EQ(2U, r->url_chain().size()); | 3853 EXPECT_EQ(2U, r->url_chain().size()); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3877 std::string location; | 3887 std::string location; |
3878 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location", | 3888 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location", |
3879 &location)); | 3889 &location)); |
3880 EXPECT_EQ(redirect_url, GURL(location)); | 3890 EXPECT_EQ(redirect_url, GURL(location)); |
3881 | 3891 |
3882 // Let the request finish. | 3892 // Let the request finish. |
3883 r->FollowDeferredRedirect(); | 3893 r->FollowDeferredRedirect(); |
3884 base::RunLoop().Run(); | 3894 base::RunLoop().Run(); |
3885 | 3895 |
3886 EXPECT_EQ(OK, d.request_status()); | 3896 EXPECT_EQ(OK, d.request_status()); |
3887 EXPECT_TRUE(r->proxy_server().Equals(http_test_server()->host_port_pair())); | 3897 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP, |
| 3898 http_test_server()->host_port_pair()), |
| 3899 r->proxy_server()); |
3888 // before_send_headers_with_proxy_count only increments for headers sent | 3900 // before_send_headers_with_proxy_count only increments for headers sent |
3889 // through an untunneled proxy. | 3901 // through an untunneled proxy. |
3890 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count()); | 3902 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count()); |
3891 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals( | 3903 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals( |
3892 http_test_server()->host_port_pair())); | 3904 http_test_server()->host_port_pair())); |
3893 EXPECT_EQ(OK, d.request_status()); | 3905 EXPECT_EQ(OK, d.request_status()); |
3894 EXPECT_EQ(redirect_url, r->url()); | 3906 EXPECT_EQ(redirect_url, r->url()); |
3895 EXPECT_EQ(original_url, r->original_url()); | 3907 EXPECT_EQ(original_url, r->original_url()); |
3896 EXPECT_EQ(2U, r->url_chain().size()); | 3908 EXPECT_EQ(2U, r->url_chain().size()); |
3897 EXPECT_EQ(1, network_delegate.created_requests()); | 3909 EXPECT_EQ(1, network_delegate.created_requests()); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3974 | 3986 |
3975 { | 3987 { |
3976 GURL original_url(http_test_server()->GetURL("/defaultresponse")); | 3988 GURL original_url(http_test_server()->GetURL("/defaultresponse")); |
3977 std::unique_ptr<URLRequest> r( | 3989 std::unique_ptr<URLRequest> r( |
3978 context.CreateRequest(original_url, DEFAULT_PRIORITY, &d)); | 3990 context.CreateRequest(original_url, DEFAULT_PRIORITY, &d)); |
3979 | 3991 |
3980 r->Start(); | 3992 r->Start(); |
3981 base::RunLoop().Run(); | 3993 base::RunLoop().Run(); |
3982 | 3994 |
3983 EXPECT_EQ(OK, d.request_status()); | 3995 EXPECT_EQ(OK, d.request_status()); |
3984 EXPECT_TRUE(r->proxy_server().Equals(http_test_server()->host_port_pair())); | 3996 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP, |
| 3997 http_test_server()->host_port_pair()), |
| 3998 r->proxy_server()); |
3985 // before_send_headers_with_proxy_count only increments for headers sent | 3999 // before_send_headers_with_proxy_count only increments for headers sent |
3986 // through an untunneled proxy. | 4000 // through an untunneled proxy. |
3987 EXPECT_EQ(2, network_delegate.before_send_headers_with_proxy_count()); | 4001 EXPECT_EQ(2, network_delegate.before_send_headers_with_proxy_count()); |
3988 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals( | 4002 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals( |
3989 http_test_server()->host_port_pair())); | 4003 http_test_server()->host_port_pair())); |
3990 | 4004 |
3991 EXPECT_EQ(OK, d.request_status()); | 4005 EXPECT_EQ(OK, d.request_status()); |
3992 EXPECT_EQ(redirect_url, r->url()); | 4006 EXPECT_EQ(redirect_url, r->url()); |
3993 EXPECT_EQ(original_url, r->original_url()); | 4007 EXPECT_EQ(original_url, r->original_url()); |
3994 EXPECT_EQ(2U, r->url_chain().size()); | 4008 EXPECT_EQ(2U, r->url_chain().size()); |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4455 { | 4469 { |
4456 std::unique_ptr<URLRequest> r(context.CreateRequest( | 4470 std::unique_ptr<URLRequest> r(context.CreateRequest( |
4457 GURL("https://www.server-auth.com/"), DEFAULT_PRIORITY, &d)); | 4471 GURL("https://www.server-auth.com/"), DEFAULT_PRIORITY, &d)); |
4458 | 4472 |
4459 r->Start(); | 4473 r->Start(); |
4460 EXPECT_TRUE(r->is_pending()); | 4474 EXPECT_TRUE(r->is_pending()); |
4461 | 4475 |
4462 base::RunLoop().Run(); | 4476 base::RunLoop().Run(); |
4463 | 4477 |
4464 // The proxy server is not set before failure. | 4478 // The proxy server is not set before failure. |
4465 EXPECT_TRUE(r->proxy_server().IsEmpty()); | 4479 EXPECT_FALSE(r->proxy_server().is_valid()); |
4466 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status()); | 4480 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status()); |
4467 } | 4481 } |
4468 } | 4482 } |
4469 | 4483 |
4470 TEST_F(URLRequestTestHTTP, GetTest_NoCache) { | 4484 TEST_F(URLRequestTestHTTP, GetTest_NoCache) { |
4471 ASSERT_TRUE(http_test_server()->Start()); | 4485 ASSERT_TRUE(http_test_server()->Start()); |
4472 | 4486 |
4473 TestDelegate d; | 4487 TestDelegate d; |
4474 { | 4488 { |
4475 std::unique_ptr<URLRequest> r(default_context_.CreateRequest( | 4489 std::unique_ptr<URLRequest> r(default_context_.CreateRequest( |
(...skipping 5736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10212 AddTestInterceptor()->set_main_intercept_job(std::move(job)); | 10226 AddTestInterceptor()->set_main_intercept_job(std::move(job)); |
10213 | 10227 |
10214 req->Start(); | 10228 req->Start(); |
10215 req->Cancel(); | 10229 req->Cancel(); |
10216 base::RunLoop().RunUntilIdle(); | 10230 base::RunLoop().RunUntilIdle(); |
10217 EXPECT_EQ(ERR_ABORTED, d.request_status()); | 10231 EXPECT_EQ(ERR_ABORTED, d.request_status()); |
10218 EXPECT_EQ(0, d.received_redirect_count()); | 10232 EXPECT_EQ(0, d.received_redirect_count()); |
10219 } | 10233 } |
10220 | 10234 |
10221 } // namespace net | 10235 } // namespace net |
OLD | NEW |