89 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | /** | ||
|  |  * @license | ||
|  |  * Copyright Google Inc. All Rights Reserved. | ||
|  |  * | ||
|  |  * Use of this source code is governed by an MIT-style license that can be | ||
|  |  * found in the LICENSE file at https://angular.io/license
 | ||
|  |  */ | ||
|  | 
 | ||
|  | import {HttpHandler} from '../src/backend'; | ||
|  | import {HttpHeaders} from '../src/headers'; | ||
|  | import {HttpRequest} from '../src/request'; | ||
|  | import {HttpXsrfCookieExtractor, HttpXsrfInterceptor} from '../src/xsrf'; | ||
|  | 
 | ||
|  | import {HttpClientTestingBackend} from '../testing/src/backend'; | ||
|  | 
 | ||
|  | class SampleTokenExtractor { | ||
|  |   constructor(private token: string|null) {} | ||
|  | 
 | ||
|  |   getToken(): string|null { return this.token; } | ||
|  | } | ||
|  | 
 | ||
|  | export function main() { | ||
|  |   describe('HttpXsrfInterceptor', () => { | ||
|  |     let backend: HttpClientTestingBackend; | ||
|  |     const interceptor = new HttpXsrfInterceptor(new SampleTokenExtractor('test'), 'X-XSRF-TOKEN'); | ||
|  |     beforeEach(() => { backend = new HttpClientTestingBackend(); }); | ||
|  |     it('applies XSRF protection to outgoing requests', () => { | ||
|  |       interceptor.intercept(new HttpRequest('POST', '/test', {}), backend).subscribe(); | ||
|  |       const req = backend.expectOne('/test'); | ||
|  |       expect(req.request.headers.get('X-XSRF-TOKEN')).toEqual('test'); | ||
|  |       req.flush({}); | ||
|  |     }); | ||
|  |     it('does not apply XSRF protection when request is a GET', () => { | ||
|  |       interceptor.intercept(new HttpRequest('GET', '/test'), backend).subscribe(); | ||
|  |       const req = backend.expectOne('/test'); | ||
|  |       expect(req.request.headers.has('X-XSRF-TOKEN')).toEqual(false); | ||
|  |       req.flush({}); | ||
|  |     }); | ||
|  |     it('does not apply XSRF protection when request is a HEAD', () => { | ||
|  |       interceptor.intercept(new HttpRequest('HEAD', '/test'), backend).subscribe(); | ||
|  |       const req = backend.expectOne('/test'); | ||
|  |       expect(req.request.headers.has('X-XSRF-TOKEN')).toEqual(false); | ||
|  |       req.flush({}); | ||
|  |     }); | ||
|  |     it('does not overwrite existing header', () => { | ||
|  |       interceptor | ||
|  |           .intercept( | ||
|  |               new HttpRequest( | ||
|  |                   'POST', '/test', {}, {headers: new HttpHeaders().set('X-XSRF-TOKEN', 'blah')}), | ||
|  |               backend) | ||
|  |           .subscribe(); | ||
|  |       const req = backend.expectOne('/test'); | ||
|  |       expect(req.request.headers.get('X-XSRF-TOKEN')).toEqual('blah'); | ||
|  |       req.flush({}); | ||
|  |     }); | ||
|  |     it('does not set the header for a null token', () => { | ||
|  |       const interceptor = new HttpXsrfInterceptor(new SampleTokenExtractor(null), 'X-XSRF-TOKEN'); | ||
|  |       interceptor.intercept(new HttpRequest('POST', '/test', {}), backend).subscribe(); | ||
|  |       const req = backend.expectOne('/test'); | ||
|  |       expect(req.request.headers.has('X-XSRF-TOKEN')).toEqual(false); | ||
|  |       req.flush({}); | ||
|  |     }); | ||
|  |     afterEach(() => { backend.verify(); }); | ||
|  |   }); | ||
|  |   describe('HttpXsrfCookieExtractor', () => { | ||
|  |     let document: {[key: string]: string}; | ||
|  |     let extractor: HttpXsrfCookieExtractor | ||
|  |     beforeEach(() => { | ||
|  |       document = { | ||
|  |         cookie: 'XSRF-TOKEN=test', | ||
|  |       }; | ||
|  |       extractor = new HttpXsrfCookieExtractor(document, 'browser', 'XSRF-TOKEN'); | ||
|  |     }); | ||
|  |     it('parses the cookie from document.cookie', | ||
|  |        () => { expect(extractor.getToken()).toEqual('test'); }); | ||
|  |     it('does not re-parse if document.cookie has not changed', () => { | ||
|  |       expect(extractor.getToken()).toEqual('test'); | ||
|  |       expect(extractor.getToken()).toEqual('test'); | ||
|  |       expect(extractor.parseCount).toEqual(1); | ||
|  |     }); | ||
|  |     it('re-parses if document.cookie changes', () => { | ||
|  |       expect(extractor.getToken()).toEqual('test'); | ||
|  |       document['cookie'] = 'XSRF-TOKEN=blah'; | ||
|  |       expect(extractor.getToken()).toEqual('blah'); | ||
|  |       expect(extractor.parseCount).toEqual(2); | ||
|  |     }); | ||
|  |   }); | ||
|  | } |