1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/spdy/multiplexed_http_stream.h"
6 
7 #include <utility>
8 
9 #include "base/notreached.h"
10 #include "base/strings/abseil_string_conversions.h"
11 #include "net/http/http_raw_request_headers.h"
12 #include "net/third_party/quiche/src/spdy/core/spdy_header_block.h"
13 
14 namespace net {
15 
MultiplexedHttpStream(std::unique_ptr<MultiplexedSessionHandle> session)16 MultiplexedHttpStream::MultiplexedHttpStream(
17     std::unique_ptr<MultiplexedSessionHandle> session)
18     : session_(std::move(session)) {}
19 
20 MultiplexedHttpStream::~MultiplexedHttpStream() = default;
21 
GetRemoteEndpoint(IPEndPoint * endpoint)22 bool MultiplexedHttpStream::GetRemoteEndpoint(IPEndPoint* endpoint) {
23   return session_->GetRemoteEndpoint(endpoint);
24 }
25 
GetSSLInfo(SSLInfo * ssl_info)26 void MultiplexedHttpStream::GetSSLInfo(SSLInfo* ssl_info) {
27   session_->GetSSLInfo(ssl_info);
28 }
29 
SaveSSLInfo()30 void MultiplexedHttpStream::SaveSSLInfo() {
31   session_->SaveSSLInfo();
32 }
33 
GetSSLCertRequestInfo(SSLCertRequestInfo * cert_request_info)34 void MultiplexedHttpStream::GetSSLCertRequestInfo(
35     SSLCertRequestInfo* cert_request_info) {
36   // A multiplexed stream cannot request client certificates. Client
37   // authentication may only occur during the initial SSL handshake.
38   NOTREACHED();
39 }
40 
Drain(HttpNetworkSession * session)41 void MultiplexedHttpStream::Drain(HttpNetworkSession* session) {
42   NOTREACHED();
43   Close(false);
44   delete this;
45 }
46 
RenewStreamForAuth()47 HttpStream* MultiplexedHttpStream::RenewStreamForAuth() {
48   return nullptr;
49 }
50 
SetConnectionReused()51 void MultiplexedHttpStream::SetConnectionReused() {}
52 
CanReuseConnection() const53 bool MultiplexedHttpStream::CanReuseConnection() const {
54   // Multiplexed streams aren't considered reusable.
55   return false;
56 }
57 
SetRequestHeadersCallback(RequestHeadersCallback callback)58 void MultiplexedHttpStream::SetRequestHeadersCallback(
59     RequestHeadersCallback callback) {
60   request_headers_callback_ = std::move(callback);
61 }
62 
DispatchRequestHeadersCallback(const spdy::Http2HeaderBlock & spdy_headers)63 void MultiplexedHttpStream::DispatchRequestHeadersCallback(
64     const spdy::Http2HeaderBlock& spdy_headers) {
65   if (!request_headers_callback_)
66     return;
67   HttpRawRequestHeaders raw_headers;
68   for (const auto& entry : spdy_headers)
69     raw_headers.Add(base::StringViewToStringPiece(entry.first),
70                     base::StringViewToStringPiece(entry.second));
71   request_headers_callback_.Run(std::move(raw_headers));
72 }
73 
74 }  // namespace net
75