Пример #1
0
        public virtual void HandleRequest(OSHttpRequest request, OSHttpResponse response)
        {
            try
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", true);
                response.SendChunked = false;
                IRequestHandler requestHandler;

                string path       = request.RawUrl;
                string handlerKey = GetHandlerKey(request.HttpMethod, path);

                if (TryGetStreamHandler(handlerKey, out requestHandler))
                {
                    byte[] buffer = null;
                    response.ContentType = request.ContentType;
                    if (requestHandler is IGenericHTTPHandler)
                    {
                        IGenericHTTPHandler HttpRequestHandler = requestHandler as IGenericHTTPHandler;
                        Stream   requestStream = request.InputStream;
                        Encoding encoding      = Encoding.UTF8;
                        string   requestBody   = string.Empty;
                        using (StreamReader reader = new StreamReader(requestStream, encoding))
                        {
                            requestBody = reader.ReadToEnd();
                        }
                        Hashtable keysvals        = new Hashtable();
                        Hashtable headervals      = new Hashtable();
                        string[]  querystringkeys = request.QueryString.AllKeys;
                        string[]  rHeaders        = request.Headers.AllKeys;

                        foreach (string queryname in querystringkeys)
                        {
                            keysvals.Add(queryname, request.Query[queryname]);
                        }
                        foreach (string headername in rHeaders)
                        {
                            headervals.Add(headername, request.Headers[headername]);
                        }
                        keysvals.Add("requestbody", requestBody);
                        keysvals.Add("headers", headervals);
                        keysvals.Add("form", request.Form);
                        keysvals.Add("uri", request.RawUrl);
                        keysvals.Add("contenttype", request.ContentType);
                        if (request.ContentEncoding != null && !keysvals.ContainsKey("encoding"))
                        {
                            keysvals.Add("encoding", request.ContentEncoding);
                        }
                        keysvals.Add("accepttypes", request.AcceptTypes);
                        DoHTTPGruntWork(HttpRequestHandler.Handle(path, keysvals), response);
                        return;
                    }
                    request.InputStream.Close();
                    if (buffer == null)
                    {
                        return;
                    }

                    if (!response.SendChunked)
                    {
                        response.ContentLength64 = buffer.LongLength;
                    }

                    try
                    {
                        response.OutputStream.Write(buffer, 0, buffer.Length);
                    }
                    catch (HttpListenerException)
                    {
                        m_Output.LogMessage("error", "[HTTPD]: HTTPRequest terminated abnormally " + Environment.NewLine);
                    }

                    try
                    {
                        response.Send();
                    }
                    catch (SocketException)
                    {
                        m_Output.LogMessage("error", "[HTTPD]: HTTPRequest terminated abnormally " + Environment.NewLine);
                    }
                    catch (IOException)
                    {
                        m_Output.LogMessage("error", "[HTTPD]: HTTPRequest terminated abnormally " + Environment.NewLine);
                    }
                }
                switch (request.ContentType)
                {
                case null:
                case "text/html":
                    HandleHTTPRequest(request, response);
                    return;

                default:
                    if (DoWeHaveAHTTPHandler(request.RawUrl))
                    {
                        HandleHTTPRequest(request, response);
                        return;
                    }
                    return;
                }
            }
            catch (SocketException e)
            {
                m_Output.LogMessage("warn", "[HTTPD]: HandleRequest threw " + e.Message + Environment.NewLine);
            }
            catch (IOException e)
            {
                m_Output.LogMessage("warn", "[HTTPD]: HandleRequest threw " + e.Message + Environment.NewLine);
            }
            catch (InvalidOperationException e)
            {
                m_Output.LogMessage("warn", "[HTTPD]: HandleRequest threw " + e.Message + Environment.NewLine);
            }
            return;
        }
