diff --git a/spec/observables/dom/ajax-spec.ts b/spec/observables/dom/ajax-spec.ts index 2849c5b5a4..9970376ca3 100644 --- a/spec/observables/dom/ajax-spec.ts +++ b/spec/observables/dom/ajax-spec.ts @@ -399,6 +399,9 @@ describe('Observable.ajax', () => { expect(MockXMLHttpRequest.mostRecent.url).to.equal('/flibbertyJibbet'); expect(MockXMLHttpRequest.mostRecent.data).to.deep.equal(body); + expect(MockXMLHttpRequest.mostRecent.requestHeaders).to.deep.equal({ + 'X-Requested-With': 'XMLHttpRequest', + }); }); it('should not fail when FormData is undefined', () => { @@ -552,4 +555,3 @@ describe('Observable.ajax', () => { }); }); }); - diff --git a/src/observable/dom/AjaxObservable.ts b/src/observable/dom/AjaxObservable.ts index 87da9f89f1..513cfe1407 100644 --- a/src/observable/dom/AjaxObservable.ts +++ b/src/observable/dom/AjaxObservable.ts @@ -198,7 +198,7 @@ export class AjaxSubscriber extends Subscriber { } // ensure content type is set - if (!('Content-Type' in headers)) { + if (!('Content-Type' in headers) && !(root.FormData && request.body instanceof root.FormData)) { headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; } @@ -271,16 +271,18 @@ export class AjaxSubscriber extends Subscriber { } } - private serializeBody(body: any, contentType: string) { + private serializeBody(body: any, contentType?: string) { if (!body || typeof body === 'string') { return body; } else if (root.FormData && body instanceof root.FormData) { return body; } - const splitIndex = contentType.indexOf(';'); - if (splitIndex !== -1) { - contentType = contentType.substring(0, splitIndex); + if (contentType) { + const splitIndex = contentType.indexOf(';'); + if (splitIndex !== -1) { + contentType = contentType.substring(0, splitIndex); + } } switch (contentType) { @@ -288,6 +290,8 @@ export class AjaxSubscriber extends Subscriber { return Object.keys(body).map(key => `${encodeURI(key)}=${encodeURI(body[key])}`).join('&'); case 'application/json': return JSON.stringify(body); + default: + return body; } }