From 2fbcd599eab78328ee4983e86221820028147aaf Mon Sep 17 00:00:00 2001 From: Harold Thetiot Date: Mon, 18 Sep 2017 12:39:22 -0700 Subject: [PATCH 1/4] jshint --- test/http2-push-test.js | 7 ++++--- test/utils-test.js | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/http2-push-test.js b/test/http2-push-test.js index 7b1b66a..93e8e0e 100644 --- a/test/http2-push-test.js +++ b/test/http2-push-test.js @@ -334,12 +334,14 @@ describe('http2-push', function () { ]; var requestCount = 0; socketOnRequest = function (request, response) { + var pr; + requestCount++; if (requestCount === 1) { // TODO check request headers and requests responses assert.equal(request.url, '/stream'); - var pr = response.push({ + pr = response.push({ 'path': '/cachedGetRequestAfterFailure', 'protocol': 'http:' }); @@ -368,8 +370,7 @@ describe('http2-push', function () { // TODO check request headers and requests responses assert.equal(request.url, '/cachedGetRequestAfterFailure'); - - var pr = response.push({ + pr = response.push({ 'path': '/cachedGetRequestAfterFailure', 'protocol': 'http:' }); diff --git a/test/utils-test.js b/test/utils-test.js index bfff819..ff61d21 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -1,4 +1,4 @@ -/* global console */ +/* global console, global */ var mergeTypedArrays = require('../lib/utils').mergeTypedArrays, Utf8ArrayToStr = require('../lib/utils').Utf8ArrayToStr, parseUrl = require('../lib/utils').parseUrl, From 78de025cc3494ada7b5fef95153e29b8c9ef0ead Mon Sep 17 00:00:00 2001 From: Harold Thetiot Date: Mon, 18 Sep 2017 12:39:35 -0700 Subject: [PATCH 2/4] reset XHR readyState on open --- lib/xhr.js | 3 ++ test/http2-xhr-test.js | 81 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/lib/xhr.js b/lib/xhr.js index 40fb61f..f837c96 100644 --- a/lib/xhr.js +++ b/lib/xhr.js @@ -93,6 +93,9 @@ function enableXHROverH2(XMLHttpRequest, configuration) { throw new SyntaxError("Synchronous is not supported"); } + // Reset default state + redefine(this, 'readyState', XMLHttpRequest.UNSENT); + xhrInfo.put(this, 'method', method); xhrInfo.put(this, 'url', url); xhrInfo.put(this, 'async', async); diff --git a/test/http2-xhr-test.js b/test/http2-xhr-test.js index 3016dde..01c51f7 100644 --- a/test/http2-xhr-test.js +++ b/test/http2-xhr-test.js @@ -74,6 +74,7 @@ describe('http2-xhr', function () { response.write(message); response.end(); }; + XMLHttpRequest.proxy(["http://localhost:7080/config"]); var xhr = new XMLHttpRequest(); @@ -98,8 +99,8 @@ describe('http2-xhr', function () { done(); } }; - xhr.open('GET', 'http://cache-endpoint2/path', true); + xhr.open('GET', 'http://cache-endpoint2/path', true); xhr.send(null); }); @@ -511,6 +512,84 @@ describe('http2-xhr', function () { firstRequest.send(null); }); + it('should allow reuse of XMLHttpRequest for different url', function (done) { + var messages = [ + "Hello, Dave. You're looking well today.", + "Do you want to be my friend, Dave ?" + ]; + var requestCount = 0; + socketOnRequest = function (request, response) { + requestCount++; + if (requestCount === 1) { + // TODO check request headers and requests responses + assert.equal(request.url, '/reuseXMLHttpRequest1'); + response.setHeader('Content-Type', 'text/html'); + response.setHeader('Content-Length', messages[0].length); + response.setHeader('Cache-Control', 'private, max-age=5'); + response.write(messages[0]); + response.end(); + } else if (requestCount === 2) { + // TODO check request headers and requests responses + assert.equal(request.url, '/reuseXMLHttpRequest2'); + response.setHeader('Content-Type', 'text/html'); + response.setHeader('Content-Length', messages[1].length); + response.setHeader('Cache-Control', 'private, max-age=5'); + response.write(messages[1]); + response.end(); + } else { + throw new Error("Should only get 2 request"); + } + }; + XMLHttpRequest.proxy(["http://localhost:7080/config"]); + var firstRequest = new XMLHttpRequest(); + + var statechanges = 0; + firstRequest.onreadystatechange = function () { + ++statechanges; + if(statechanges !== 1) { + assert.equal(statechanges, firstRequest.readyState); + } + if (firstRequest.readyState >= 2) { + assert.equal(firstRequest.status, 200); + assert.equal(firstRequest.statusText, "OK"); + } + if (firstRequest.readyState >= 3) { + assert.equal(firstRequest.response, messages[0]); + } + if (firstRequest.readyState === 4 && firstRequest.status === 200) { + assert.equal(firstRequest.response, messages[0]); + + var secondRequest = firstRequest; + var statechangesocket = 0; + secondRequest.onreadystatechange = function () { + ++statechangesocket; + // TODO !==1 is due to bug + if(statechangesocket !== 1) { + assert.equal(statechangesocket, secondRequest.readyState); + } + if (secondRequest.readyState >= 2) { + assert.equal(secondRequest.status, 200); + assert.equal(secondRequest.statusText, "OK"); + } + if (secondRequest.readyState >= 3) { + assert.equal(secondRequest.response, messages[1]); + } + if (secondRequest.readyState === 4 && secondRequest.status === 200) { + assert.equal(secondRequest.response, messages[1]); + done(); + } + }; + + secondRequest.open('GET', 'http://cache-endpoint2:80/reuseXMLHttpRequest2', true); + secondRequest.send(null); + } + }; + + firstRequest.open('GET', 'http://cache-endpoint2:80/reuseXMLHttpRequest1', true); + + firstRequest.send(null); + }); + it('should not cache GET request and not reuse if error', function (done) { var messages = [ "Hello, Dave. You're looking well today.", From d83e9ee1c0623701f4972ab017ce9f3d5623a3e2 Mon Sep 17 00:00:00 2001 From: Harold Thetiot Date: Mon, 18 Sep 2017 14:11:57 -0700 Subject: [PATCH 3/4] fix calling open more than once on xhr --- lib/xhr.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/xhr.js b/lib/xhr.js index f837c96..1116e9d 100644 --- a/lib/xhr.js +++ b/lib/xhr.js @@ -94,7 +94,11 @@ function enableXHROverH2(XMLHttpRequest, configuration) { } // Reset default state - redefine(this, 'readyState', XMLHttpRequest.UNSENT); + if (this.readyState !== 0) { + redefine(this, 'readyState', XMLHttpRequest.UNSENT); + xhrInfo.put(this, 'lastreadystate', XMLHttpRequest.UNSENT); + defineXhrResponse(this, { data: '' }); + } xhrInfo.put(this, 'method', method); xhrInfo.put(this, 'url', url); From 632be8a6f06ca98e04a1d1347638d50620003d63 Mon Sep 17 00:00:00 2001 From: Harold Thetiot Date: Mon, 2 Oct 2017 11:50:38 -0700 Subject: [PATCH 4/4] reset response and responseText on open --- lib/xhr.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/xhr.js b/lib/xhr.js index de5533f..ff61256 100644 --- a/lib/xhr.js +++ b/lib/xhr.js @@ -101,6 +101,9 @@ function enableXHROverH2(XMLHttpRequest, configuration) { var self = this; + delete self.response; + delete self.responseText; + /* * We need to fire opened event here but native library might * recall open, so we do this @@ -322,8 +325,6 @@ function enableXHROverH2(XMLHttpRequest, configuration) { configuration.onPush(respo); }); - self.response = self._response || self.response; - request.end(body || null); // Set requestInfo revalidate state @@ -394,7 +395,6 @@ function enableXHROverH2(XMLHttpRequest, configuration) { self._send(body); } - } });