Ejemplo n.º 1
0
    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);
                    }
                });
            }
        }
    }
Ejemplo n.º 2
0
    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());
    }