Browse Source

session: webRequest.OnHeadersReceived should follow server redirect

Its required to follow server redirects.
deepak1556 9 years ago
parent
commit
4fc35a4587
2 changed files with 32 additions and 5 deletions
  1. 2 0
      atom/browser/net/atom_network_delegate.cc
  2. 30 5
      spec/api-web-request-spec.js

+ 2 - 0
atom/browser/net/atom_network_delegate.cc

@@ -178,6 +178,8 @@ void ReadFromResponseObject(const base::DictionaryValue& response,
          !it.IsAtEnd();
          it.Advance()) {
       const base::ListValue* list;
+      if (base::ToLowerASCII(it.key()) == "location")
+        (*headers)->ReplaceStatusLine("HTTP/1.1 302 Found");
       if (it.value().GetAsList(&list)) {
         (*headers)->RemoveHeader(it.key());
         for (size_t i = 0; i < list->GetSize(); ++i) {

+ 30 - 5
spec/api-web-request-spec.js

@@ -7,12 +7,18 @@ const session = remote.session
 describe('webRequest module', function () {
   var ses = session.defaultSession
   var server = http.createServer(function (req, res) {
-    res.setHeader('Custom', ['Header'])
-    var content = req.url
-    if (req.headers.accept === '*/*;test/header') {
-      content += 'header/received'
+    if (req.url == '/serverRedirect') {
+      res.statusCode = 301
+      res.setHeader('Location', 'http://' + req.rawHeaders[1])
+      res.end()
+    } else {
+      res.setHeader('Custom', ['Header'])
+      var content = req.url
+      if (req.headers.accept === '*/*;test/header') {
+        content += 'header/received'
+      }
+      res.end(content)
     }
-    res.end(content)
   })
   var defaultURL = null
 
@@ -297,6 +303,25 @@ describe('webRequest module', function () {
         }
       })
     })
+
+    it('follows server redirect', function (done) {
+      ses.webRequest.onHeadersReceived(function (details, callback) {
+        var responseHeaders = details.responseHeaders
+        callback({
+          responseHeaders: responseHeaders,
+        })
+      })
+      $.ajax({
+        url: defaultURL + 'serverRedirect',
+        success: function (data, status, xhr) {
+          assert.equal(xhr.getResponseHeader('Custom'), 'Header')
+          done()
+        },
+        error: function (xhr, errorType) {
+          done(errorType)
+        }
+      })
+    })
   })
 
   describe('webRequest.onResponseStarted', function () {