diff --git a/libcef/browser_resource_loader_bridge.cc b/libcef/browser_resource_loader_bridge.cc index b87089db7..8875193c2 100644 --- a/libcef/browser_resource_loader_bridge.cc +++ b/libcef/browser_resource_loader_bridge.cc @@ -229,28 +229,17 @@ class RequestProxy : public URLRequest::Delegate, requestimpl->SetURL(UTF8ToWide(params->url.spec())); requestimpl->SetMethod(UTF8ToWide(params->method)); + // Transfer request headers CefRequest::HeaderMap headerMap; - - // Parse the request header values - std::string headerStr = "HTTP/1.1 200 OK\n"; - headerStr += params->headers; - scoped_refptr headers = - new HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( - headerStr.c_str(), headerStr.length())); - void* iter = NULL; - std::string name, value; - while(headers->EnumerateHeaderLines(&iter, &name, &value)) - headerMap.insert(std::make_pair(UTF8ToWide(name), UTF8ToWide(value))); - + CefRequestImpl::GetHeaderMap(params->headers, headerMap); headerMap.insert( std::make_pair(L"Referrer", UTF8ToWide(params->referrer.spec()))); - requestimpl->SetHeaderMap(headerMap); + // Transfer post data, if any scoped_refptr upload = params->upload; - CefRefPtr postdata; if(upload.get()) { - postdata = new CefPostDataImpl(); + CefRefPtr postdata(new CefPostDataImpl()); static_cast(postdata.get())->Set(*upload.get()); requestimpl->SetPostData(postdata); } diff --git a/libcef/request_impl.cc b/libcef/request_impl.cc index 9ea3fd4dd..9acae2cb8 100644 --- a/libcef/request_impl.cc +++ b/libcef/request_impl.cc @@ -7,9 +7,14 @@ #include "base/logging.h" #include "base/string_util.h" +#include "net/http/http_response_headers.h" +#include "net/http/http_util.h" +#include "net/url_request/url_request.h" #include "webkit/api/public/WebHTTPHeaderVisitor.h" #include "webkit/glue/glue_util.h" +using net::HttpResponseHeaders; + CefRefPtr CefRequest::CreateRequest() { @@ -93,6 +98,27 @@ void CefRequestImpl::Set(const std::wstring& url, Unlock(); } +void CefRequestImpl::Set(URLRequest* request) +{ + SetURL(UTF8ToWide(request->url().spec())); + SetMethod(UTF8ToWide(request->method())); + + // Transfer request headers + HeaderMap headerMap; + GetHeaderMap(request->extra_request_headers(), headerMap); + headerMap.insert( + std::make_pair(L"Referrer", UTF8ToWide(request->referrer()))); + SetHeaderMap(headerMap); + + // Transfer post data, if any + net::UploadData* data = request->get_upload(); + if (data) { + CefRefPtr postdata(CefPostData::CreatePostData()); + static_cast(postdata.get())->Set(*data); + SetPostData(postdata); + } +} + void CefRequestImpl::GetHeaderMap(const WebKit::WebURLRequest& request, HeaderMap& map) { @@ -127,6 +153,20 @@ void CefRequestImpl::SetHeaderMap(const HeaderMap& map, } } +void CefRequestImpl::GetHeaderMap(const std::string& header_str, HeaderMap& map) +{ + // Parse the request header values + std::string headerStr = "HTTP/1.1 200 OK\n"; + headerStr += header_str; + scoped_refptr headers = + new HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( + headerStr.c_str(), headerStr.length())); + void* iter = NULL; + std::string name, value; + while(headers->EnumerateHeaderLines(&iter, &name, &value)) + map.insert(std::make_pair(UTF8ToWide(name), UTF8ToWide(value))); +} + CefRefPtr CefPostData::CreatePostData() { CefRefPtr postdata(new CefPostDataImpl()); diff --git a/libcef/request_impl.h b/libcef/request_impl.h index 4dde4e259..21b8e5c8d 100644 --- a/libcef/request_impl.h +++ b/libcef/request_impl.h @@ -10,6 +10,7 @@ #include "webkit/api/public/WebHTTPBody.h" #include "webkit/api/public/WebURLRequest.h" +class URLRequest; // Implementation of CefRequest class CefRequestImpl : public CefThreadSafeBase @@ -31,11 +32,15 @@ public: CefRefPtr postData, const HeaderMap& headerMap); + void Set(URLRequest* request); + static void GetHeaderMap(const WebKit::WebURLRequest& request, HeaderMap& map); static void SetHeaderMap(const HeaderMap& map, WebKit::WebURLRequest& request); + static void GetHeaderMap(const std::string& header_str, HeaderMap& map); + protected: std::wstring url_; std::wstring method_; diff --git a/libcef/scheme_impl.cc b/libcef/scheme_impl.cc index a0b50235d..46db5a205 100644 --- a/libcef/scheme_impl.cc +++ b/libcef/scheme_impl.cc @@ -183,16 +183,10 @@ private: ////////////////////////////////////////////////////////////////////////// // safe to perform long operation here CefRefPtr req(CefRequest::CreateRequest()); - req->SetURL(UTF8ToWide(url.spec())); - req->SetMethod(UTF8ToWide(owner_->request()->method())); - // check to see if we have post data - net::UploadData* data = owner_->request()->get_upload(); - if (data) { - CefRefPtr postdata(CefPostData::CreatePostData()); - static_cast(postdata.get())->Set(*data); - req->SetPostData(postdata); - } + // populate the request data + static_cast(req.get())->Set(owner_->request()); + owner_->handler_->Cancel(); std::wstring mime_type; int response_length = 0; @@ -386,7 +380,7 @@ public: } void AddRef() {} - void Release() {} + void Release() { delete this; } private: CefSchemeHandlerFactory* factory_;