1010const xhr2 : any = require ( 'xhr2' ) ;
1111
1212import { Injectable , Injector , Provider } from '@angular/core' ;
13-
13+ import { DOCUMENT } from '@angular/common' ;
1414import { HttpEvent , HttpRequest , HttpHandler , HttpBackend , XhrFactory , ɵHttpInterceptingHandler as HttpInterceptingHandler } from '@angular/common/http' ;
15-
1615import { Observable , Observer , Subscription } from 'rxjs' ;
1716
17+ // @see https://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01#URI-syntax
18+ const isAbsoluteUrl = / ^ [ a - z A - Z \- \+ . ] + : \/ \/ / ;
19+ const FORWARD_SLASH = '/' ;
20+
1821@Injectable ( )
1922export class ServerXhr implements XhrFactory {
2023 build ( ) : XMLHttpRequest {
@@ -102,11 +105,21 @@ export abstract class ZoneMacroTaskWrapper<S, R> {
102105
103106export class ZoneClientBackend extends
104107 ZoneMacroTaskWrapper < HttpRequest < any > , HttpEvent < any > > implements HttpBackend {
105- constructor ( private backend : HttpBackend ) {
108+ constructor ( private backend : HttpBackend , private doc : Document ) {
106109 super ( ) ;
107110 }
108111
109112 handle ( request : HttpRequest < any > ) : Observable < HttpEvent < any > > {
113+ const href = this . doc . location . href ;
114+ if ( ! isAbsoluteUrl . test ( request . url ) && href ) {
115+ const urlParts = Array . from ( request . url ) ;
116+ if ( request . url [ 0 ] === FORWARD_SLASH && href [ href . length - 1 ] === FORWARD_SLASH ) {
117+ urlParts . shift ( ) ;
118+ } else if ( request . url [ 0 ] !== FORWARD_SLASH && href [ href . length - 1 ] !== FORWARD_SLASH ) {
119+ urlParts . splice ( 0 , 0 , FORWARD_SLASH ) ;
120+ }
121+ return this . wrap ( request . clone ( { url : href + urlParts . join ( '' ) } ) ) ;
122+ }
110123 return this . wrap ( request ) ;
111124 }
112125
@@ -115,12 +128,16 @@ export class ZoneClientBackend extends
115128 }
116129}
117130
118- export function zoneWrappedInterceptingHandler ( backend : HttpBackend , injector : Injector ) {
131+ export function zoneWrappedInterceptingHandler (
132+ backend : HttpBackend , injector : Injector , doc : Document ) {
119133 const realBackend : HttpBackend = new HttpInterceptingHandler ( backend , injector ) ;
120- return new ZoneClientBackend ( realBackend ) ;
134+ return new ZoneClientBackend ( realBackend , doc ) ;
121135}
122136
123137export const SERVER_HTTP_PROVIDERS : Provider [ ] = [
124- { provide : XhrFactory , useClass : ServerXhr } ,
125- { provide : HttpHandler , useFactory : zoneWrappedInterceptingHandler , deps : [ HttpBackend , Injector ] }
138+ { provide : XhrFactory , useClass : ServerXhr } , {
139+ provide : HttpHandler ,
140+ useFactory : zoneWrappedInterceptingHandler ,
141+ deps : [ HttpBackend , Injector , DOCUMENT ]
142+ }
126143] ;
0 commit comments