feat(http): expose a list of human-readable http status codes (#23548)
They aim to improve code readability. Since they are defined by `const enum` they have zero runtime performance impact over just using constant literals. Fixes #23543 PR Close #23548
This commit is contained in:
parent
6b4909c588
commit
6fe3a1de7f
|
@ -1709,6 +1709,72 @@ export declare interface HttpSentEvent {
|
||||||
type: HttpEventType.Sent;
|
type: HttpEventType.Sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export declare const enum HttpStatusCode {
|
||||||
|
Continue = 100,
|
||||||
|
SwitchingProtocols = 101,
|
||||||
|
Processing = 102,
|
||||||
|
EarlyHints = 103,
|
||||||
|
Ok = 200,
|
||||||
|
Created = 201,
|
||||||
|
Accepted = 202,
|
||||||
|
NonAuthoritativeInformation = 203,
|
||||||
|
NoContent = 204,
|
||||||
|
ResetContent = 205,
|
||||||
|
PartialContent = 206,
|
||||||
|
MultiStatus = 207,
|
||||||
|
AlreadyReported = 208,
|
||||||
|
ImUsed = 226,
|
||||||
|
MultipleChoices = 300,
|
||||||
|
MovedPermanently = 301,
|
||||||
|
Found = 302,
|
||||||
|
SeeOther = 303,
|
||||||
|
NotModified = 304,
|
||||||
|
UseProxy = 305,
|
||||||
|
Unused = 306,
|
||||||
|
TemporaryRedirect = 307,
|
||||||
|
PermanentRedirect = 308,
|
||||||
|
BadRequest = 400,
|
||||||
|
Unauthorized = 401,
|
||||||
|
PaymentRequired = 402,
|
||||||
|
Forbidden = 403,
|
||||||
|
NotFound = 404,
|
||||||
|
MethodNotAllowed = 405,
|
||||||
|
NotAcceptable = 406,
|
||||||
|
ProxyAuthenticationRequired = 407,
|
||||||
|
RequestTimeout = 408,
|
||||||
|
Conflict = 409,
|
||||||
|
Gone = 410,
|
||||||
|
LengthRequired = 411,
|
||||||
|
PreconditionFailed = 412,
|
||||||
|
PayloadTooLarge = 413,
|
||||||
|
UriTooLong = 414,
|
||||||
|
UnsupportedMediaType = 415,
|
||||||
|
RangeNotSatisfiable = 416,
|
||||||
|
ExpectationFailed = 417,
|
||||||
|
ImATeapot = 418,
|
||||||
|
MisdirectedRequest = 421,
|
||||||
|
UnprocessableEntity = 422,
|
||||||
|
Locked = 423,
|
||||||
|
FailedDependency = 424,
|
||||||
|
TooEarly = 425,
|
||||||
|
UpgradeRequired = 426,
|
||||||
|
PreconditionRequired = 428,
|
||||||
|
TooManyRequests = 429,
|
||||||
|
RequestHeaderFieldsTooLarge = 431,
|
||||||
|
UnavailableForLegalReasons = 451,
|
||||||
|
InternalServerError = 500,
|
||||||
|
NotImplemented = 501,
|
||||||
|
BadGateway = 502,
|
||||||
|
ServiceUnavailable = 503,
|
||||||
|
GatewayTimeout = 504,
|
||||||
|
HttpVersionNotSupported = 505,
|
||||||
|
VariantAlsoNegotiates = 506,
|
||||||
|
InsufficientStorage = 507,
|
||||||
|
LoopDetected = 508,
|
||||||
|
NotExtended = 510,
|
||||||
|
NetworkAuthenticationRequired = 511
|
||||||
|
}
|
||||||
|
|
||||||
export declare interface HttpUploadProgressEvent extends HttpProgressEvent {
|
export declare interface HttpUploadProgressEvent extends HttpProgressEvent {
|
||||||
type: HttpEventType.UploadProgress;
|
type: HttpEventType.UploadProgress;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,6 @@ export {JsonpClientBackend, JsonpInterceptor} from './src/jsonp';
|
||||||
export {HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpInterceptingHandler as ɵHttpInterceptingHandler} from './src/module';
|
export {HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpInterceptingHandler as ɵHttpInterceptingHandler} from './src/module';
|
||||||
export {HttpParameterCodec, HttpParams, HttpParamsOptions, HttpUrlEncodingCodec} from './src/params';
|
export {HttpParameterCodec, HttpParams, HttpParamsOptions, HttpUrlEncodingCodec} from './src/params';
|
||||||
export {HttpRequest} from './src/request';
|
export {HttpRequest} from './src/request';
|
||||||
export {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaderResponse, HttpProgressEvent, HttpResponse, HttpResponseBase, HttpSentEvent, HttpUploadProgressEvent, HttpUserEvent} from './src/response';
|
export {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaderResponse, HttpProgressEvent, HttpResponse, HttpResponseBase, HttpSentEvent, HttpStatusCode, HttpUploadProgressEvent, HttpUserEvent} from './src/response';
|
||||||
export {HttpXhrBackend, XhrFactory} from './src/xhr';
|
export {HttpXhrBackend, XhrFactory} from './src/xhr';
|
||||||
export {HttpXsrfTokenExtractor} from './src/xsrf';
|
export {HttpXsrfTokenExtractor} from './src/xsrf';
|
||||||
|
|
|
@ -12,7 +12,8 @@ import {Observable, Observer} from 'rxjs';
|
||||||
|
|
||||||
import {HttpBackend, HttpHandler} from './backend';
|
import {HttpBackend, HttpHandler} from './backend';
|
||||||
import {HttpRequest} from './request';
|
import {HttpRequest} from './request';
|
||||||
import {HttpErrorResponse, HttpEvent, HttpEventType, HttpResponse} from './response';
|
import {HttpErrorResponse, HttpEvent, HttpEventType, HttpResponse, HttpStatusCode} from './response';
|
||||||
|
|
||||||
|
|
||||||
// Every request made through JSONP needs a callback name that's unique across the
|
// Every request made through JSONP needs a callback name that's unique across the
|
||||||
// whole page. Each request is assigned an id and the callback name is constructed
|
// whole page. Each request is assigned an id and the callback name is constructed
|
||||||
|
@ -169,7 +170,7 @@ export class JsonpClientBackend implements HttpBackend {
|
||||||
// returned.
|
// returned.
|
||||||
observer.next(new HttpResponse({
|
observer.next(new HttpResponse({
|
||||||
body,
|
body,
|
||||||
status: 200,
|
status: HttpStatusCode.Ok,
|
||||||
statusText: 'OK',
|
statusText: 'OK',
|
||||||
url,
|
url,
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -191,7 +191,7 @@ export abstract class HttpResponseBase {
|
||||||
statusText?: string,
|
statusText?: string,
|
||||||
url?: string,
|
url?: string,
|
||||||
},
|
},
|
||||||
defaultStatus: number = 200, defaultStatusText: string = 'OK') {
|
defaultStatus: number = HttpStatusCode.Ok, defaultStatusText: string = 'OK') {
|
||||||
// If the hash has values passed, use them to initialize the response.
|
// If the hash has values passed, use them to initialize the response.
|
||||||
// Otherwise use the default values.
|
// Otherwise use the default values.
|
||||||
this.headers = init.headers || new HttpHeaders();
|
this.headers = init.headers || new HttpHeaders();
|
||||||
|
@ -348,3 +348,78 @@ export class HttpErrorResponse extends HttpResponseBase implements Error {
|
||||||
this.error = init.error || null;
|
this.error = init.error || null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Http status codes.
|
||||||
|
* As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
|
||||||
|
* @publicApi
|
||||||
|
*/
|
||||||
|
export const enum HttpStatusCode {
|
||||||
|
Continue = 100,
|
||||||
|
SwitchingProtocols = 101,
|
||||||
|
Processing = 102,
|
||||||
|
EarlyHints = 103,
|
||||||
|
|
||||||
|
Ok = 200,
|
||||||
|
Created = 201,
|
||||||
|
Accepted = 202,
|
||||||
|
NonAuthoritativeInformation = 203,
|
||||||
|
NoContent = 204,
|
||||||
|
ResetContent = 205,
|
||||||
|
PartialContent = 206,
|
||||||
|
MultiStatus = 207,
|
||||||
|
AlreadyReported = 208,
|
||||||
|
ImUsed = 226,
|
||||||
|
|
||||||
|
MultipleChoices = 300,
|
||||||
|
MovedPermanently = 301,
|
||||||
|
Found = 302,
|
||||||
|
SeeOther = 303,
|
||||||
|
NotModified = 304,
|
||||||
|
UseProxy = 305,
|
||||||
|
Unused = 306,
|
||||||
|
TemporaryRedirect = 307,
|
||||||
|
PermanentRedirect = 308,
|
||||||
|
|
||||||
|
BadRequest = 400,
|
||||||
|
Unauthorized = 401,
|
||||||
|
PaymentRequired = 402,
|
||||||
|
Forbidden = 403,
|
||||||
|
NotFound = 404,
|
||||||
|
MethodNotAllowed = 405,
|
||||||
|
NotAcceptable = 406,
|
||||||
|
ProxyAuthenticationRequired = 407,
|
||||||
|
RequestTimeout = 408,
|
||||||
|
Conflict = 409,
|
||||||
|
Gone = 410,
|
||||||
|
LengthRequired = 411,
|
||||||
|
PreconditionFailed = 412,
|
||||||
|
PayloadTooLarge = 413,
|
||||||
|
UriTooLong = 414,
|
||||||
|
UnsupportedMediaType = 415,
|
||||||
|
RangeNotSatisfiable = 416,
|
||||||
|
ExpectationFailed = 417,
|
||||||
|
ImATeapot = 418,
|
||||||
|
MisdirectedRequest = 421,
|
||||||
|
UnprocessableEntity = 422,
|
||||||
|
Locked = 423,
|
||||||
|
FailedDependency = 424,
|
||||||
|
TooEarly = 425,
|
||||||
|
UpgradeRequired = 426,
|
||||||
|
PreconditionRequired = 428,
|
||||||
|
TooManyRequests = 429,
|
||||||
|
RequestHeaderFieldsTooLarge = 431,
|
||||||
|
UnavailableForLegalReasons = 451,
|
||||||
|
|
||||||
|
InternalServerError = 500,
|
||||||
|
NotImplemented = 501,
|
||||||
|
BadGateway = 502,
|
||||||
|
ServiceUnavailable = 503,
|
||||||
|
GatewayTimeout = 504,
|
||||||
|
HttpVersionNotSupported = 505,
|
||||||
|
VariantAlsoNegotiates = 506,
|
||||||
|
InsufficientStorage = 507,
|
||||||
|
LoopDetected = 508,
|
||||||
|
NotExtended = 510,
|
||||||
|
NetworkAuthenticationRequired = 511
|
||||||
|
}
|
||||||
|
|
|
@ -12,7 +12,8 @@ import {Observable, Observer} from 'rxjs';
|
||||||
import {HttpBackend} from './backend';
|
import {HttpBackend} from './backend';
|
||||||
import {HttpHeaders} from './headers';
|
import {HttpHeaders} from './headers';
|
||||||
import {HttpRequest} from './request';
|
import {HttpRequest} from './request';
|
||||||
import {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaderResponse, HttpJsonParseError, HttpResponse, HttpUploadProgressEvent} from './response';
|
import {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaderResponse, HttpJsonParseError, HttpResponse, HttpStatusCode, HttpUploadProgressEvent} from './response';
|
||||||
|
|
||||||
|
|
||||||
const XSSI_PREFIX = /^\)\]\}',?\n/;
|
const XSSI_PREFIX = /^\)\]\}',?\n/;
|
||||||
|
|
||||||
|
@ -142,7 +143,7 @@ export class HttpXhrBackend implements HttpBackend {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read status and normalize an IE9 bug (https://bugs.jquery.com/ticket/1450).
|
// Read status and normalize an IE9 bug (https://bugs.jquery.com/ticket/1450).
|
||||||
const status: number = xhr.status === 1223 ? 204 : xhr.status;
|
const status: number = xhr.status === 1223 ? HttpStatusCode.NoContent : xhr.status;
|
||||||
const statusText = xhr.statusText || 'OK';
|
const statusText = xhr.statusText || 'OK';
|
||||||
|
|
||||||
// Parse headers from XMLHttpRequest - this step is lazy.
|
// Parse headers from XMLHttpRequest - this step is lazy.
|
||||||
|
@ -168,14 +169,14 @@ export class HttpXhrBackend implements HttpBackend {
|
||||||
// The body will be read out if present.
|
// The body will be read out if present.
|
||||||
let body: any|null = null;
|
let body: any|null = null;
|
||||||
|
|
||||||
if (status !== 204) {
|
if (status !== HttpStatusCode.NoContent) {
|
||||||
// Use XMLHttpRequest.response if set, responseText otherwise.
|
// Use XMLHttpRequest.response if set, responseText otherwise.
|
||||||
body = (typeof xhr.response === 'undefined') ? xhr.responseText : xhr.response;
|
body = (typeof xhr.response === 'undefined') ? xhr.responseText : xhr.response;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalize another potential bug (this one comes from CORS).
|
// Normalize another potential bug (this one comes from CORS).
|
||||||
if (status === 0) {
|
if (status === 0) {
|
||||||
status = !!body ? 200 : 0;
|
status = !!body ? HttpStatusCode.Ok : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok determines whether the response will be transmitted on the event or
|
// ok determines whether the response will be transmitted on the event or
|
||||||
|
|
Loading…
Reference in New Issue