diff --git a/spec/observables/dom/ajax-spec.ts b/spec/observables/dom/ajax-spec.ts index f4535e361b..598427dd0b 100644 --- a/spec/observables/dom/ajax-spec.ts +++ b/spec/observables/dom/ajax-spec.ts @@ -652,6 +652,39 @@ describe('Observable.ajax', () => { expect(complete).to.be.true; }); + it('should properly encode full URLs passed', () => { + const expected = { test: 'https://google.com/search?q=encodeURI+vs+encodeURIComponent' }; + let result: Rx.AjaxResponse; + let complete = false; + + Rx.Observable + .ajax.post('/flibbertyJibbet', expected) + .subscribe(x => { + result = x; + }, null, () => { + complete = true; + }); + + const request = MockXMLHttpRequest.mostRecent; + + expect(request.method).to.equal('POST'); + expect(request.url).to.equal('/flibbertyJibbet'); + expect(request.requestHeaders).to.deep.equal({ + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }); + + request.respondWith({ + 'status': 200, + 'contentType': 'application/json', + 'responseText': JSON.stringify(expected) + }); + + expect(request.data) + .to.equal('test=https%3A%2F%2Fgoogle.com%2Fsearch%3Fq%3DencodeURI%2Bvs%2BencodeURIComponent'); + expect(result.response).to.deep.equal(expected); + expect(complete).to.be.true; + }); + it('should succeed on 204 No Content', () => { const expected = null; let result: Rx.AjaxResponse; diff --git a/src/internal/observable/dom/AjaxObservable.ts b/src/internal/observable/dom/AjaxObservable.ts index 58ef757937..46ae687918 100644 --- a/src/internal/observable/dom/AjaxObservable.ts +++ b/src/internal/observable/dom/AjaxObservable.ts @@ -292,7 +292,7 @@ export class AjaxSubscriber extends Subscriber { switch (contentType) { case 'application/x-www-form-urlencoded': - return Object.keys(body).map(key => `${encodeURI(key)}=${encodeURI(body[key])}`).join('&'); + return Object.keys(body).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(body[key])}`).join('&'); case 'application/json': return JSON.stringify(body); default: