完善错误响应

This commit is contained in:
xljiulang 2021-07-18 01:53:38 +08:00
parent 519556203c
commit 33eb6ff6b0
4 changed files with 21 additions and 12 deletions

View File

@ -35,6 +35,7 @@ namespace FastGithub.ReverseProxy
/// </summary> /// </summary>
/// <param name="domain"></param> /// <param name="domain"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="FastGithubException"></exception>
public async Task<IPAddress> ResolveAsync(string domain, CancellationToken cancellationToken) public async Task<IPAddress> ResolveAsync(string domain, CancellationToken cancellationToken)
{ {
// 缓存以避免做不必要的并发查询 // 缓存以避免做不必要的并发查询
@ -53,6 +54,7 @@ namespace FastGithub.ReverseProxy
/// <param name="domain"></param> /// <param name="domain"></param>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="FastGithubException">
private async Task<IPAddress> LookupAsync(string domain, CancellationToken cancellationToken) private async Task<IPAddress> LookupAsync(string domain, CancellationToken cancellationToken)
{ {
try try
@ -70,7 +72,7 @@ namespace FastGithub.ReverseProxy
// 如果解析到的ip为本机ip会产生反向代理请求死循环 // 如果解析到的ip为本机ip会产生反向代理请求死循环
if (address.Equals(IPAddress.Loopback)) if (address.Equals(IPAddress.Loopback))
{ {
throw new FastGithubException($"dns({dns}):解析{domain}被干扰为{address}"); throw new FastGithubException($"dns({dns})被污染:解析{domain}为{address}");
} }
return address; return address;
} }
@ -81,7 +83,7 @@ namespace FastGithub.ReverseProxy
catch (Exception ex) catch (Exception ex)
{ {
var dns = this.fastGithubConfig.PureDns; var dns = this.fastGithubConfig.PureDns;
throw new FastGithubException($"dns({dns}){ex.Message}", ex); throw new FastGithubException($"dns({dns})服务器异常{ex.Message}", ex);
} }
} }
} }

View File

@ -13,18 +13,18 @@ namespace FastGithub.ReverseProxy
/// </summary> /// </summary>
class NoSniHttpClientHanlder : DelegatingHandler class NoSniHttpClientHanlder : DelegatingHandler
{ {
private readonly DomainResolver trustedDomainResolver; private readonly DomainResolver domainResolver;
private readonly ILogger<NoSniHttpClientHanlder> logger; private readonly ILogger<NoSniHttpClientHanlder> logger;
/// <summary> /// <summary>
/// 不发送NoSni的HttpClientHandler /// 不发送NoSni的HttpClientHandler
/// </summary> /// </summary>
/// <param name="trustedDomainResolver"></param> /// <param name="domainResolver"></param>
public NoSniHttpClientHanlder( public NoSniHttpClientHanlder(
DomainResolver trustedDomainResolver, DomainResolver domainResolver,
ILogger<NoSniHttpClientHanlder> logger) ILogger<NoSniHttpClientHanlder> logger)
{ {
this.trustedDomainResolver = trustedDomainResolver; this.domainResolver = domainResolver;
this.logger = logger; this.logger = logger;
this.InnerHandler = CreateNoneSniHttpHandler(); this.InnerHandler = CreateNoneSniHttpHandler();
} }
@ -73,7 +73,7 @@ namespace FastGithub.ReverseProxy
var uri = request.RequestUri; var uri = request.RequestUri;
if (uri != null && uri.HostNameType == UriHostNameType.Dns) if (uri != null && uri.HostNameType == UriHostNameType.Dns)
{ {
var address = await this.trustedDomainResolver.ResolveAsync(uri.Host, cancellationToken); var address = await this.domainResolver.ResolveAsync(uri.Host, cancellationToken);
this.logger.LogInformation($"[{address}--NoSni->{uri.Host}]"); this.logger.LogInformation($"[{address}--NoSni->{uri.Host}]");
var builder = new UriBuilder(uri) var builder = new UriBuilder(uri)

View File

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System; using System;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -15,17 +16,20 @@ namespace FastGithub.ReverseProxy
private readonly SniHttpClientHanlder sniHttpClientHanlder; private readonly SniHttpClientHanlder sniHttpClientHanlder;
private readonly NoSniHttpClientHanlder noSniHttpClientHanlder; private readonly NoSniHttpClientHanlder noSniHttpClientHanlder;
private readonly FastGithubConfig fastGithubConfig; private readonly FastGithubConfig fastGithubConfig;
private readonly ILogger<ReverseProxyMiddleware> logger;
public ReverseProxyMiddleware( public ReverseProxyMiddleware(
IHttpForwarder httpForwarder, IHttpForwarder httpForwarder,
SniHttpClientHanlder sniHttpClientHanlder, SniHttpClientHanlder sniHttpClientHanlder,
NoSniHttpClientHanlder noSniHttpClientHanlder, NoSniHttpClientHanlder noSniHttpClientHanlder,
FastGithubConfig fastGithubConfig) FastGithubConfig fastGithubConfig,
ILogger<ReverseProxyMiddleware> logger)
{ {
this.httpForwarder = httpForwarder; this.httpForwarder = httpForwarder;
this.sniHttpClientHanlder = sniHttpClientHanlder; this.sniHttpClientHanlder = sniHttpClientHanlder;
this.noSniHttpClientHanlder = noSniHttpClientHanlder; this.noSniHttpClientHanlder = noSniHttpClientHanlder;
this.fastGithubConfig = fastGithubConfig; this.fastGithubConfig = fastGithubConfig;
this.logger = logger;
} }
/// <summary> /// <summary>
@ -63,7 +67,7 @@ namespace FastGithub.ReverseProxy
/// <param name="host"></param> /// <param name="host"></param>
/// <param name="destination"></param> /// <param name="destination"></param>
/// <returns></returns> /// <returns></returns>
private static string GetDestinationPrefix(string host, Uri? destination) private string GetDestinationPrefix(string host, Uri? destination)
{ {
var defaultValue = $"https://{host}/"; var defaultValue = $"https://{host}/";
if (destination == null) if (destination == null)
@ -72,7 +76,10 @@ namespace FastGithub.ReverseProxy
} }
var baseUri = new Uri(defaultValue); var baseUri = new Uri(defaultValue);
return new Uri(baseUri, destination).ToString(); var result = new Uri(baseUri, destination).ToString();
this.logger.LogInformation($"[{defaultValue}->{result}]");
return result;
} }
/// <summary> /// <summary>

View File

@ -12,7 +12,7 @@ namespace FastGithub.ReverseProxy
class SniHttpClientHanlder : DelegatingHandler class SniHttpClientHanlder : DelegatingHandler
{ {
private readonly DomainResolver domainResolver; private readonly DomainResolver domainResolver;
private readonly ILogger<NoSniHttpClientHanlder> logger; private readonly ILogger<SniHttpClientHanlder> logger;
/// <summary> /// <summary>
/// 携带Sni的HttpClientHandler /// 携带Sni的HttpClientHandler
@ -20,7 +20,7 @@ namespace FastGithub.ReverseProxy
/// <param name="domainResolver"></param> /// <param name="domainResolver"></param>
public SniHttpClientHanlder( public SniHttpClientHanlder(
DomainResolver domainResolver, DomainResolver domainResolver,
ILogger<NoSniHttpClientHanlder> logger) ILogger<SniHttpClientHanlder> logger)
{ {
this.domainResolver = domainResolver; this.domainResolver = domainResolver;
this.logger = logger; this.logger = logger;