| 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 // A binary wrapper for QuicClient. | 5 // A binary wrapper for QuicClient. |
| 6 // Connects to a host using QUIC, sends a request to the provided URL, and | 6 // Connects to a host using QUIC, sends a request to the provided URL, and |
| 7 // displays the response. | 7 // displays the response. |
| 8 // | 8 // |
| 9 // Some usage examples: | 9 // Some usage examples: |
| 10 // | 10 // |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 #include "base/message_loop/message_loop.h" | 46 #include "base/message_loop/message_loop.h" |
| 47 #include "net/base/net_errors.h" | 47 #include "net/base/net_errors.h" |
| 48 #include "net/base/privacy_mode.h" | 48 #include "net/base/privacy_mode.h" |
| 49 #include "net/cert/cert_verifier.h" | 49 #include "net/cert/cert_verifier.h" |
| 50 #include "net/cert/multi_log_ct_verifier.h" | 50 #include "net/cert/multi_log_ct_verifier.h" |
| 51 #include "net/http/transport_security_state.h" | 51 #include "net/http/transport_security_state.h" |
| 52 #include "net/quic/chromium/crypto/proof_verifier_chromium.h" | 52 #include "net/quic/chromium/crypto/proof_verifier_chromium.h" |
| 53 #include "net/quic/core/quic_flags.h" | 53 #include "net/quic/core/quic_flags.h" |
| 54 #include "net/quic/core/quic_packets.h" | 54 #include "net/quic/core/quic_packets.h" |
| 55 #include "net/quic/core/quic_server_id.h" | 55 #include "net/quic/core/quic_server_id.h" |
| 56 #include "net/quic/core/quic_utils.h" | |
| 57 #include "net/quic/platform/api/quic_socket_address.h" | 56 #include "net/quic/platform/api/quic_socket_address.h" |
| 58 #include "net/quic/platform/api/quic_str_cat.h" | 57 #include "net/quic/platform/api/quic_str_cat.h" |
| 59 #include "net/quic/platform/api/quic_text_utils.h" | 58 #include "net/quic/platform/api/quic_text_utils.h" |
| 60 #include "net/spdy/spdy_header_block.h" | 59 #include "net/spdy/spdy_header_block.h" |
| 61 #include "net/tools/epoll_server/epoll_server.h" | 60 #include "net/tools/epoll_server/epoll_server.h" |
| 62 #include "net/tools/quic/quic_client.h" | 61 #include "net/tools/quic/quic_client.h" |
| 63 #include "net/tools/quic/synchronous_host_resolver.h" | 62 #include "net/tools/quic/synchronous_host_resolver.h" |
| 64 #include "url/gurl.h" | 63 #include "url/gurl.h" |
| 65 | 64 |
| 66 using base::StringPiece; | 65 using base::StringPiece; |
| 67 using net::CertVerifier; | 66 using net::CertVerifier; |
| 68 using net::CTPolicyEnforcer; | 67 using net::CTPolicyEnforcer; |
| 69 using net::CTVerifier; | 68 using net::CTVerifier; |
| 70 using net::MultiLogCTVerifier; | 69 using net::MultiLogCTVerifier; |
| 71 using net::ProofVerifier; | 70 using net::ProofVerifier; |
| 72 using net::ProofVerifierChromium; | 71 using net::ProofVerifierChromium; |
| 72 using net::QuicTextUtils; |
| 73 using net::SpdyHeaderBlock; | 73 using net::SpdyHeaderBlock; |
| 74 using net::TransportSecurityState; | 74 using net::TransportSecurityState; |
| 75 using net::QuicTextUtils; | |
| 76 using std::cout; | 75 using std::cout; |
| 77 using std::cerr; | 76 using std::cerr; |
| 77 using std::endl; |
| 78 using std::string; | 78 using std::string; |
| 79 using std::endl; | |
| 80 | 79 |
| 81 // The IP or hostname the quic client will connect to. | 80 // The IP or hostname the quic client will connect to. |
| 82 string FLAGS_host = ""; | 81 string FLAGS_host = ""; |
| 83 // The port to connect to. | 82 // The port to connect to. |
| 84 int32_t FLAGS_port = 0; | 83 int32_t FLAGS_port = 0; |
| 85 // If set, send a POST with this body. | 84 // If set, send a POST with this body. |
| 86 string FLAGS_body = ""; | 85 string FLAGS_body = ""; |
| 87 // If set, contents are converted from hex to ascii, before sending as body of | 86 // If set, contents are converted from hex to ascii, before sending as body of |
| 88 // a POST. e.g. --body_hex=\"68656c6c6f\" | 87 // a POST. e.g. --body_hex=\"68656c6c6f\" |
| 89 string FLAGS_body_hex = ""; | 88 string FLAGS_body_hex = ""; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 net::PRIVACY_MODE_DISABLED); | 252 net::PRIVACY_MODE_DISABLED); |
| 254 net::QuicVersionVector versions = net::AllSupportedVersions(); | 253 net::QuicVersionVector versions = net::AllSupportedVersions(); |
| 255 if (FLAGS_quic_version != -1) { | 254 if (FLAGS_quic_version != -1) { |
| 256 versions.clear(); | 255 versions.clear(); |
| 257 versions.push_back(static_cast<net::QuicVersion>(FLAGS_quic_version)); | 256 versions.push_back(static_cast<net::QuicVersion>(FLAGS_quic_version)); |
| 258 } | 257 } |
| 259 // For secure QUIC we need to verify the cert chain. | 258 // For secure QUIC we need to verify the cert chain. |
| 260 std::unique_ptr<CertVerifier> cert_verifier(CertVerifier::CreateDefault()); | 259 std::unique_ptr<CertVerifier> cert_verifier(CertVerifier::CreateDefault()); |
| 261 std::unique_ptr<TransportSecurityState> transport_security_state( | 260 std::unique_ptr<TransportSecurityState> transport_security_state( |
| 262 new TransportSecurityState); | 261 new TransportSecurityState); |
| 263 transport_security_state.reset(new TransportSecurityState); | |
| 264 std::unique_ptr<CTVerifier> ct_verifier(new MultiLogCTVerifier()); | 262 std::unique_ptr<CTVerifier> ct_verifier(new MultiLogCTVerifier()); |
| 265 std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer(new CTPolicyEnforcer()); | 263 std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer(new CTPolicyEnforcer()); |
| 266 std::unique_ptr<ProofVerifier> proof_verifier; | 264 std::unique_ptr<ProofVerifier> proof_verifier; |
| 267 if (line->HasSwitch("disable-certificate-verification")) { | 265 if (line->HasSwitch("disable-certificate-verification")) { |
| 268 proof_verifier.reset(new FakeProofVerifier()); | 266 proof_verifier.reset(new FakeProofVerifier()); |
| 269 } else { | 267 } else { |
| 270 proof_verifier.reset(new ProofVerifierChromium( | 268 proof_verifier.reset(new ProofVerifierChromium( |
| 271 cert_verifier.get(), ct_policy_enforcer.get(), | 269 cert_verifier.get(), ct_policy_enforcer.get(), |
| 272 transport_security_state.get(), ct_verifier.get())); | 270 transport_security_state.get(), ct_verifier.get())); |
| 273 } | 271 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 continue; | 312 continue; |
| 315 } | 313 } |
| 316 std::vector<StringPiece> kv = QuicTextUtils::Split(sp, ':'); | 314 std::vector<StringPiece> kv = QuicTextUtils::Split(sp, ':'); |
| 317 QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&kv[0]); | 315 QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&kv[0]); |
| 318 QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&kv[1]); | 316 QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&kv[1]); |
| 319 header_block[kv[0]] = kv[1]; | 317 header_block[kv[0]] = kv[1]; |
| 320 } | 318 } |
| 321 | 319 |
| 322 // Make sure to store the response, for later output. | 320 // Make sure to store the response, for later output. |
| 323 client.set_store_response(true); | 321 client.set_store_response(true); |
| 322 |
| 324 // Send the request. | 323 // Send the request. |
| 325 client.SendRequestAndWaitForResponse(header_block, body, /*fin=*/true); | 324 client.SendRequestAndWaitForResponse(header_block, body, /*fin=*/true); |
| 326 | 325 |
| 327 // Print request and response details. | 326 // Print request and response details. |
| 328 if (!FLAGS_quiet) { | 327 if (!FLAGS_quiet) { |
| 329 cout << "Request:" << endl; | 328 cout << "Request:" << endl; |
| 330 cout << "headers:" << header_block.DebugString(); | 329 cout << "headers:" << header_block.DebugString(); |
| 331 if (!FLAGS_body_hex.empty()) { | 330 if (!FLAGS_body_hex.empty()) { |
| 332 // Print the user provided hex, rather than binary body. | 331 // Print the user provided hex, rather than binary body. |
| 333 cout << "body:\n" | 332 cout << "body:\n" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 359 return 0; | 358 return 0; |
| 360 } else { | 359 } else { |
| 361 cout << "Request failed (redirect " << response_code << ")." << endl; | 360 cout << "Request failed (redirect " << response_code << ")." << endl; |
| 362 return 1; | 361 return 1; |
| 363 } | 362 } |
| 364 } else { | 363 } else { |
| 365 cerr << "Request failed (" << response_code << ")." << endl; | 364 cerr << "Request failed (" << response_code << ")." << endl; |
| 366 return 1; | 365 return 1; |
| 367 } | 366 } |
| 368 } | 367 } |
| OLD | NEW |