protocol: respect provided mimetype in generated response headers
authorRobo <hop2deep@gmail.com>
Tue, 15 Sep 2015 14:24:16 +0000 (19:54 +0530)
committerRobo <hop2deep@gmail.com>
Wed, 16 Sep 2015 03:04:04 +0000 (08:34 +0530)
atom/browser/net/url_request_buffer_job.cc
atom/browser/net/url_request_buffer_job.h
atom/browser/net/url_request_string_job.cc
atom/browser/net/url_request_string_job.h
spec/api-protocol-spec.coffee

index 7eb3aae..affc3dd 100644 (file)
@@ -6,13 +6,15 @@
 
 #include <string>
 
+#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<net::URLRequestSimpleJob>(request, network_delegate) {
+    : JsAsker<net::URLRequestSimpleJob>(request, network_delegate),
+      status_code_(net::HTTP_NOT_IMPLEMENTED) {
 }
 
 void URLRequestBufferJob::StartAsync(scoped_ptr<base::Value> options) {
@@ -36,9 +38,28 @@ void URLRequestBufferJob::StartAsync(scoped_ptr<base::Value> options) {
   data_ = new base::RefCountedBytes(
       reinterpret_cast<const unsigned char*>(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,
index e6fecdb..ab8de7e 100644 (file)
@@ -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<net::URLRequestSimpleJob> {
   // JsAsker:
   void StartAsync(scoped_ptr<base::Value> 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<net::URLRequestSimpleJob> {
   std::string mime_type_;
   std::string charset_;
   scoped_refptr<base::RefCountedBytes> data_;
+  net::HttpStatusCode status_code_;
 
   DISALLOW_COPY_AND_ASSIGN(URLRequestBufferJob);
 };
index 428a87f..4a631b8 100644 (file)
@@ -28,6 +28,20 @@ void URLRequestStringJob::StartAsync(scoped_ptr<base::Value> 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,
index 713185c..e40f0d9 100644 (file)
@@ -19,6 +19,9 @@ class URLRequestStringJob : public JsAsker<net::URLRequestSimpleJob> {
   // JsAsker:
   void StartAsync(scoped_ptr<base::Value> options) override;
 
+  // URLRequestJob:
+  void GetResponseInfo(net::HttpResponseInfo* info) override;
+
   // URLRequestSimpleJob:
   int GetData(std::string* mime_type,
               std::string* charset,
index f540a63..02fd8d5 100644 (file)
@@ -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))