@@ -126,6 +126,17 @@ Object.keys(aliased.options).map(function(k) {
126
126
//////////////////////////////////////////
127
127
// helpers
128
128
129
+ function get_env_var ( keys , try_lower ) {
130
+ var val , i = - 1 , env = process . env ;
131
+ while ( ! val && i < keys . length - 1 ) {
132
+ val = env [ keys [ ++ i ] ] ;
133
+ if ( ! val && try_lower ) {
134
+ val = env [ keys [ i ] . toLowerCase ( ) ] ;
135
+ }
136
+ }
137
+ return val ;
138
+ }
139
+
129
140
function keys_by_type ( type ) {
130
141
return Object . keys ( defaults ) . map ( function ( el ) {
131
142
if ( defaults [ el ] !== null && defaults [ el ] . constructor == type )
@@ -168,6 +179,32 @@ function resolve_url(href, base) {
168
179
return url . resolve ( base , href ) ;
169
180
}
170
181
182
+ function host_and_ports_match ( url1 , url2 ) {
183
+ if ( url1 . indexOf ( 'http' ) < 0 ) url1 = 'http://' + url1 ;
184
+ if ( url2 . indexOf ( 'http' ) < 0 ) url2 = 'http://' + url2 ;
185
+ var a = url . parse ( url1 ) , b = url . parse ( url2 ) ;
186
+
187
+ return a . host == b . host
188
+ && String ( a . port || ( a . protocol == 'https:' ? 443 : 80 ) )
189
+ == String ( b . port || ( b . protocol == 'https:' ? 443 : 80 ) ) ;
190
+ }
191
+
192
+ // returns false if a no_proxy host matches given url
193
+ function should_proxy_to ( url ) {
194
+ var no_proxy = get_env_var ( [ 'NO_PROXY' ] , true ) ;
195
+ if ( ! no_proxy ) return true ;
196
+
197
+ var host , hosts = no_proxy . split ( ',' ) ;
198
+ for ( var i in hosts ) {
199
+ host = hosts [ i ] ;
200
+ if ( host_and_ports_match ( host , url ) ) {
201
+ return false ;
202
+ }
203
+ }
204
+
205
+ return true ;
206
+ }
207
+
171
208
function pump_streams ( streams , cb ) {
172
209
if ( stream . pipeline )
173
210
return stream . pipeline . apply ( null , streams . concat ( cb ) ) ;
@@ -299,19 +336,26 @@ Needle.prototype.setup = function(uri, options) {
299
336
}
300
337
}
301
338
339
+ var env_proxy = get_env_var ( [ 'HTTP_PROXY' , 'HTTPS_PROXY' ] , true ) ;
340
+ if ( ! config . proxy && env_proxy ) config . proxy = env_proxy ;
341
+
302
342
// if proxy is present, set auth header from either url or proxy_user option.
303
343
if ( config . proxy ) {
304
- if ( config . proxy . indexOf ( 'http' ) === - 1 )
305
- config . proxy = 'http://' + config . proxy ;
344
+ if ( should_proxy_to ( uri ) ) {
345
+ if ( config . proxy . indexOf ( 'http' ) === - 1 )
346
+ config . proxy = 'http://' + config . proxy ;
347
+
348
+ if ( config . proxy . indexOf ( '@' ) !== - 1 ) {
349
+ var proxy = ( url . parse ( config . proxy ) . auth || '' ) . split ( ':' ) ;
350
+ options . proxy_user = proxy [ 0 ] ;
351
+ options . proxy_pass = proxy [ 1 ] ;
352
+ }
306
353
307
- if ( config . proxy . indexOf ( '@' ) !== - 1 ) {
308
- var proxy = ( url . parse ( config . proxy ) . auth || '' ) . split ( ':' ) ;
309
- options . proxy_user = proxy [ 0 ] ;
310
- options . proxy_pass = proxy [ 1 ] ;
354
+ if ( options . proxy_user )
355
+ config . headers [ ' proxy-authorization' ] = auth . basic ( options . proxy_user , options . proxy_pass ) ;
356
+ } else {
357
+ delete config . proxy ;
311
358
}
312
-
313
- if ( options . proxy_user )
314
- config . headers [ 'proxy-authorization' ] = auth . basic ( options . proxy_user , options . proxy_pass ) ;
315
359
}
316
360
317
361
// now that all our headers are set, overwrite them if instructed.
0 commit comments