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

Side by Side Diff: net/spdy/spdy_http_stream.cc

Issue 3259006: Add support for speaking SPDY to an HTTPS proxy.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_http_stream.h ('k') | net/spdy/spdy_http_stream_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/spdy/spdy_http_stream.h" 5 #include "net/spdy/spdy_http_stream.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <list> 8 #include <list>
9 #include <string> 9 #include <string>
10 10
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 } 84 }
85 85
86 response->headers = new net::HttpResponseHeaders(raw_headers); 86 response->headers = new net::HttpResponseHeaders(raw_headers);
87 response->was_fetched_via_spdy = true; 87 response->was_fetched_via_spdy = true;
88 return true; 88 return true;
89 } 89 }
90 90
91 // Create a SpdyHeaderBlock for a Spdy SYN_STREAM Frame from 91 // Create a SpdyHeaderBlock for a Spdy SYN_STREAM Frame from
92 // a HttpRequestInfo block. 92 // a HttpRequestInfo block.
93 void CreateSpdyHeadersFromHttpRequest( 93 void CreateSpdyHeadersFromHttpRequest(
94 const net::HttpRequestInfo& info, spdy::SpdyHeaderBlock* headers) { 94 const net::HttpRequestInfo& info, spdy::SpdyHeaderBlock* headers,
95 bool direct) {
95 // TODO(willchan): It's not really necessary to convert from 96 // TODO(willchan): It's not really necessary to convert from
96 // HttpRequestHeaders to spdy::SpdyHeaderBlock. 97 // HttpRequestHeaders to spdy::SpdyHeaderBlock.
97 98
98 static const char kHttpProtocolVersion[] = "HTTP/1.1"; 99 static const char kHttpProtocolVersion[] = "HTTP/1.1";
99 100
100 net::HttpRequestHeaders::Iterator it(info.extra_headers); 101 net::HttpRequestHeaders::Iterator it(info.extra_headers);
101 102
102 while (it.GetNext()) { 103 while (it.GetNext()) {
103 std::string name = StringToLowerASCII(it.name()); 104 std::string name = StringToLowerASCII(it.name());
104 if (headers->find(name) == headers->end()) { 105 if (headers->find(name) == headers->end()) {
(...skipping 19 matching lines...) Expand all
124 base::Int64ToString(info.upload_data->GetContentLength()); 125 base::Int64ToString(info.upload_data->GetContentLength());
125 } else if (info.method == "POST" || info.method == "PUT" || 126 } else if (info.method == "POST" || info.method == "PUT" ||
126 info.method == "HEAD") { 127 info.method == "HEAD") {
127 // An empty POST/PUT request still needs a content length. As for HEAD, 128 // An empty POST/PUT request still needs a content length. As for HEAD,
128 // IE and Safari also add a content length header. Presumably it is to 129 // IE and Safari also add a content length header. Presumably it is to
129 // support sending a HEAD request to an URL that only expects to be sent a 130 // support sending a HEAD request to an URL that only expects to be sent a
130 // POST or some other method that normally would have a message body. 131 // POST or some other method that normally would have a message body.
131 (*headers)["content-length"] = "0"; 132 (*headers)["content-length"] = "0";
132 } 133 }
133 134
134 (*headers)["url"] = net::HttpUtil::PathForRequest(info.url); 135 if (direct)
136 (*headers)["url"] = net::HttpUtil::PathForRequest(info.url);
137 else
138 (*headers)["url"] = net::HttpUtil::SpecForRequest(info.url);
135 (*headers)["host"] = net::GetHostAndOptionalPort(info.url); 139 (*headers)["host"] = net::GetHostAndOptionalPort(info.url);
136 (*headers)["scheme"] = info.url.scheme(); 140 (*headers)["scheme"] = info.url.scheme();
137 (*headers)["version"] = kHttpProtocolVersion; 141 (*headers)["version"] = kHttpProtocolVersion;
138 if (!info.referrer.is_empty()) 142 if (!info.referrer.is_empty())
139 (*headers)["referer"] = info.referrer.spec(); 143 (*headers)["referer"] = info.referrer.spec();
140 144
141 // Honor load flags that impact proxy caches. 145 // Honor load flags that impact proxy caches.
142 if (info.load_flags & net::LOAD_BYPASS_CACHE) { 146 if (info.load_flags & net::LOAD_BYPASS_CACHE) {
143 (*headers)["pragma"] = "no-cache"; 147 (*headers)["pragma"] = "no-cache";
144 (*headers)["cache-control"] = "no-cache"; 148 (*headers)["cache-control"] = "no-cache";
145 } else if (info.load_flags & net::LOAD_VALIDATE_CACHE) { 149 } else if (info.load_flags & net::LOAD_VALIDATE_CACHE) {
146 (*headers)["cache-control"] = "max-age=0"; 150 (*headers)["cache-control"] = "max-age=0";
147 } 151 }
148 } 152 }
149 153
150 } // anonymous namespace 154 } // anonymous namespace
151 155
152 namespace net { 156 namespace net {
153 157
154 SpdyHttpStream::SpdyHttpStream(SpdySession* spdy_session) 158 SpdyHttpStream::SpdyHttpStream(SpdySession* spdy_session, bool direct)
155 : ALLOW_THIS_IN_INITIALIZER_LIST(read_callback_factory_(this)), 159 : ALLOW_THIS_IN_INITIALIZER_LIST(read_callback_factory_(this)),
156 stream_(NULL), 160 stream_(NULL),
157 spdy_session_(spdy_session), 161 spdy_session_(spdy_session),
158 response_info_(NULL), 162 response_info_(NULL),
159 download_finished_(false), 163 download_finished_(false),
160 user_callback_(NULL), 164 user_callback_(NULL),
161 user_buffer_len_(0), 165 user_buffer_len_(0),
162 buffered_read_callback_pending_(false), 166 buffered_read_callback_pending_(false),
163 more_read_data_pending_(false) { } 167 more_read_data_pending_(false),
168 direct_(direct) { }
164 169
165 SpdyHttpStream::~SpdyHttpStream() { 170 SpdyHttpStream::~SpdyHttpStream() {
166 if (stream_) 171 if (stream_)
167 stream_->DetachDelegate(); 172 stream_->DetachDelegate();
168 } 173 }
169 174
170 int SpdyHttpStream::InitializeStream(const HttpRequestInfo* request_info, 175 int SpdyHttpStream::InitializeStream(const HttpRequestInfo* request_info,
171 const BoundNetLog& stream_net_log, 176 const BoundNetLog& stream_net_log,
172 CompletionCallback* callback) { 177 CompletionCallback* callback) {
173 if (spdy_session_->IsClosed()) 178 if (spdy_session_->IsClosed())
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 int SpdyHttpStream::SendRequest(const std::string& /*headers_string*/, 277 int SpdyHttpStream::SendRequest(const std::string& /*headers_string*/,
273 UploadDataStream* request_body, 278 UploadDataStream* request_body,
274 HttpResponseInfo* response, 279 HttpResponseInfo* response,
275 CompletionCallback* callback) { 280 CompletionCallback* callback) {
276 base::Time request_time = base::Time::Now(); 281 base::Time request_time = base::Time::Now();
277 CHECK(stream_.get()); 282 CHECK(stream_.get());
278 283
279 stream_->SetDelegate(this); 284 stream_->SetDelegate(this);
280 285
281 linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); 286 linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock);
282 CreateSpdyHeadersFromHttpRequest(*request_info_, headers.get()); 287 CreateSpdyHeadersFromHttpRequest(*request_info_, headers.get(), direct_);
283 stream_->set_spdy_headers(headers); 288 stream_->set_spdy_headers(headers);
284 289
285 stream_->SetRequestTime(request_time); 290 stream_->SetRequestTime(request_time);
286 // This should only get called in the case of a request occurring 291 // This should only get called in the case of a request occurring
287 // during server push that has already begun but hasn't finished, 292 // during server push that has already begun but hasn't finished,
288 // so we set the response's request time to be the actual one 293 // so we set the response's request time to be the actual one
289 if (response_info_) 294 if (response_info_)
290 response_info_->request_time = request_time; 295 response_info_->request_time = request_time;
291 296
292 CHECK(!request_body_stream_.get()); 297 CHECK(!request_body_stream_.get());
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 stream_->GetSSLInfo(ssl_info, &using_npn); 510 stream_->GetSSLInfo(ssl_info, &using_npn);
506 } 511 }
507 512
508 void SpdyHttpStream::GetSSLCertRequestInfo( 513 void SpdyHttpStream::GetSSLCertRequestInfo(
509 SSLCertRequestInfo* cert_request_info) { 514 SSLCertRequestInfo* cert_request_info) {
510 DCHECK(stream_); 515 DCHECK(stream_);
511 stream_->GetSSLCertRequestInfo(cert_request_info); 516 stream_->GetSSLCertRequestInfo(cert_request_info);
512 } 517 }
513 518
514 } // namespace net 519 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_http_stream.h ('k') | net/spdy/spdy_http_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698