]>
Commit | Line | Data |
---|---|---|
1 | import { Injectable } from '@angular/core'; | |
2 | import { | |
3 | ConnectionBackend, | |
4 | Headers, | |
5 | Http, | |
6 | Request, | |
7 | RequestMethod, | |
8 | RequestOptions, | |
9 | RequestOptionsArgs, | |
10 | Response, | |
11 | XHRBackend | |
12 | } from '@angular/http'; | |
13 | import { Observable } from 'rxjs/Observable'; | |
14 | ||
15 | import { AuthService } from '../../core'; | |
16 | ||
17 | @Injectable() | |
18 | export class AuthHttp extends Http { | |
19 | constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private authService: AuthService) { | |
20 | super(backend, defaultOptions); | |
21 | } | |
22 | ||
23 | request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { | |
24 | if (!options) options = {}; | |
25 | ||
26 | options.headers = new Headers(); | |
27 | this.setAuthorizationHeader(options.headers); | |
28 | ||
29 | return super.request(url, options) | |
30 | .catch((err) => { | |
31 | if (err.status === 401) { | |
32 | return this.handleTokenExpired(url, options); | |
33 | } | |
34 | ||
35 | return Observable.throw(err); | |
36 | }); | |
37 | } | |
38 | ||
39 | delete(url: string, options?: RequestOptionsArgs): Observable<Response> { | |
40 | if (!options) options = {}; | |
41 | options.method = RequestMethod.Delete; | |
42 | ||
43 | return this.request(url, options); | |
44 | } | |
45 | ||
46 | get(url: string, options?: RequestOptionsArgs): Observable<Response> { | |
47 | if (!options) options = {}; | |
48 | options.method = RequestMethod.Get; | |
49 | ||
50 | return this.request(url, options); | |
51 | } | |
52 | ||
53 | post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { | |
54 | if (!options) options = {}; | |
55 | options.method = RequestMethod.Post; | |
56 | options.body = body; | |
57 | ||
58 | return this.request(url, options); | |
59 | } | |
60 | ||
61 | put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { | |
62 | if (!options) options = {}; | |
63 | options.method = RequestMethod.Put; | |
64 | options.body = body; | |
65 | ||
66 | return this.request(url, options); | |
67 | } | |
68 | ||
69 | private handleTokenExpired(url: string | Request, options: RequestOptionsArgs) { | |
70 | return this.authService.refreshAccessToken() | |
71 | .flatMap(() => { | |
72 | this.setAuthorizationHeader(options.headers); | |
73 | ||
74 | return super.request(url, options); | |
75 | }); | |
76 | } | |
77 | ||
78 | private setAuthorizationHeader(headers: Headers) { | |
79 | headers.set('Authorization', this.authService.getRequestHeaderValue()); | |
80 | } | |
81 | } | |
82 | ||
83 | export const AUTH_HTTP_PROVIDERS = [ | |
84 | { | |
85 | provide: AuthHttp, | |
86 | useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, authService: AuthService) => { | |
87 | return new AuthHttp(backend, defaultOptions, authService); | |
88 | }, | |
89 | deps: [ XHRBackend, RequestOptions, AuthService ] | |
90 | }, | |
91 | ]; |