Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(371)

Side by Side Diff: net/tools/quic/quic_client.cc

Issue 847813005: Updates quic_client_bin.cc to be more user friendly, and support more (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Refactoring_code_for_readability_83493327
Patch Set: Added DumpHeadersToString to dump response headers Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "net/tools/quic/quic_client.h" 5 #include "net/tools/quic/quic_client.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <netinet/in.h> 8 #include <netinet/in.h>
9 #include <string.h> 9 #include <string.h>
10 #include <sys/epoll.h> 10 #include <sys/epoll.h>
(...skipping 10 matching lines...) Expand all
21 #include "net/tools/balsa/balsa_headers.h" 21 #include "net/tools/balsa/balsa_headers.h"
22 #include "net/tools/epoll_server/epoll_server.h" 22 #include "net/tools/epoll_server/epoll_server.h"
23 #include "net/tools/quic/quic_epoll_connection_helper.h" 23 #include "net/tools/quic/quic_epoll_connection_helper.h"
24 #include "net/tools/quic/quic_socket_utils.h" 24 #include "net/tools/quic/quic_socket_utils.h"
25 #include "net/tools/quic/quic_spdy_client_stream.h" 25 #include "net/tools/quic/quic_spdy_client_stream.h"
26 26
27 #ifndef SO_RXQ_OVFL 27 #ifndef SO_RXQ_OVFL
28 #define SO_RXQ_OVFL 40 28 #define SO_RXQ_OVFL 40
29 #endif 29 #endif
30 30
31 using std::string;
32
31 namespace net { 33 namespace net {
32 namespace tools { 34 namespace tools {
33 35
34 const int kEpollFlags = EPOLLIN | EPOLLOUT | EPOLLET; 36 const int kEpollFlags = EPOLLIN | EPOLLOUT | EPOLLET;
35 37
36 QuicClient::QuicClient(IPEndPoint server_address, 38 QuicClient::QuicClient(IPEndPoint server_address,
37 const QuicServerId& server_id, 39 const QuicServerId& server_id,
38 const QuicVersionVector& supported_versions, 40 const QuicVersionVector& supported_versions,
39 bool print_response,
40 EpollServer* epoll_server) 41 EpollServer* epoll_server)
41 : server_address_(server_address), 42 : server_address_(server_address),
42 server_id_(server_id), 43 server_id_(server_id),
43 local_port_(0), 44 local_port_(0),
44 epoll_server_(epoll_server), 45 epoll_server_(epoll_server),
45 fd_(-1), 46 fd_(-1),
46 helper_(CreateQuicConnectionHelper()), 47 helper_(CreateQuicConnectionHelper()),
47 initialized_(false), 48 initialized_(false),
48 packets_dropped_(0), 49 packets_dropped_(0),
49 overflow_supported_(false), 50 overflow_supported_(false),
50 supported_versions_(supported_versions), 51 supported_versions_(supported_versions),
51 print_response_(print_response) { 52 store_response_(false),
53 latest_response_code_(-1) {
52 } 54 }
53 55
54 QuicClient::QuicClient(IPEndPoint server_address, 56 QuicClient::QuicClient(IPEndPoint server_address,
55 const QuicServerId& server_id, 57 const QuicServerId& server_id,
56 const QuicVersionVector& supported_versions, 58 const QuicVersionVector& supported_versions,
57 bool print_response,
58 const QuicConfig& config, 59 const QuicConfig& config,
59 EpollServer* epoll_server) 60 EpollServer* epoll_server)
60 : server_address_(server_address), 61 : server_address_(server_address),
61 server_id_(server_id), 62 server_id_(server_id),
62 config_(config), 63 config_(config),
63 local_port_(0), 64 local_port_(0),
64 epoll_server_(epoll_server), 65 epoll_server_(epoll_server),
65 fd_(-1), 66 fd_(-1),
66 helper_(CreateQuicConnectionHelper()), 67 helper_(CreateQuicConnectionHelper()),
67 initialized_(false), 68 initialized_(false),
68 packets_dropped_(0), 69 packets_dropped_(0),
69 overflow_supported_(false), 70 overflow_supported_(false),
70 supported_versions_(supported_versions), 71 supported_versions_(supported_versions),
71 print_response_(print_response) { 72 store_response_(false),
73 latest_response_code_(-1) {
72 } 74 }
73 75
74 QuicClient::~QuicClient() { 76 QuicClient::~QuicClient() {
75 if (connected()) { 77 if (connected()) {
76 session()->connection()->SendConnectionClosePacket( 78 session()->connection()->SendConnectionClosePacket(
77 QUIC_PEER_GOING_AWAY, ""); 79 QUIC_PEER_GOING_AWAY, "");
78 } 80 }
79 81
80 CleanUpUDPSocket(); 82 CleanUpUDPSocket();
81 } 83 }
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 } 240 }
239 241
240 void QuicClient::CleanUpUDPSocket() { 242 void QuicClient::CleanUpUDPSocket() {
241 if (fd_ > -1) { 243 if (fd_ > -1) {
242 epoll_server_->UnregisterFD(fd_); 244 epoll_server_->UnregisterFD(fd_);
243 close(fd_); 245 close(fd_);
244 fd_ = -1; 246 fd_ = -1;
245 } 247 }
246 } 248 }
247 249
250 void QuicClient::SendRequest(const BalsaHeaders& headers,
251 StringPiece body,
252 bool fin) {
253 QuicSpdyClientStream* stream = CreateReliableClientStream();
254 if (stream == nullptr) {
255 LOG(DFATAL) << "stream creation failed!";
256 return;
257 }
258 stream->SendRequest(headers, body, fin);
259 stream->set_visitor(this);
260 }
261
262 void QuicClient::SendRequestAndWaitForResponse(const BalsaHeaders& headers,
263 StringPiece body,
264 bool fin) {
265 SendRequest(headers, "", true);
266 while (WaitForEvents()) {
267 }
268 }
269
248 void QuicClient::SendRequestsAndWaitForResponse( 270 void QuicClient::SendRequestsAndWaitForResponse(
249 const base::CommandLine::StringVector& args) { 271 const base::CommandLine::StringVector& args) {
250 for (size_t i = 0; i < args.size(); ++i) { 272 for (size_t i = 0; i < args.size(); ++i) {
251 BalsaHeaders headers; 273 BalsaHeaders headers;
252 headers.SetRequestFirstlineFromStringPieces("GET", args[i], "HTTP/1.1"); 274 headers.SetRequestFirstlineFromStringPieces("GET", args[i], "HTTP/1.1");
253 QuicSpdyClientStream* stream = CreateReliableClientStream(); 275 SendRequest(headers, "", true);
254 DCHECK(stream != nullptr);
255 if (stream == nullptr) {
256 LOG(ERROR) << "stream creation failed!";
257 break;
258 }
259 stream->SendRequest(headers, "", true);
260 stream->set_visitor(this);
261 } 276 }
262
263 while (WaitForEvents()) {} 277 while (WaitForEvents()) {}
264 } 278 }
265 279
266 QuicSpdyClientStream* QuicClient::CreateReliableClientStream() { 280 QuicSpdyClientStream* QuicClient::CreateReliableClientStream() {
267 if (!connected()) { 281 if (!connected()) {
268 return nullptr; 282 return nullptr;
269 } 283 }
270 284
271 return session_->CreateOutgoingDataStream(); 285 return session_->CreateOutgoingDataStream();
272 } 286 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 } 325 }
312 326
313 void QuicClient::OnClose(QuicDataStream* stream) { 327 void QuicClient::OnClose(QuicDataStream* stream) {
314 QuicSpdyClientStream* client_stream = 328 QuicSpdyClientStream* client_stream =
315 static_cast<QuicSpdyClientStream*>(stream); 329 static_cast<QuicSpdyClientStream*>(stream);
316 if (response_listener_.get() != nullptr) { 330 if (response_listener_.get() != nullptr) {
317 response_listener_->OnCompleteResponse( 331 response_listener_->OnCompleteResponse(
318 stream->id(), client_stream->headers(), client_stream->data()); 332 stream->id(), client_stream->headers(), client_stream->data());
319 } 333 }
320 334
321 if (!print_response_) { 335 // Store response headers and body.
322 return; 336 if (store_response_) {
337 latest_response_code_ = client_stream->headers().parsed_response_code();
338 client_stream->headers().DumpHeadersToString(&latest_response_headers_);
339 latest_response_body_ = client_stream->data();
323 } 340 }
324
325 const BalsaHeaders& headers = client_stream->headers();
326 printf("%s\n", headers.first_line().as_string().c_str());
327 for (BalsaHeaders::const_header_lines_iterator i =
328 headers.header_lines_begin();
329 i != headers.header_lines_end(); ++i) {
330 printf("%s: %s\n", i->first.as_string().c_str(),
331 i->second.as_string().c_str());
332 }
333 printf("%s\n", client_stream->data().c_str());
334 } 341 }
335 342
336 bool QuicClient::connected() const { 343 bool QuicClient::connected() const {
337 return session_.get() && session_->connection() && 344 return session_.get() && session_->connection() &&
338 session_->connection()->connected(); 345 session_->connection()->connected();
339 } 346 }
340 347
341 bool QuicClient::goaway_received() const { 348 bool QuicClient::goaway_received() const {
342 return session_ != nullptr && session_->goaway_received(); 349 return session_ != nullptr && session_->goaway_received();
343 } 350 }
344 351
352 size_t QuicClient::latest_response_code() const {
353 LOG_IF(DFATAL, !store_response_) << "Response not stored!";
354 return latest_response_code_;
355 }
356
357 const string& QuicClient::latest_response_headers() const {
358 LOG_IF(DFATAL, !store_response_) << "Response not stored!";
359 return latest_response_headers_;
360 }
361
362 const string& QuicClient::latest_response_body() const {
363 LOG_IF(DFATAL, !store_response_) << "Response not stored!";
364 return latest_response_body_;
365 }
366
345 QuicConnectionId QuicClient::GenerateConnectionId() { 367 QuicConnectionId QuicClient::GenerateConnectionId() {
346 return QuicRandom::GetInstance()->RandUint64(); 368 return QuicRandom::GetInstance()->RandUint64();
347 } 369 }
348 370
349 QuicEpollConnectionHelper* QuicClient::CreateQuicConnectionHelper() { 371 QuicEpollConnectionHelper* QuicClient::CreateQuicConnectionHelper() {
350 return new QuicEpollConnectionHelper(epoll_server_); 372 return new QuicEpollConnectionHelper(epoll_server_);
351 } 373 }
352 374
353 QuicPacketWriter* QuicClient::CreateQuicPacketWriter() { 375 QuicPacketWriter* QuicClient::CreateQuicPacketWriter() {
354 return new QuicDefaultPacketWriter(fd_); 376 return new QuicDefaultPacketWriter(fd_);
(...skipping 26 matching lines...) Expand all
381 QuicEncryptedPacket packet(buf, bytes_read, false); 403 QuicEncryptedPacket packet(buf, bytes_read, false);
382 404
383 IPEndPoint client_address(client_ip, client_address_.port()); 405 IPEndPoint client_address(client_ip, client_address_.port());
384 session_->connection()->ProcessUdpPacket( 406 session_->connection()->ProcessUdpPacket(
385 client_address, server_address, packet); 407 client_address, server_address, packet);
386 return true; 408 return true;
387 } 409 }
388 410
389 } // namespace tools 411 } // namespace tools
390 } // namespace net 412 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698