public void AddToRouteBuilder(RouteBuilder rb, bool showDetailError) { this.IsSealed = true; foreach (var act in List) { foreach (var method in act.Methods._GetWebMethodListFromBits()) { rb.MapVerb(method.ToString(), act.Template, async(request, response, routeData) => { CgiContext ctx = new CgiContext(request, routeData, request._GetRequestCancellationToken()); try { await using HttpResult result = await act.ActionAsync(ctx); await response._SendHttpResultAsync(result, ctx.Cancel); } catch (Exception ex) { ex = ex._GetSingleException(); ex._Error(); string errorStr; if (showDetailError == false) { errorStr = ex.Message; } else { errorStr = ex.ToString(); } await using var errorResult = new HttpStringResult($"HTTP Status Code: 500\r\n" + errorStr, statusCode: 500); await response._SendHttpResultAsync(errorResult, ctx.Cancel); } }); } } }
public async Task <string> GetResponseAsync(CgiContext ctx, CancellationToken cancel = default) { // Query string の解析 bool port = ctx.QueryString._GetStrFirst("port")._ToBool(); bool fqdn = ctx.QueryString._GetStrFirst("fqdn")._ToBool(); bool verifyfqdn = ctx.QueryString._GetStrFirst("verifyfqdn")._ToBool(); StringWriter w = new StringWriter(); IPAddress clientIp = ctx.ClientIpAddress; string proxySrcIpStr = ctx.Request.Headers._GetStrFirst("x-proxy-srcip"); var proxySrcIp = proxySrcIpStr._ToIPAddress(noExceptionAndReturnNull: true); if (proxySrcIp != null) { clientIp = proxySrcIp; } if (port == false && fqdn == false) { // 従来のサーバーとの互換性を維持するため改行を入れません !! return($"IP={clientIp.ToString()}"); } w.WriteLine($"IP={clientIp.ToString()}"); if (port) { w.WriteLine($"PORT={ctx.ClientPort}"); } if (fqdn) { string hostname = clientIp.ToString(); try { var ipType = clientIp._GetIPAddressType(); if (ipType.BitAny(IPAddressType.IPv4_IspShared | IPAddressType.Loopback | IPAddressType.Zero | IPAddressType.Multicast | IPAddressType.LocalUnicast)) { // ナーシ } else { hostname = await this.Dns.GetHostNameOrIpAsync(clientIp, cancel); if (verifyfqdn) { try { var ipList = await this.Dns.GetIpAddressListSingleStackAsync(hostname, clientIp.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6?DnsResolverQueryType.AAAA : DnsResolverQueryType.A, cancel : cancel); if ((ipList?.Any(x => IpComparer.Comparer.Equals(x, clientIp)) ?? false) == false) { // NG hostname = ctx.ClientIpAddress.ToString(); } } catch { // NG hostname = ctx.ClientIpAddress.ToString(); } } } } catch { } w.WriteLine($"FQDN={hostname}"); } return(w.ToString()); }