Question

For some reason when request is sent to HttpListener via non-standart address it returns

<h1>Bad Request (Invalid Hostname)</h1>

Example packet:

GET /index HTTP/1.1
Host: ::ffff:88.118.32.126:2548
Accept: */*

HTTP/1.1 400 Bad Request
Content-Type: text/html
Server: Microsoft-HTTPAPI/1.0
Date: Wed, 02 Feb 2011 19:05:18 GMT
Connection: close
Content-Length: 39

<h1>Bad Request (Invalid Hostname)</h1>

How could i solve this?

Edit: This is my code

public class Server
{
    private HttpListener Listener;
    private Log Log;

    public int Port = 1555;

    public Server(Log _log)
    {
        Log = _log;
    }

    public void Start()
    {
        Listener = new HttpListener();
        Listener.Prefixes.Add(string.Format("http://{0}:{1}/",
            "88.118.32.126", Port));

        Listener.Prefixes.Add(
            string.Format("http://{0}:{1}/",
            "*", Port)); //added these for testing, but still nothing

        Listener.Prefixes.Add(
            string.Format("http://::ffff:{0}:{1}/",
            "*", Port)); //added these for testing, but still nothing

        Listener.Start();
        Listener.BeginGetContext(ProcessRequest, Listener);

        Log.Add(string.Format("HTTP Server started on port {0}",
            Port), LogType.Info, true);
    }

    private void ProcessRequest(IAsyncResult result)
    {
        HttpListener listener = (HttpListener)result.AsyncState;
        HttpListenerContext context = listener.EndGetContext(result);

        HttpListenerRequest request = context.Request;
        HttpListenerResponse response = context.Response;

        string[] UrlParts = request.RawUrl.Split('/');
        Response output;

        if (request.RawUrl == "/index")
            output = new Response(context.Response.OutputStream, 
                ResponseType.Stats, UrlParts, Log);

        response.ContentLength64 = output.Size;
        response.ContentType = output.Header;

        output.Send();

        if (result.IsCompleted)
            Log.Add(String.Format("OUT > {1,15} {0,8} bytes -> {2}",
                output.Size, request.RemoteEndPoint.Address,
                request.RawUrl), LogType.Info, true);

        Listener.BeginGetContext(ProcessRequest, Listener);
    }
}
Was it helpful?

Solution

One way this error occurs is when HTTP.SYS can not match the HTTP Host header with its list of valid UrlAcl's. This could be because of problems resolving a hostname.

  1. Related answer explaining configuration steps
  2. MSDN documentation about setting up HTTP stand-alone
  3. Fixing a “Bad Request (Invalid Hostname)” - 400 Error, on Windows IIS Server (relevant potential solutions and commentary)

You can list the mappings at the command line:

Windows XP Support Tools / 2003 Support Tools - httpcfg

httpcfg query urlacl

Included with Windows Vista / 2008 / 7+ - netsh

netsh http show urlacl
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top