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 "net/tools/quic/test_tools/quic_test_client.h" | 5 #include "net/tools/quic/test_tools/quic_test_client.h" |
6 | 6 |
7 #include "base/time/time.h" | 7 #include "base/time/time.h" |
8 #include "net/base/completion_callback.h" | 8 #include "net/base/completion_callback.h" |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/cert/cert_verify_result.h" | 10 #include "net/cert/cert_verify_result.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 private: | 75 private: |
76 string common_name_; | 76 string common_name_; |
77 }; | 77 }; |
78 | 78 |
79 } // anonymous namespace | 79 } // anonymous namespace |
80 | 80 |
81 BalsaHeaders* MungeHeaders(const BalsaHeaders* const_headers, | 81 BalsaHeaders* MungeHeaders(const BalsaHeaders* const_headers, |
82 bool secure) { | 82 bool secure) { |
83 StringPiece uri = const_headers->request_uri(); | 83 StringPiece uri = const_headers->request_uri(); |
84 if (uri.empty()) { | 84 if (uri.empty()) { |
85 return NULL; | 85 return nullptr; |
86 } | 86 } |
87 if (const_headers->request_method() == "CONNECT") { | 87 if (const_headers->request_method() == "CONNECT") { |
88 return NULL; | 88 return nullptr; |
89 } | 89 } |
90 BalsaHeaders* headers = new BalsaHeaders; | 90 BalsaHeaders* headers = new BalsaHeaders; |
91 headers->CopyFrom(*const_headers); | 91 headers->CopyFrom(*const_headers); |
92 if (!uri.starts_with("https://") && | 92 if (!uri.starts_with("https://") && |
93 !uri.starts_with("http://")) { | 93 !uri.starts_with("http://")) { |
94 // If we have a relative URL, set some defaults. | 94 // If we have a relative URL, set some defaults. |
95 string full_uri = secure ? "https://www.google.com" : | 95 string full_uri = secure ? "https://www.google.com" : |
96 "http://www.google.com"; | 96 "http://www.google.com"; |
97 full_uri.append(uri.as_string()); | 97 full_uri.append(uri.as_string()); |
98 headers->SetRequestUri(full_uri); | 98 headers->SetRequestUri(full_uri); |
99 } | 99 } |
100 return headers; | 100 return headers; |
101 } | 101 } |
102 | 102 |
103 MockableQuicClient::MockableQuicClient( | 103 MockableQuicClient::MockableQuicClient( |
104 IPEndPoint server_address, | 104 IPEndPoint server_address, |
105 const QuicServerId& server_id, | 105 const QuicServerId& server_id, |
106 const QuicVersionVector& supported_versions, | 106 const QuicVersionVector& supported_versions, |
107 EpollServer* epoll_server) | 107 EpollServer* epoll_server) |
108 : QuicClient(server_address, | 108 : QuicClient(server_address, |
109 server_id, | 109 server_id, |
110 supported_versions, | 110 supported_versions, |
111 false, | 111 false, |
112 epoll_server), | 112 epoll_server), |
113 override_connection_id_(0), | 113 override_connection_id_(0), |
114 test_writer_(NULL) {} | 114 test_writer_(nullptr) {} |
115 | 115 |
116 MockableQuicClient::MockableQuicClient( | 116 MockableQuicClient::MockableQuicClient( |
117 IPEndPoint server_address, | 117 IPEndPoint server_address, |
118 const QuicServerId& server_id, | 118 const QuicServerId& server_id, |
119 const QuicConfig& config, | 119 const QuicConfig& config, |
120 const QuicVersionVector& supported_versions, | 120 const QuicVersionVector& supported_versions, |
121 EpollServer* epoll_server) | 121 EpollServer* epoll_server) |
122 : QuicClient(server_address, | 122 : QuicClient(server_address, |
123 server_id, | 123 server_id, |
124 supported_versions, | 124 supported_versions, |
125 false, | 125 false, |
126 config, | 126 config, |
127 epoll_server), | 127 epoll_server), |
128 override_connection_id_(0), | 128 override_connection_id_(0), |
129 test_writer_(NULL) {} | 129 test_writer_(nullptr) {} |
130 | 130 |
131 MockableQuicClient::~MockableQuicClient() { | 131 MockableQuicClient::~MockableQuicClient() { |
132 if (connected()) { | 132 if (connected()) { |
133 Disconnect(); | 133 Disconnect(); |
134 } | 134 } |
135 } | 135 } |
136 | 136 |
137 QuicPacketWriter* MockableQuicClient::CreateQuicPacketWriter() { | 137 QuicPacketWriter* MockableQuicClient::CreateQuicPacketWriter() { |
138 QuicPacketWriter* writer = QuicClient::CreateQuicPacketWriter(); | 138 QuicPacketWriter* writer = QuicClient::CreateQuicPacketWriter(); |
139 if (!test_writer_) { | 139 if (!test_writer_) { |
140 return writer; | 140 return writer; |
141 } | 141 } |
142 test_writer_->set_writer(writer); | 142 test_writer_->set_writer(writer); |
143 return test_writer_; | 143 return test_writer_; |
144 } | 144 } |
145 | 145 |
146 QuicConnectionId MockableQuicClient::GenerateConnectionId() { | 146 QuicConnectionId MockableQuicClient::GenerateConnectionId() { |
147 return override_connection_id_ ? override_connection_id_ | 147 return override_connection_id_ ? override_connection_id_ |
148 : QuicClient::GenerateConnectionId(); | 148 : QuicClient::GenerateConnectionId(); |
149 } | 149 } |
150 | 150 |
151 // Takes ownership of writer. | 151 // Takes ownership of writer. |
152 void MockableQuicClient::UseWriter(QuicPacketWriterWrapper* writer) { | 152 void MockableQuicClient::UseWriter(QuicPacketWriterWrapper* writer) { |
153 CHECK(test_writer_ == NULL); | 153 CHECK(test_writer_ == nullptr); |
154 test_writer_ = writer; | 154 test_writer_ = writer; |
155 } | 155 } |
156 | 156 |
157 void MockableQuicClient::UseConnectionId(QuicConnectionId connection_id) { | 157 void MockableQuicClient::UseConnectionId(QuicConnectionId connection_id) { |
158 override_connection_id_ = connection_id; | 158 override_connection_id_ = connection_id; |
159 } | 159 } |
160 | 160 |
161 QuicTestClient::QuicTestClient(IPEndPoint server_address, | 161 QuicTestClient::QuicTestClient(IPEndPoint server_address, |
162 const string& server_hostname, | 162 const string& server_hostname, |
163 const QuicVersionVector& supported_versions) | 163 const QuicVersionVector& supported_versions) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 supported_versions, | 201 supported_versions, |
202 &epoll_server_)) { | 202 &epoll_server_)) { |
203 Initialize(secure); | 203 Initialize(secure); |
204 } | 204 } |
205 | 205 |
206 QuicTestClient::QuicTestClient() { | 206 QuicTestClient::QuicTestClient() { |
207 } | 207 } |
208 | 208 |
209 QuicTestClient::~QuicTestClient() { | 209 QuicTestClient::~QuicTestClient() { |
210 if (stream_) { | 210 if (stream_) { |
211 stream_->set_visitor(NULL); | 211 stream_->set_visitor(nullptr); |
212 } | 212 } |
213 } | 213 } |
214 | 214 |
215 void QuicTestClient::Initialize(bool secure) { | 215 void QuicTestClient::Initialize(bool secure) { |
216 priority_ = 3; | 216 priority_ = 3; |
217 connect_attempted_ = false; | 217 connect_attempted_ = false; |
218 secure_ = secure; | 218 secure_ = secure; |
219 auto_reconnect_ = false; | 219 auto_reconnect_ = false; |
220 buffer_body_ = true; | 220 buffer_body_ = true; |
221 fec_policy_ = FEC_PROTECT_OPTIONAL; | 221 fec_policy_ = FEC_PROTECT_OPTIONAL; |
222 proof_verifier_ = NULL; | 222 proof_verifier_ = nullptr; |
223 ClearPerRequestState(); | 223 ClearPerRequestState(); |
224 ExpectCertificates(secure_); | 224 ExpectCertificates(secure_); |
225 } | 225 } |
226 | 226 |
227 void QuicTestClient::ExpectCertificates(bool on) { | 227 void QuicTestClient::ExpectCertificates(bool on) { |
228 if (on) { | 228 if (on) { |
229 proof_verifier_ = new RecordingProofVerifier; | 229 proof_verifier_ = new RecordingProofVerifier; |
230 client_->SetProofVerifier(proof_verifier_); | 230 client_->SetProofVerifier(proof_verifier_); |
231 } else { | 231 } else { |
232 proof_verifier_ = NULL; | 232 proof_verifier_ = nullptr; |
233 client_->SetProofVerifier(NULL); | 233 client_->SetProofVerifier(nullptr); |
234 } | 234 } |
235 } | 235 } |
236 | 236 |
237 void QuicTestClient::SetUserAgentID(const string& user_agent_id) { | 237 void QuicTestClient::SetUserAgentID(const string& user_agent_id) { |
238 client_->SetUserAgentID(user_agent_id); | 238 client_->SetUserAgentID(user_agent_id); |
239 } | 239 } |
240 | 240 |
241 ssize_t QuicTestClient::SendRequest(const string& uri) { | 241 ssize_t QuicTestClient::SendRequest(const string& uri) { |
242 HTTPMessage message(HttpConstants::HTTP_1_1, | 242 HTTPMessage message(HttpConstants::HTTP_1_1, |
243 HttpConstants::GET, | 243 HttpConstants::GET, |
244 uri); | 244 uri); |
245 return SendMessage(message); | 245 return SendMessage(message); |
246 } | 246 } |
247 | 247 |
248 ssize_t QuicTestClient::SendMessage(const HTTPMessage& message) { | 248 ssize_t QuicTestClient::SendMessage(const HTTPMessage& message) { |
249 stream_ = NULL; // Always force creation of a stream for SendMessage. | 249 stream_ = nullptr; // Always force creation of a stream for SendMessage. |
250 | 250 |
251 // If we're not connected, try to find an sni hostname. | 251 // If we're not connected, try to find an sni hostname. |
252 if (!connected()) { | 252 if (!connected()) { |
253 GURL url(message.headers()->request_uri().as_string()); | 253 GURL url(message.headers()->request_uri().as_string()); |
254 if (!url.host().empty()) { | 254 if (!url.host().empty()) { |
255 client_->set_server_id( | 255 client_->set_server_id( |
256 QuicServerId(url.host(), | 256 QuicServerId(url.host(), |
257 url.EffectiveIntPort(), | 257 url.EffectiveIntPort(), |
258 url.SchemeIs("https"), | 258 url.SchemeIs("https"), |
259 PRIVACY_MODE_DISABLED)); | 259 PRIVACY_MODE_DISABLED)); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 WaitForResponse(); | 324 WaitForResponse(); |
325 return response_; | 325 return response_; |
326 } | 326 } |
327 | 327 |
328 QuicSpdyClientStream* QuicTestClient::GetOrCreateStream() { | 328 QuicSpdyClientStream* QuicTestClient::GetOrCreateStream() { |
329 if (!connect_attempted_ || auto_reconnect_) { | 329 if (!connect_attempted_ || auto_reconnect_) { |
330 if (!connected()) { | 330 if (!connected()) { |
331 Connect(); | 331 Connect(); |
332 } | 332 } |
333 if (!connected()) { | 333 if (!connected()) { |
334 return NULL; | 334 return nullptr; |
335 } | 335 } |
336 } | 336 } |
337 if (!stream_) { | 337 if (!stream_) { |
338 stream_ = client_->CreateReliableClientStream(); | 338 stream_ = client_->CreateReliableClientStream(); |
339 if (stream_ == NULL) { | 339 if (stream_ == nullptr) { |
340 return NULL; | 340 return nullptr; |
341 } | 341 } |
342 stream_->set_visitor(this); | 342 stream_->set_visitor(this); |
343 reinterpret_cast<QuicSpdyClientStream*>(stream_)->set_priority(priority_); | 343 reinterpret_cast<QuicSpdyClientStream*>(stream_)->set_priority(priority_); |
344 // Set FEC policy on stream. | 344 // Set FEC policy on stream. |
345 ReliableQuicStreamPeer::SetFecPolicy(stream_, fec_policy_); | 345 ReliableQuicStreamPeer::SetFecPolicy(stream_, fec_policy_); |
346 } | 346 } |
347 | 347 |
348 return stream_; | 348 return stream_; |
349 } | 349 } |
350 | 350 |
351 QuicErrorCode QuicTestClient::connection_error() { | 351 QuicErrorCode QuicTestClient::connection_error() { |
352 return client()->session()->error(); | 352 return client()->session()->error(); |
353 } | 353 } |
354 | 354 |
355 MockableQuicClient* QuicTestClient::client() { return client_.get(); } | 355 MockableQuicClient* QuicTestClient::client() { return client_.get(); } |
356 | 356 |
357 const string& QuicTestClient::cert_common_name() const { | 357 const string& QuicTestClient::cert_common_name() const { |
358 return reinterpret_cast<RecordingProofVerifier*>(proof_verifier_) | 358 return reinterpret_cast<RecordingProofVerifier*>(proof_verifier_) |
359 ->common_name(); | 359 ->common_name(); |
360 } | 360 } |
361 | 361 |
362 QuicTagValueMap QuicTestClient::GetServerConfig() const { | 362 QuicTagValueMap QuicTestClient::GetServerConfig() const { |
363 QuicCryptoClientConfig* config = | 363 QuicCryptoClientConfig* config = |
364 QuicClientPeer::GetCryptoConfig(client_.get()); | 364 QuicClientPeer::GetCryptoConfig(client_.get()); |
365 QuicCryptoClientConfig::CachedState* state = | 365 QuicCryptoClientConfig::CachedState* state = |
366 config->LookupOrCreate(client_->server_id()); | 366 config->LookupOrCreate(client_->server_id()); |
367 const CryptoHandshakeMessage* handshake_msg = state->GetServerConfig(); | 367 const CryptoHandshakeMessage* handshake_msg = state->GetServerConfig(); |
368 if (handshake_msg != NULL) { | 368 if (handshake_msg != nullptr) { |
369 return handshake_msg->tag_value_map(); | 369 return handshake_msg->tag_value_map(); |
370 } else { | 370 } else { |
371 return QuicTagValueMap(); | 371 return QuicTagValueMap(); |
372 } | 372 } |
373 } | 373 } |
374 | 374 |
375 bool QuicTestClient::connected() const { | 375 bool QuicTestClient::connected() const { |
376 return client_->connected(); | 376 return client_->connected(); |
377 } | 377 } |
378 | 378 |
(...skipping 15 matching lines...) Expand all Loading... |
394 client_->Disconnect(); | 394 client_->Disconnect(); |
395 connect_attempted_ = false; | 395 connect_attempted_ = false; |
396 } | 396 } |
397 | 397 |
398 IPEndPoint QuicTestClient::LocalSocketAddress() const { | 398 IPEndPoint QuicTestClient::LocalSocketAddress() const { |
399 return client_->client_address(); | 399 return client_->client_address(); |
400 } | 400 } |
401 | 401 |
402 void QuicTestClient::ClearPerRequestState() { | 402 void QuicTestClient::ClearPerRequestState() { |
403 stream_error_ = QUIC_STREAM_NO_ERROR; | 403 stream_error_ = QUIC_STREAM_NO_ERROR; |
404 stream_ = NULL; | 404 stream_ = nullptr; |
405 response_ = ""; | 405 response_ = ""; |
406 response_complete_ = false; | 406 response_complete_ = false; |
407 response_headers_complete_ = false; | 407 response_headers_complete_ = false; |
408 headers_.Clear(); | 408 headers_.Clear(); |
409 bytes_read_ = 0; | 409 bytes_read_ = 0; |
410 bytes_written_ = 0; | 410 bytes_written_ = 0; |
411 response_header_size_ = 0; | 411 response_header_size_ = 0; |
412 response_body_size_ = 0; | 412 response_body_size_ = 0; |
413 } | 413 } |
414 | 414 |
415 void QuicTestClient::WaitForResponseForMs(int timeout_ms) { | 415 void QuicTestClient::WaitForResponseForMs(int timeout_ms) { |
416 int64 timeout_us = timeout_ms * base::Time::kMicrosecondsPerMillisecond; | 416 int64 timeout_us = timeout_ms * base::Time::kMicrosecondsPerMillisecond; |
417 int64 old_timeout_us = epoll_server()->timeout_in_us(); | 417 int64 old_timeout_us = epoll_server()->timeout_in_us(); |
418 if (timeout_us > 0) { | 418 if (timeout_us > 0) { |
419 epoll_server()->set_timeout_in_us(timeout_us); | 419 epoll_server()->set_timeout_in_us(timeout_us); |
420 } | 420 } |
421 const QuicClock* clock = | 421 const QuicClock* clock = |
422 QuicConnectionPeer::GetHelper(client()->session()->connection())-> | 422 QuicConnectionPeer::GetHelper(client()->session()->connection())-> |
423 GetClock(); | 423 GetClock(); |
424 QuicTime end_waiting_time = clock->Now().Add( | 424 QuicTime end_waiting_time = clock->Now().Add( |
425 QuicTime::Delta::FromMicroseconds(timeout_us)); | 425 QuicTime::Delta::FromMicroseconds(timeout_us)); |
426 while (stream_ != NULL && | 426 while (stream_ != nullptr && |
427 !client_->session()->IsClosedStream(stream_->id()) && | 427 !client_->session()->IsClosedStream(stream_->id()) && |
428 (timeout_us < 0 || clock->Now() < end_waiting_time)) { | 428 (timeout_us < 0 || clock->Now() < end_waiting_time)) { |
429 client_->WaitForEvents(); | 429 client_->WaitForEvents(); |
430 } | 430 } |
431 if (timeout_us > 0) { | 431 if (timeout_us > 0) { |
432 epoll_server()->set_timeout_in_us(old_timeout_us); | 432 epoll_server()->set_timeout_in_us(old_timeout_us); |
433 } | 433 } |
434 } | 434 } |
435 | 435 |
436 void QuicTestClient::WaitForInitialResponseForMs(int timeout_ms) { | 436 void QuicTestClient::WaitForInitialResponseForMs(int timeout_ms) { |
437 int64 timeout_us = timeout_ms * base::Time::kMicrosecondsPerMillisecond; | 437 int64 timeout_us = timeout_ms * base::Time::kMicrosecondsPerMillisecond; |
438 int64 old_timeout_us = epoll_server()->timeout_in_us(); | 438 int64 old_timeout_us = epoll_server()->timeout_in_us(); |
439 if (timeout_us > 0) { | 439 if (timeout_us > 0) { |
440 epoll_server()->set_timeout_in_us(timeout_us); | 440 epoll_server()->set_timeout_in_us(timeout_us); |
441 } | 441 } |
442 const QuicClock* clock = | 442 const QuicClock* clock = |
443 QuicConnectionPeer::GetHelper(client()->session()->connection())-> | 443 QuicConnectionPeer::GetHelper(client()->session()->connection())-> |
444 GetClock(); | 444 GetClock(); |
445 QuicTime end_waiting_time = clock->Now().Add( | 445 QuicTime end_waiting_time = clock->Now().Add( |
446 QuicTime::Delta::FromMicroseconds(timeout_us)); | 446 QuicTime::Delta::FromMicroseconds(timeout_us)); |
447 while (stream_ != NULL && | 447 while (stream_ != nullptr && |
448 !client_->session()->IsClosedStream(stream_->id()) && | 448 !client_->session()->IsClosedStream(stream_->id()) && |
449 stream_->stream_bytes_read() == 0 && | 449 stream_->stream_bytes_read() == 0 && |
450 (timeout_us < 0 || clock->Now() < end_waiting_time)) { | 450 (timeout_us < 0 || clock->Now() < end_waiting_time)) { |
451 client_->WaitForEvents(); | 451 client_->WaitForEvents(); |
452 } | 452 } |
453 if (timeout_us > 0) { | 453 if (timeout_us > 0) { |
454 epoll_server()->set_timeout_in_us(old_timeout_us); | 454 epoll_server()->set_timeout_in_us(old_timeout_us); |
455 } | 455 } |
456 } | 456 } |
457 | 457 |
458 ssize_t QuicTestClient::Send(const void *buffer, size_t size) { | 458 ssize_t QuicTestClient::Send(const void *buffer, size_t size) { |
459 return SendData(string(static_cast<const char*>(buffer), size), false); | 459 return SendData(string(static_cast<const char*>(buffer), size), false); |
460 } | 460 } |
461 | 461 |
462 bool QuicTestClient::response_headers_complete() const { | 462 bool QuicTestClient::response_headers_complete() const { |
463 if (stream_ != NULL) { | 463 if (stream_ != nullptr) { |
464 return stream_->headers_decompressed(); | 464 return stream_->headers_decompressed(); |
465 } else { | 465 } else { |
466 return response_headers_complete_; | 466 return response_headers_complete_; |
467 } | 467 } |
468 } | 468 } |
469 | 469 |
470 const BalsaHeaders* QuicTestClient::response_headers() const { | 470 const BalsaHeaders* QuicTestClient::response_headers() const { |
471 if (stream_ != NULL) { | 471 if (stream_ != nullptr) { |
472 return &stream_->headers(); | 472 return &stream_->headers(); |
473 } else { | 473 } else { |
474 return &headers_; | 474 return &headers_; |
475 } | 475 } |
476 } | 476 } |
477 | 477 |
478 int64 QuicTestClient::response_size() const { | 478 int64 QuicTestClient::response_size() const { |
479 return bytes_read_; | 479 return bytes_read_; |
480 } | 480 } |
481 | 481 |
(...skipping 15 matching lines...) Expand all Loading... |
497 } | 497 } |
498 response_complete_ = true; | 498 response_complete_ = true; |
499 response_headers_complete_ = stream_->headers_decompressed(); | 499 response_headers_complete_ = stream_->headers_decompressed(); |
500 headers_.CopyFrom(stream_->headers()); | 500 headers_.CopyFrom(stream_->headers()); |
501 stream_error_ = stream_->stream_error(); | 501 stream_error_ = stream_->stream_error(); |
502 bytes_read_ = stream_->stream_bytes_read() + stream_->header_bytes_read(); | 502 bytes_read_ = stream_->stream_bytes_read() + stream_->header_bytes_read(); |
503 bytes_written_ = | 503 bytes_written_ = |
504 stream_->stream_bytes_written() + stream_->header_bytes_written(); | 504 stream_->stream_bytes_written() + stream_->header_bytes_written(); |
505 response_header_size_ = headers_.GetSizeForWriteBuffer(); | 505 response_header_size_ = headers_.GetSizeForWriteBuffer(); |
506 response_body_size_ = stream_->data().size(); | 506 response_body_size_ = stream_->data().size(); |
507 stream_ = NULL; | 507 stream_ = nullptr; |
508 } | 508 } |
509 | 509 |
510 void QuicTestClient::UseWriter(QuicPacketWriterWrapper* writer) { | 510 void QuicTestClient::UseWriter(QuicPacketWriterWrapper* writer) { |
511 client_->UseWriter(writer); | 511 client_->UseWriter(writer); |
512 } | 512 } |
513 | 513 |
514 void QuicTestClient::UseConnectionId(QuicConnectionId connection_id) { | 514 void QuicTestClient::UseConnectionId(QuicConnectionId connection_id) { |
515 DCHECK(!connected()); | 515 DCHECK(!connected()); |
516 client_->UseConnectionId(connection_id); | 516 client_->UseConnectionId(connection_id); |
517 } | 517 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 // Set policy for headers and crypto streams. | 560 // Set policy for headers and crypto streams. |
561 ReliableQuicStreamPeer::SetFecPolicy( | 561 ReliableQuicStreamPeer::SetFecPolicy( |
562 QuicSessionPeer::GetHeadersStream(client()->session()), fec_policy); | 562 QuicSessionPeer::GetHeadersStream(client()->session()), fec_policy); |
563 ReliableQuicStreamPeer::SetFecPolicy(client()->session()->GetCryptoStream(), | 563 ReliableQuicStreamPeer::SetFecPolicy(client()->session()->GetCryptoStream(), |
564 fec_policy); | 564 fec_policy); |
565 } | 565 } |
566 | 566 |
567 } // namespace test | 567 } // namespace test |
568 } // namespace tools | 568 } // namespace tools |
569 } // namespace net | 569 } // namespace net |
OLD | NEW |