summaryrefslogtreecommitdiffstats
path: root/net/http/http_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/http/http_util.cc')
-rw-r--r--net/http/http_util.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/net/http/http_util.cc b/net/http/http_util.cc
index 0f45ccc..5c7a4fc 100644
--- a/net/http/http_util.cc
+++ b/net/http/http_util.cc
@@ -14,7 +14,12 @@
#include "base/string_number_conversions.h"
#include "base/string_piece.h"
#include "base/string_util.h"
+#include "net/base/load_flags.h"
#include "net/base/net_util.h"
+#include "net/base/upload_data_stream.h"
+#include "net/http/http_request_info.h"
+#include "net/http/http_request_headers.h"
+#include "net/http/http_auth_controller.h"
using std::string;
@@ -631,6 +636,90 @@ HttpUtil::HeadersIterator::HeadersIterator(string::const_iterator headers_begin,
: lines_(headers_begin, headers_end, line_delimiter) {
}
+namespace {
+
+bool HaveAuth(const scoped_refptr<HttpAuthController> auth_controllers[],
+ HttpAuth::Target target) {
+ return auth_controllers[target].get() &&
+ auth_controllers[target]->HaveAuth();
+}
+
+} // namespace
+
+void HttpUtil::BuildRequestHeaders(const HttpRequestInfo* request_info,
+ const UploadDataStream* upload_data_stream,
+ const scoped_refptr<HttpAuthController>
+ auth_controllers[],
+ bool should_apply_server_auth,
+ bool should_apply_proxy_auth,
+ bool using_proxy,
+ HttpRequestHeaders* request_headers) {
+ request_headers->SetHeader(HttpRequestHeaders::kHost,
+ GetHostAndOptionalPort(request_info->url));
+
+ // For compat with HTTP/1.0 servers and proxies:
+ if (using_proxy) {
+ request_headers->SetHeader(HttpRequestHeaders::kProxyConnection,
+ "keep-alive");
+ } else {
+ request_headers->SetHeader(HttpRequestHeaders::kConnection, "keep-alive");
+ }
+
+ // Our consumer should have made sure that this is a safe referrer. See for
+ // instance WebCore::FrameLoader::HideReferrer.
+ if (request_info->referrer.is_valid()) {
+ request_headers->SetHeader(HttpRequestHeaders::kReferer,
+ request_info->referrer.spec());
+ }
+
+ // Add a content length header?
+ if (upload_data_stream) {
+ request_headers->SetHeader(
+ HttpRequestHeaders::kContentLength,
+ base::Uint64ToString(upload_data_stream->size()));
+ } else if (request_info->method == "POST" || request_info->method == "PUT" ||
+ request_info->method == "HEAD") {
+ // An empty POST/PUT request still needs a content length. As for HEAD,
+ // IE and Safari also add a content length header. Presumably it is to
+ // support sending a HEAD request to an URL that only expects to be sent a
+ // POST or some other method that normally would have a message body.
+ request_headers->SetHeader(HttpRequestHeaders::kContentLength, "0");
+ }
+
+ // Honor load flags that impact proxy caches.
+ if (request_info->load_flags & LOAD_BYPASS_CACHE) {
+ request_headers->SetHeader(HttpRequestHeaders::kPragma, "no-cache");
+ request_headers->SetHeader(HttpRequestHeaders::kCacheControl, "no-cache");
+ } else if (request_info->load_flags & LOAD_VALIDATE_CACHE) {
+ request_headers->SetHeader(HttpRequestHeaders::kCacheControl, "max-age=0");
+ }
+
+ if (should_apply_proxy_auth &&
+ HaveAuth(auth_controllers, HttpAuth::AUTH_PROXY))
+ auth_controllers[HttpAuth::AUTH_PROXY]->AddAuthorizationHeader(
+ request_headers);
+ if (should_apply_server_auth &&
+ HaveAuth(auth_controllers, HttpAuth::AUTH_SERVER))
+ auth_controllers[HttpAuth::AUTH_SERVER]->AddAuthorizationHeader(
+ request_headers);
+
+ // Headers that will be stripped from request_info->extra_headers to prevent,
+ // e.g., plugins from overriding headers that are controlled using other
+ // means. Otherwise a plugin could set a referrer although sending the
+ // referrer is inhibited.
+ // TODO(jochen): check whether also other headers should be stripped.
+ static const char* const kExtraHeadersToBeStripped[] = {
+ "Referer"
+ };
+
+ HttpRequestHeaders stripped_extra_headers;
+ stripped_extra_headers.CopyFrom(request_info->extra_headers);
+ for (size_t i = 0; i < arraysize(kExtraHeadersToBeStripped); ++i)
+ stripped_extra_headers.RemoveHeader(kExtraHeadersToBeStripped[i]);
+ request_headers->MergeFrom(stripped_extra_headers);
+}
+
+
HttpUtil::HeadersIterator::~HeadersIterator() {
}