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 */
2
2
/**
3
3
* Wrapper for built-in http.js to emulate the browser XMLHttpRequest object.
4
4
*
12
12
* @license MIT
13
13
*/
14
14
15
+ require ( 'array.prototype.find' ) ;
16
+ require ( 'string.prototype.includes' ) ;
17
+
15
18
var Url = require ( "url" )
16
19
, spawn = require ( "child_process" ) . spawn
17
20
, fs = require ( 'fs' ) ;
18
21
19
22
exports . XMLHttpRequest = function ( ) {
20
- 'use strict' ;
21
23
/**
22
24
* Private variables
23
25
*/
@@ -293,6 +295,17 @@ exports.XMLHttpRequest = function() {
293
295
var ssl = false , local = false ;
294
296
var url = Url . parse ( settings . url ) ;
295
297
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
+
296
309
// Determine the server
297
310
switch ( url . protocol ) {
298
311
case 'https:' :
@@ -310,7 +323,23 @@ exports.XMLHttpRequest = function() {
310
323
case undefined :
311
324
case null :
312
325
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 ;
314
343
break ;
315
344
316
345
default :
0 commit comments