From 57c910faef1653512df572da203e3a30451b9c50 Mon Sep 17 00:00:00 2001 From: Robo Date: Tue, 15 Sep 2015 19:54:16 +0530 Subject: [PATCH] protocol: respect provided mimetype in generated response headers --- atom/browser/net/url_request_buffer_job.cc | 23 +++++++++++++++++++++- atom/browser/net/url_request_buffer_job.h | 5 +++++ atom/browser/net/url_request_string_job.cc | 14 +++++++++++++ atom/browser/net/url_request_string_job.h | 3 +++ spec/api-protocol-spec.coffee | 13 ++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/atom/browser/net/url_request_buffer_job.cc b/atom/browser/net/url_request_buffer_job.cc index 7eb3aaed243c..affc3dd37d25 100644 --- a/atom/browser/net/url_request_buffer_job.cc +++ b/atom/browser/net/url_request_buffer_job.cc @@ -6,13 +6,15 @@ #include +#include "base/strings/string_number_conversions.h" #include "net/base/net_errors.h" namespace atom { URLRequestBufferJob::URLRequestBufferJob( net::URLRequest* request, net::NetworkDelegate* network_delegate) - : JsAsker(request, network_delegate) { + : JsAsker(request, network_delegate), + status_code_(net::HTTP_NOT_IMPLEMENTED) { } void URLRequestBufferJob::StartAsync(scoped_ptr options) { @@ -36,9 +38,28 @@ void URLRequestBufferJob::StartAsync(scoped_ptr options) { data_ = new base::RefCountedBytes( reinterpret_cast(binary->GetBuffer()), binary->GetSize()); + status_code_ = net::HTTP_OK; net::URLRequestSimpleJob::Start(); } +void URLRequestBufferJob::GetResponseInfo(net::HttpResponseInfo* info) { + std::string status("HTTP/1.1 "); + status.append(base::IntToString(status_code_)); + status.append(" "); + status.append(net::GetHttpReasonPhrase(status_code_)); + status.append("\0\0", 2); + net::HttpResponseHeaders* headers = new net::HttpResponseHeaders(status); + + if (!mime_type_.empty()) { + std::string content_type_header(net::HttpRequestHeaders::kContentType); + content_type_header.append(": "); + content_type_header.append(mime_type_); + headers->AddHeader(content_type_header); + } + + info->headers = headers; +} + int URLRequestBufferJob::GetRefCountedData( std::string* mime_type, std::string* charset, diff --git a/atom/browser/net/url_request_buffer_job.h b/atom/browser/net/url_request_buffer_job.h index e6fecdba8301..ab8de7e8f030 100644 --- a/atom/browser/net/url_request_buffer_job.h +++ b/atom/browser/net/url_request_buffer_job.h @@ -9,6 +9,7 @@ #include "atom/browser/net/js_asker.h" #include "base/memory/ref_counted_memory.h" +#include "net/http/http_status_code.h" #include "net/url_request/url_request_simple_job.h" namespace atom { @@ -20,6 +21,9 @@ class URLRequestBufferJob : public JsAsker { // JsAsker: void StartAsync(scoped_ptr options) override; + // URLRequestJob: + void GetResponseInfo(net::HttpResponseInfo* info) override; + // URLRequestSimpleJob: int GetRefCountedData(std::string* mime_type, std::string* charset, @@ -30,6 +34,7 @@ class URLRequestBufferJob : public JsAsker { std::string mime_type_; std::string charset_; scoped_refptr data_; + net::HttpStatusCode status_code_; DISALLOW_COPY_AND_ASSIGN(URLRequestBufferJob); }; diff --git a/atom/browser/net/url_request_string_job.cc b/atom/browser/net/url_request_string_job.cc index 428a87f54b1e..4a631b813eff 100644 --- a/atom/browser/net/url_request_string_job.cc +++ b/atom/browser/net/url_request_string_job.cc @@ -28,6 +28,20 @@ void URLRequestStringJob::StartAsync(scoped_ptr options) { net::URLRequestSimpleJob::Start(); } +void URLRequestStringJob::GetResponseInfo(net::HttpResponseInfo* info) { + std::string status("HTTP/1.1 200 OK"); + net::HttpResponseHeaders* headers = new net::HttpResponseHeaders(status); + + if (!mime_type_.empty()) { + std::string content_type_header(net::HttpRequestHeaders::kContentType); + content_type_header.append(": "); + content_type_header.append(mime_type_); + headers->AddHeader(content_type_header); + } + + info->headers = headers; +} + int URLRequestStringJob::GetData( std::string* mime_type, std::string* charset, diff --git a/atom/browser/net/url_request_string_job.h b/atom/browser/net/url_request_string_job.h index 713185c0cd1d..e40f0d93dab7 100644 --- a/atom/browser/net/url_request_string_job.h +++ b/atom/browser/net/url_request_string_job.h @@ -19,6 +19,9 @@ class URLRequestStringJob : public JsAsker { // JsAsker: void StartAsync(scoped_ptr options) override; + // URLRequestJob: + void GetResponseInfo(net::HttpResponseInfo* info) override; + // URLRequestSimpleJob: int GetData(std::string* mime_type, std::string* charset, diff --git a/spec/api-protocol-spec.coffee b/spec/api-protocol-spec.coffee index f540a63ec406..02fd8d5e402a 100644 --- a/spec/api-protocol-spec.coffee +++ b/spec/api-protocol-spec.coffee @@ -318,6 +318,19 @@ describe 'protocol module', -> error: (xhr, errorType, error) -> done(error) + it 'can set content-type', (done) -> + handler = (request, callback) -> + callback({mimeType: 'application/json', data: '{"value": 1}'}) + protocol.interceptStringProtocol 'http', handler, (error) -> + $.ajax + url: 'http://fake-host' + success: (data) -> + assert.equal typeof(data), 'object' + assert.equal data.value, 1 + done() + error: (xhr, errorType, error) -> + done(error) + describe 'protocol.interceptBufferProtocol', -> it 'can intercept http protocol', (done) -> handler = (request, callback) -> callback(new Buffer(text))