1
0
Fork 0

Add ability to provide origin to NodeHttpImpl

* src/dapi/http/NodeHttpImpl.js (_parseUrl): Add method.
  (__construct): Add argument.
  (requestData): Use it.

* test/dapi/http/NodeHttpImplTest.js: Add tests.
master
Mike Gerwitz 2017-06-21 13:55:15 -04:00
parent c231983f34
commit 630af0a062
2 changed files with 78 additions and 2 deletions

View File

@ -45,6 +45,12 @@ module.exports = Class( 'NodeHttpImpl' )
*/ */
'private _urlParser': '', 'private _urlParser': '',
/**
* Request origin
* @type {string}
*/
'private _origin': '',
/** /**
* Initialize with protocol handlers and URL parser * Initialize with protocol handlers and URL parser
@ -53,13 +59,17 @@ module.exports = Class( 'NodeHttpImpl' )
* to a handler object conforming to Node's http(s) APIs---that is, it * to a handler object conforming to Node's http(s) APIs---that is, it
* should provide a `#request` method. * should provide a `#request` method.
* *
* `origin` is prepended to all request URLs.
*
* @param {Object} proto_handlers protocol handler key-value map * @param {Object} proto_handlers protocol handler key-value map
* @param {Object} url_parser URL parser * @param {Object} url_parser URL parser
* @param {string} origin request origin
*/ */
constructor( proto_handlers, url_parser ) constructor( proto_handlers, url_parser, origin )
{ {
this._protoHandlers = proto_handlers; this._protoHandlers = proto_handlers;
this._urlParser = url_parser; this._urlParser = url_parser;
this._origin = ( origin !== undefined ) ? ''+origin : '';
}, },
@ -79,7 +89,7 @@ module.exports = Class( 'NodeHttpImpl' )
*/ */
'public requestData'( url, method, data, callback ) 'public requestData'( url, method, data, callback )
{ {
const options = this._urlParser.parse( url ); const options = this._parseUrl( url );
const protocol = options.protocol.replace( /:$/, '' ); const protocol = options.protocol.replace( /:$/, '' );
const handler = this._protoHandlers[ protocol ]; const handler = this._protoHandlers[ protocol ];
@ -120,6 +130,25 @@ module.exports = Class( 'NodeHttpImpl' )
}, },
/**
* Parse given URL
*
* If the URL begins with a slash, the origin is prepended.
*
* @param {string} url URL
*
* @return {Object} parsed URL
*/
'private _parseUrl'( url )
{
const origin = ( url[ 0 ] === '/' )
? this._origin
: '';
return this._urlParser.parse( origin + url );
},
/** /**
* Set request options * Set request options
* *

View File

@ -90,6 +90,53 @@ describe( "NodeHttpImpl", () =>
} ); } );
describe( "given an origin", () =>
{
it( "prepends to URL if URL begins with a slash", done =>
{
const origin = 'https://foo.com';
const path = '/quux/quuux';
const url = _createMockUrl( given_url =>
{
expect( given_url ).to.equal( origin + path );
done();
} );
const http = _createMockHttp( ( _, callback ) =>
{
callback( res );
res.trigger( 'end' );
} );
Sut( { http: http }, url, origin )
.requestData( path, 'GET', {}, () => {} );
} );
it( "does not prepend to URL that does not begin with a slash", done =>
{
const origin = 'https://bar.com';
const path = 'http://foo.com/quux/quuux';
const url = _createMockUrl( given_url =>
{
expect( given_url ).to.equal( path );
done();
} );
const http = _createMockHttp( ( _, callback ) =>
{
callback( res );
res.trigger( 'end' );
} );
Sut( { http: http }, url, origin )
.requestData( path, 'GET', {}, () => {} );
} );
} );
it( "returns response when no error", done => it( "returns response when no error", done =>
{ {
const res = _createMockResp(); const res = _createMockResp();