1- /*jslint node:true, vars:true, todo:true, stupid:true, regexp:true*/
1+ /*jslint node:true, vars:true, todo:true, stupid:true, regexp:true, sloppy: true */
22/**
33 * Wrapper for built-in http.js to emulate the browser XMLHttpRequest object.
44 *
1212 * @license MIT
1313 */
1414
15+ require ( 'array.prototype.find' ) ;
16+ require ( 'string.prototype.includes' ) ;
17+
1518var Url = require ( "url" )
1619 , spawn = require ( "child_process" ) . spawn
1720 , fs = require ( 'fs' ) ;
1821
1922exports . XMLHttpRequest = function ( ) {
20- 'use strict' ;
2123 /**
2224 * Private variables
2325 */
@@ -293,6 +295,17 @@ exports.XMLHttpRequest = function() {
293295 var ssl = false , local = false ;
294296 var url = Url . parse ( settings . url ) ;
295297 var host ;
298+
299+ function getStack ( ) {
300+ var orig = Error . prepareStackTrace ;
301+ Error . prepareStackTrace = function ( _ , stack ) { return stack ; } ;
302+ var err = new Error ( ) ;
303+ Error . captureStackTrace ( err , arguments . callee ) ;
304+ var stack = err . stack ;
305+ Error . prepareStackTrace = orig ;
306+ return stack ;
307+ }
308+
296309 // Determine the server
297310 switch ( url . protocol ) {
298311 case 'https:' :
@@ -310,7 +323,23 @@ exports.XMLHttpRequest = function() {
310323 case undefined :
311324 case null :
312325 case '' :
313- host = "localhost" ;
326+ var stack = getStack ( ) ;
327+ var path = require ( 'path' ) ;
328+ var basePath = path . dirname ( stack . reverse ( ) . find ( function ( item ) {
329+ var filename = item . getFileName ( ) ;
330+ var idx = filename . search ( / [ \/ \\ ] n o d e _ m o d u l e s [ \/ \\ ] / ) ;
331+ if ( idx === - 1 ) { // Should be a user file, as a node executable like nodeunit ought to have node_modules in the path
332+ return true ;
333+ }
334+ // Should be a user file because its last "node_modules" contains this XMLHttpRequest file (i.e., XMLHttpRequest is a dependency of some kind)
335+ if ( __dirname . includes ( filename . slice ( 0 , idx ) ) ) {
336+ return true ;
337+ }
338+ return false ;
339+ } ) . getFileName ( ) ) ;
340+ var pathName = path . resolve ( basePath , settings . url ) ;
341+ url = { pathname : pathName } ;
342+ local = true ;
314343 break ;
315344
316345 default :
0 commit comments