Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions modules/angular2/src/http/base_request_options.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import {CONST_EXPR, CONST, isPresent, isString} from 'angular2/src/core/facade/lang';
import {isPresent, isString} from 'angular2/src/core/facade/lang';
import {Headers} from './headers';
import {RequestMethods} from './enums';
import {RequestOptionsArgs} from './interfaces';
import {Injectable} from 'angular2/src/core/di';
import {URLSearchParams} from './url_search_params';
import {normalizeMethodName} from './http_utils';

/**
* Creates a request options object similar to the `RequestInit` description
Expand All @@ -19,7 +20,7 @@ export class RequestOptions {
*
* Defaults to "GET".
*/
method: RequestMethods;
method: RequestMethods | string;
/**
* Headers object based on the `Headers` class in the [Fetch
* Spec](https://fetch.spec.whatwg.org/#headers-class).
Expand All @@ -33,7 +34,7 @@ export class RequestOptions {
url: string;
search: URLSearchParams;
constructor({method, headers, body, url, search}: RequestOptionsArgs = {}) {
this.method = isPresent(method) ? method : null;
this.method = isPresent(method) ? normalizeMethodName(method) : null;
this.headers = isPresent(headers) ? headers : null;
this.body = isPresent(body) ? body : null;
this.url = isPresent(url) ? url : null;
Expand Down
16 changes: 16 additions & 0 deletions modules/angular2/src/http/http_utils.ts
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
import {isString} from 'angular2/src/core/facade/lang';
import {RequestMethods} from './enums';
import {makeTypeError} from 'angular2/src/core/facade/exceptions';

export function normalizeMethodName(method): RequestMethods {
if (isString(method)) {
var originalMethod = method;
method = method.replace(/(\w)(\w*)/g, (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase());
method = RequestMethods[method];
if (typeof method !== 'number')
throw makeTypeError(
`Invalid request method. The method "${originalMethod}" is not supported.`);
}
return method;
}

export {isJsObject} from 'angular2/src/core/facade/lang';
2 changes: 1 addition & 1 deletion modules/angular2/src/http/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class Connection {
// https://github.com/angular/angular/issues/3828
export interface RequestOptionsArgs {
url?: string;
method?: RequestMethods;
method?: string | RequestMethods;
search?: string | URLSearchParams;
headers?: Headers;
// TODO: Support Blob, ArrayBuffer, JSON, URLSearchParams, FormData
Expand Down
4 changes: 2 additions & 2 deletions modules/angular2/src/http/static_request.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {RequestMethods} from './enums';
import {RequestOptions} from './base_request_options';
import {Headers} from './headers';
import {normalizeMethodName} from './http_utils';
import {
RegExpWrapper,
CONST_EXPR,
Expand All @@ -9,7 +10,6 @@ import {
StringWrapper
} from 'angular2/src/core/facade/lang';


// TODO(jeffbcross): properly implement body accessors
/**
* Creates `Request` instances from provided values.
Expand Down Expand Up @@ -51,7 +51,7 @@ export class Request {
}
}
this._body = requestOptions.body;
this.method = requestOptions.method;
this.method = normalizeMethodName(requestOptions.method);
// TODO(jeffbcross): implement behavior
// Defaults to 'omit', consistent with browser
// TODO(jeffbcross): implement behavior
Expand Down
23 changes: 23 additions & 0 deletions modules/angular2/test/http/http_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,29 @@ export function main() {
res => {});
}));
});

describe('string method names', () => {
it('should allow case insensitive strings for method names', () => {
inject([AsyncTestCompleter], (async) => {
ObservableWrapper.subscribe<MockConnection>(backend.connections, c => {
expect(c.request.method)
.toBe(RequestMethods.Post)
c.mockRespond(new Response(new ResponseOptions({body: 'Thank you'})));
async.done();
});
ObservableWrapper.subscribe(http.request(new Request(new RequestOptions(
{url: 'https://google.com', method: 'PosT'}))),
(res) => {});
});
});

it('should throw when invalid string parameter is passed for method name', () => {
expect(() => {
http.request(
new Request(new RequestOptions({url: 'https://google.com', method: 'Invalid'})));
}).toThrowError('Invalid request method. The method "Invalid" is not supported.');
});
});
});

describe('Jsonp', () => {
Expand Down