Пример #2
0
        private void HandleContentVerbs(OSHttpRequest request, OSHttpResponse response)
        {
            Stream requestStream = request.InputStream;

            Encoding encoding    = Encoding.UTF8;
            string   requestBody = string.Empty;
            string   host        = string.Empty;

            using (StreamReader reader = new StreamReader(requestStream, encoding))
            {
                requestBody = reader.ReadToEnd();
            }

            Hashtable keysvals    = new Hashtable();
            Hashtable headervals  = new Hashtable();
            Hashtable requestVars = new Hashtable();

            string[] querystringkeys = request.QueryString.AllKeys;
            string[] rHeaders        = request.Headers.AllKeys;

            foreach (string queryname in querystringkeys)
            {
                keysvals.Add(queryname, request.Query[queryname]);
            }
            foreach (string headername in rHeaders)
            {
                headervals.Add(headername, request.Headers[headername]);
            }

            keysvals.Add("body", requestBody);
            keysvals.Add("uri", request.RawUrl);
            keysvals.Add("content-type", request.ContentType);
            keysvals.Add("http-method", request.HttpMethod);

            if (request.ContentEncoding != null && !keysvals.ContainsKey("encoding"))
            {
                keysvals.Add("encoding", request.ContentEncoding);
            }

            keysvals.Add("accepttypes", request.AcceptTypes);

            foreach (string queryname in querystringkeys)
            {
                if (!keysvals.ContainsKey(queryname))
                {
                    keysvals.Add(queryname, request.QueryString[queryname]);
                }
                if (!requestVars.ContainsKey(queryname))
                {
                    requestVars.Add(queryname, keysvals[queryname]);
                }
            }

            foreach (string headername in rHeaders)
            {
                headervals[headername] = request.Headers[headername];
            }

            if (headervals.Contains("Host"))
            {
                host = (string)headervals["Host"];
            }
            keysvals.Add("headers", headervals);
            keysvals.Add("form", request.Form);
            foreach (HttpInputItem item in request.Form)
            {
                if (!keysvals.ContainsKey(item.Name))
                {
                    keysvals.Add(item.Name, item.Value);
                }
                //m_log.Output(string.Format("{0}={1}\r\n", item.Name, item.Value));
            }

            if (keysvals.Contains("method"))
            {
                string            method = (string)keysvals["method"];
                GenericHTTPMethod requestProcessor;
                bool foundHandler = TryGetHTTPHandler(method, out requestProcessor);
                if (foundHandler)
                {
                    Hashtable responsedata1 = requestProcessor(keysvals);
                    DoHTTPGruntWork(responsedata1, response);
                }
                else
                {
                    FileRequest.FileResponse fileoutput = null;
                    Exception exceptionout = null;
                    if (m_fileRequestHandler.TryGetFile(request, out fileoutput, out exceptionout))
                    {
                        if (exceptionout == null)
                        {
                            SendFile(request, response, fileoutput);
                        }
                        else
                        {
                            if (exceptionout is System.Security.SecurityException || exceptionout is UnauthorizedAccessException)
                            {
                                SendHTML403(response);
                            }
                            else if (exceptionout is FileNotFoundException || exceptionout is DirectoryNotFoundException || exceptionout is ArgumentException || exceptionout is ArgumentNullException)
                            {
                                SendHTML404(response, host);
                            }
                            else
                            {
                                SendHTML500(response);
                            }
                        }
                    }
                    else
                    {
                        SendHTML404(response, host);
                    }
                }
            }
            else
            {
                GenericHTTPMethod requestProcessor;
                bool foundHandler = TryGetHTTPHandlerPathBased(request.RawUrl, out requestProcessor);
                if (foundHandler)
                {
                    Hashtable responsedata2 = requestProcessor(keysvals);
                    DoHTTPGruntWork(responsedata2, response);
                }
                else
                {
                    FileRequest.FileResponse fileoutput = null;
                    Exception exceptionout = null;
                    if (m_fileRequestHandler.TryGetFile(request, out fileoutput, out exceptionout))
                    {
                        if (exceptionout == null)
                        {
                            SendFile(request, response, fileoutput);
                        }
                        else
                        {
                            if (exceptionout is System.Security.SecurityException || exceptionout is UnauthorizedAccessException)
                            {
                                SendHTML403(response);
                            }
                            else if (exceptionout is FileNotFoundException || exceptionout is DirectoryNotFoundException || exceptionout is ArgumentException || exceptionout is ArgumentNullException)
                            {
                                SendHTML404(response, host);
                            }
                            else
                            {
                                SendHTML500(response);
                            }
                        }
                    }
                    else
                    {
                        SendHTML404(response, host);
                    }
                }
            }
        }
Пример #3
0
        internal void DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response)
        {
            int    responsecode   = (int)responsedata["int_response_code"];
            string responseString = string.Empty;

            if (responsedata.ContainsKey("str_response_string"))
            {
                responseString = (string)responsedata["str_response_string"];
            }

            string contentType = string.Empty;

            if (responsedata.ContainsKey("content_type"))
            {
                contentType = (string)responsedata["content_type"];
            }

            string RedirectLocationHeader = string.Empty;

            if (responsedata.ContainsKey("redirect_location"))
            {
                RedirectLocationHeader = (string)responsedata["redirect_location"];
            }

            if (responsedata.ContainsKey("error_status_text"))
            {
                response.StatusDescription = (string)responsedata["error_status_text"];
            }
            if (responsedata.ContainsKey("http_protocol_version"))
            {
                response.ProtocolVersion = (string)responsedata["http_protocolversion_version"];
            }
            if (responsedata.ContainsKey("keepalive"))
            {
                bool keepalive = (bool)responsedata["keepalive"];
                response.KeepAlive = keepalive;
            }

            if (responsedata.ContainsKey("reusecontext"))
            {
                response.ReuseContext = (bool)responsedata["reusecontext"];
            }

            if (string.IsNullOrEmpty(contentType))
            {
                contentType = "text/html";
            }
            response.StatusCode = responsecode;

            switch (responsecode)
            {
            case 302:
                response.AddHeader("Location", RedirectLocationHeader);
                break;

            default:
                response.AddHeader("Content-Type", contentType);
                break;
            }



            byte[] buffer;
            if (!contentType.Contains("image"))
            {
                buffer = Encoding.UTF8.GetBytes(responseString);
            }
            else
            {
                buffer = Convert.FromBase64String(responseString);
            }
            response.SendChunked     = false;
            response.ContentLength64 = buffer.LongLength;
            response.ContentEncoding = Encoding.UTF8;

            try
            {
                response.OutputStream.Write(buffer, 0, buffer.Length);
            }
            catch (Exception ex)
            {
                m_Output.LogMessage("error", "[HTTPD]: Error - " + ex.Message + Environment.NewLine);
            }
            finally
            {
                try
                {
                    response.OutputStream.Flush();
                    response.Send();
                }
                catch (SocketException e)
                {
                    m_Output.LogMessage("warn", "There was an underlying socket error.  Perhaps the socket disconnected." + e.Message + Environment.NewLine);
                }
                catch (IOException e)
                {
                    m_Output.LogMessage("warn", "There was an IO issue: " + e.Message + Environment.NewLine);
                }
            }
        }