@@ -137,11 +137,8 @@ proto.handle = function handle(req, res, out) {
137137
138138 debug ( 'dispatching %s %s' , req . method , req . url ) ;
139139
140- var search = 1 + req . url . indexOf ( '?' ) ;
141- var pathlength = search ? search - 1 : req . url . length ;
142- var fqdn = req . url [ 0 ] !== '/' && 1 + req . url . substr ( 0 , pathlength ) . indexOf ( '://' ) ;
143- var protohost = fqdn ? req . url . substr ( 0 , req . url . indexOf ( '/' , 2 + fqdn ) ) : '' ;
144140 var idx = 0 ;
141+ var protohost = getProtohost ( req . url ) || ''
145142 var removed = '' ;
146143 var slashAdded = false ;
147144 var paramcalled = { } ;
@@ -293,7 +290,7 @@ proto.handle = function handle(req, res, out) {
293290 req . url = protohost + req . url . substr ( protohost . length + removed . length ) ;
294291
295292 // Ensure leading slash
296- if ( ! fqdn && req . url [ 0 ] !== '/' ) {
293+ if ( ! protohost && req . url [ 0 ] !== '/' ) {
297294 req . url = '/' + req . url ;
298295 slashAdded = true ;
299296 }
@@ -526,6 +523,23 @@ function getPathname(req) {
526523 }
527524}
528525
526+ // Get get protocol + host for a URL
527+ function getProtohost ( url ) {
528+ if ( typeof url !== 'string' || url . length === 0 || url [ 0 ] === '/' ) {
529+ return undefined
530+ }
531+
532+ var searchIndex = url . indexOf ( '?' )
533+ var pathLength = searchIndex !== - 1
534+ ? searchIndex
535+ : url . length
536+ var fqdnIndex = url . substr ( 0 , pathLength ) . indexOf ( '://' )
537+
538+ return fqdnIndex !== - 1
539+ ? url . substr ( 0 , url . indexOf ( '/' , 3 + fqdnIndex ) )
540+ : undefined
541+ }
542+
529543// get type for error message
530544function gettype ( obj ) {
531545 var type = typeof obj ;
0 commit comments