@@ -372,22 +372,21 @@ protected String rewriteLocation(Route route, String url, String location) {
372
372
return location ;
373
373
}
374
374
375
- protected void doLog (Route route , HttpServerRequest realReq , HttpServerResponse realResp , String realUrl ) {
376
-
375
+ protected void doLog (Route route , HttpServerRequest serverReq , HttpServerResponse serverResp , String proxyUrl ) {
377
376
if (route .getMetadata (P_LOG ) != null && Boolean .parseBoolean (route .getMetadata (P_LOG ))) {
378
377
String logFormat = route .getMetadata (P_LOG_FORMAT ).toString ();
379
378
if (logFormat == null || logFormat .isEmpty ()) {
380
379
logFormat = LOG_FORMAT_DEFAULT ;
381
380
}
382
381
String logInfo = logFormat
383
382
.replace ("{name}" , route .getName ())
384
- .replace ("{method}" , realReq .method ().toString ())
385
- .replace ("{userAgent}" , realReq .getHeader ("User-Agent" ))
386
- .replace ("{remoteAddr}" , realReq .remoteAddress ().hostAddress ())
387
- .replace ("{remotePort}" , String .valueOf (realReq .remoteAddress ().port ()))
388
- .replace ("{source}" , realReq .uri ())
389
- .replace ("{target}" , realUrl )
390
- .replace ("{statusCode}" , String .valueOf (realResp .getStatusCode ()))
383
+ .replace ("{method}" , serverReq .method ().toString ())
384
+ .replace ("{userAgent}" , serverReq .getHeader ("User-Agent" ))
385
+ .replace ("{remoteAddr}" , serverReq .remoteAddress ().hostAddress ())
386
+ .replace ("{remotePort}" , String .valueOf (serverReq .remoteAddress ().port ()))
387
+ .replace ("{source}" , serverReq .uri ())
388
+ .replace ("{target}" , proxyUrl )
389
+ .replace ("{statusCode}" , String .valueOf (serverResp .getStatusCode ()))
391
390
.replace ("{consumedMills}" , String .valueOf (System .currentTimeMillis () - (Long ) route .getMetadata (P_SEND_TIMESTAMP )));
392
391
log .info (logInfo );
393
392
}
@@ -396,83 +395,97 @@ protected void doLog(Route route, HttpServerRequest realReq, HttpServerResponse
396
395
/**
397
396
* 发起请求Handler
398
397
*/
399
- protected Handler <AsyncResult <HttpClientResponse >> sendRequestHandler (Route route , HttpServerRequest realReq , HttpServerResponse realResp , String realUrl ) {
398
+ protected Handler <AsyncResult <HttpClientResponse >> sendRequestHandler (Route route , HttpServerRequest serverReq , HttpServerResponse serverResp , String proxyUrl ) {
400
399
return ar -> {
401
400
if (ar .succeeded ()) {
402
- HttpClientResponse proxyResp = ar .result ();
401
+ HttpClientResponse clientResp = ar .result ();
402
+ // 暂停流读取
403
+ clientResp .pause ();
403
404
// 复制响应头。复制的过程中忽略逐跳标头
404
- copyResponseHeaders (route , realReq , realResp , proxyResp );
405
- if (!realResp .headers ().contains ("Content-Length" )) {
406
- realResp .setChunked (true );
405
+ copyResponseHeaders (route , serverReq , serverResp , clientResp );
406
+ if (!serverResp .headers ().contains ("Content-Length" )) {
407
+ serverResp .setChunked (true );
407
408
}
408
409
// 设置响应码
409
- realResp .setStatusCode (proxyResp .statusCode ());
410
+ serverResp .setStatusCode (clientResp .statusCode ());
410
411
// 流输出
411
- proxyResp .pipeTo (realResp ).onSuccess (v -> {
412
- doLog (route , realReq , realResp , realUrl );
412
+ clientResp .pipeTo (serverResp ).onSuccess (v -> {
413
+ doLog (route , serverReq , serverResp , proxyUrl );
413
414
}).onFailure (e -> {
414
- realResp .setStatusCode (502 );
415
- realResp .end ("Bad Gateway" );
416
- log .error ("{} {} proxy response copy error" , realReq .method ().name (), realUrl , e );
415
+ badGateway (route , serverReq , serverResp , proxyUrl );
416
+ log .error ("{} {} proxy response copy error" , serverReq .method ().name (), proxyUrl , e );
417
417
});
418
-
419
418
} else {
419
+ badGateway (route , serverReq , serverResp , proxyUrl );
420
420
Throwable e = ar .cause ();
421
- realResp .setStatusCode (502 );
422
- realResp .end ("Bad Gateway" );
423
- log .error ("{} {} send request error" , realReq .method ().name (), realUrl , e );
421
+ log .error ("{} {} send request error" , serverReq .method ().name (), proxyUrl , e );
424
422
}
425
423
};
426
424
}
427
425
428
426
/**
429
427
* 建立连接Handler
430
428
*/
431
- protected Handler <AsyncResult <HttpClientRequest >> connectHandler (Route route , HttpServerRequest realReq , HttpServerResponse realResp , String realUrl ) {
429
+ protected Handler <AsyncResult <HttpClientRequest >> connectHandler (Route route , HttpServerRequest serverReq , HttpServerResponse serverResp , String proxyUrl ) {
432
430
return ar -> {
433
431
if (ar .succeeded ()) {
434
- HttpClientRequest proxyReq = ar .result ();
432
+ HttpClientRequest clientReq = ar .result ();
435
433
// 复制请求头。复制的过程中忽略逐跳标头
436
- copyRequestHeaders (route , realReq , proxyReq );
434
+ copyRequestHeaders (route , serverReq , clientReq );
437
435
// 若存在请求体,则将请求体复制。使用流式复制,避免占用大量内存
438
- if (proxyReq .headers ().contains ("Content-Length" ) || proxyReq .headers ().contains ("Transfer-Encoding" )) {
439
- realReq .pipeTo (proxyReq );
436
+ if (clientReq .headers ().contains ("Content-Length" ) || clientReq .headers ().contains ("Transfer-Encoding" )) {
437
+ clientReq .send (serverReq ).onComplete (sendRequestHandler (route , serverReq , serverResp , proxyUrl ));
438
+ } else {
439
+ clientReq .send ().onComplete (sendRequestHandler (route , serverReq , serverResp , proxyUrl ));
440
440
}
441
- // 发送请求
442
- route .putMetadata (P_SEND_TIMESTAMP , System .currentTimeMillis ());
443
- proxyReq .send ().onComplete (sendRequestHandler (route , realReq , realResp , realUrl ));
444
441
} else {
442
+ badGateway (route , serverReq , serverResp , proxyUrl );
445
443
Throwable e = ar .cause ();
446
- log .error ("{} {} open connection error" , realReq .method ().name (), realUrl , e );
444
+ log .error ("{} {} open connection error" , serverReq .method ().name (), proxyUrl , e );
447
445
}
448
446
449
447
};
450
448
}
451
449
450
+ private void badGateway (Route route , HttpServerRequest serverReq , HttpServerResponse serverResp , String proxyUrl ) {
451
+ if (!serverResp .ended ()) {
452
+ serverResp .setStatusCode (502 ).end ("Bad Gateway" );
453
+ }
454
+ doLog (route , serverReq , serverResp , proxyUrl );
455
+ }
456
+
452
457
/**
453
458
* 路由处理Handler
454
459
*/
455
460
protected Handler <RoutingContext > routingContextHandler (HttpClient httpClient ) {
456
461
return ctx -> {
457
462
// vertx的uri()是包含query参数的。而path()才是我们常说的不带有query的uri
458
463
Route route = ctx .currentRoute ();
464
+
465
+ // 记录请求开始时间
466
+ route .putMetadata (P_SEND_TIMESTAMP , System .currentTimeMillis ());
467
+
459
468
String result = route .getMetadata (P_TARGET_URL ).toString ();
460
- HttpServerRequest realReq = ctx .request ();
461
- HttpServerResponse realResp = ctx .response ();
462
- String absoluteURI = realReq .absoluteURI ();
469
+ HttpServerRequest serverReq = ctx .request ();
470
+ HttpServerResponse serverResp = ctx .response ();
471
+
472
+ // 暂停流读取
473
+ serverReq .pause ();
474
+
475
+ String absoluteURI = serverReq .absoluteURI ();
463
476
UrlParser .ParsedUrl parsedUrl = UrlParser .parseUrl (absoluteURI );
464
477
String prefix = parsedUrl .getFormatHostPort () + (route .getMetadata (P_SOURCE_URL ).toString ().replace ("/*" , "" ));
465
- String realUrl = result + (parsedUrl .getFormatUrl ().replace (prefix , "" ));
478
+ String proxyUrl = result + (parsedUrl .getFormatUrl ().replace (prefix , "" ));
466
479
467
480
468
481
// 构建请求参数
469
482
RequestOptions requestOptions = new RequestOptions ();
470
- requestOptions .setAbsoluteURI (realUrl );
471
- requestOptions .setMethod (realReq .method ());
483
+ requestOptions .setAbsoluteURI (proxyUrl );
484
+ requestOptions .setMethod (serverReq .method ());
472
485
requestOptions .setFollowRedirects (route .getMetadata (P_FOLLOW_REDIRECTS ) != null && Boolean .parseBoolean (route .getMetadata (P_FOLLOW_REDIRECTS )));
473
486
474
487
// 请求
475
- httpClient .request (requestOptions ).onComplete (connectHandler (route , realReq , realResp , realUrl ));
488
+ httpClient .request (requestOptions ).onComplete (connectHandler (route , serverReq , serverResp , proxyUrl ));
476
489
};
477
490
}
478
491
0 commit comments