From 31687efd6403ce9fd95576966544c170f62a67a6 Mon Sep 17 00:00:00 2001 From: Rob Wormald Date: Thu, 29 Oct 2015 17:50:12 -0700 Subject: [PATCH] fix(http): use Response for JSONP errors Return Response when JSONP backend errors --- .../src/http/backends/jsonp_backend.ts | 21 +++++++++++++++---- .../test/http/backends/jsonp_backend_spec.ts | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/modules/angular2/src/http/backends/jsonp_backend.ts b/modules/angular2/src/http/backends/jsonp_backend.ts index fb1390bce0..80a76ea9a0 100644 --- a/modules/angular2/src/http/backends/jsonp_backend.ts +++ b/modules/angular2/src/http/backends/jsonp_backend.ts @@ -1,5 +1,5 @@ import {ConnectionBackend, Connection} from '../interfaces'; -import {ReadyStates, RequestMethods} from '../enums'; +import {ReadyStates, RequestMethods, ResponseTypes} from '../enums'; import {Request} from '../static_request'; import {Response} from '../static_response'; import {ResponseOptions, BaseResponseOptions} from '../base_response_options'; @@ -11,6 +11,10 @@ import {StringWrapper, isPresent} from 'angular2/src/core/facade/lang'; // todo(robwormald): temporary until https://github.com/angular/angular/issues/4390 decided var Rx = require('@reactivex/rxjs/dist/cjs/Rx'); var {Observable} = Rx; + +const JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.'; +const JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.'; + export abstract class JSONPConnection implements Connection { readyState: ReadyStates; request: Request; @@ -28,7 +32,7 @@ export class JSONPConnection_ extends JSONPConnection { private baseResponseOptions?: ResponseOptions) { super(); if (req.method !== RequestMethods.Get) { - throw makeTypeError("JSONP requests must use GET request method."); + throw makeTypeError(JSONP_ERR_WRONG_METHOD); } this.request = req; this.response = new Observable(responseObserver => { @@ -56,7 +60,12 @@ export class JSONPConnection_ extends JSONPConnection { this.readyState = ReadyStates.Done; _dom.cleanup(script); if (!this._finished) { - responseObserver.error(makeTypeError('JSONP injected script did not invoke callback.')); + let responseOptions = + new ResponseOptions({body: JSONP_ERR_NO_CALLBACK, type: ResponseTypes.Error}); + if (isPresent(baseResponseOptions)) { + responseOptions = baseResponseOptions.merge(responseOptions); + } + responseObserver.error(new Response(responseOptions)); return; } @@ -73,7 +82,11 @@ export class JSONPConnection_ extends JSONPConnection { if (this.readyState === ReadyStates.Cancelled) return; this.readyState = ReadyStates.Done; _dom.cleanup(script); - responseObserver.error(error); + let responseOptions = new ResponseOptions({body: error.message, type: ResponseTypes.Error}); + if (isPresent(baseResponseOptions)) { + responseOptions = baseResponseOptions.merge(responseOptions); + } + responseObserver.error(new Response(responseOptions)); }; script.addEventListener('load', onLoad); diff --git a/modules/angular2/test/http/backends/jsonp_backend_spec.ts b/modules/angular2/test/http/backends/jsonp_backend_spec.ts index b3bc437de3..9476d8c403 100644 --- a/modules/angular2/test/http/backends/jsonp_backend_spec.ts +++ b/modules/angular2/test/http/backends/jsonp_backend_spec.ts @@ -134,7 +134,7 @@ export function main() { async.done(); }, err => { - expect(StringWrapper.contains(err.message, 'did not invoke callback')).toBe(true); + expect(err.text()).toEqual('JSONP injected script did not invoke callback.'); async.done(); }); @@ -150,7 +150,7 @@ export function main() { async.done(); }, err => { - expect(err['message']).toBe('Oops!'); + expect(err.text()).toBe('Oops!'); async.done(); });