Contains a connection to a browser/client.
Remember to Start after you have hooked the RequestReceived event.
Inheritance: IHttpClientContext, IDisposable
Esempio n. 1
0
        public void Dispose()
        {
            if (_initialMsgTimeout > 0)
            {
                _receiveDone.Set();
                _initialMsgTimeout = 0;
            }
            if (_networkContext != null && _networkContext.Stream != null)
            {
                if (_networkContext.Stream.CanWrite)
                {
                    _networkContext.Stream.Flush();
                }
                _networkContext.Stream.Close();
                _networkContext.Stream.Dispose();
                _networkContext.Stream = null;
            }

            if (_request != null && _request.InputStream != null)
            {
                _request.InputStream.Close();
                _request.InputStream.Dispose();
                _request = null;
            }

            if (_clientContext != null)
            {
                _clientContext.Close();
                _clientContext = null;
            }
        }
 public PollServiceHttpRequest(
     PollServiceEventArgs pPollServiceArgs, HttpServerLib.HttpClientContext pHttpContext, HttpServerLib.HttpRequest pRequest)
 {
     PollServiceArgs = pPollServiceArgs;
     HttpContext     = pHttpContext;
     Request         = pRequest;
     RequestTime     = System.Environment.TickCount;
     RequestID       = UUID.Random();
 }
 public PollServiceHttpRequest(
     PollServiceEventArgs pPollServiceArgs, HttpServerLib.HttpClientContext pHttpContext, HttpServerLib.HttpRequest pRequest)
 {
     PollServiceArgs = pPollServiceArgs;
     HttpContext = pHttpContext;
     Request = pRequest;
     RequestTime = System.Environment.TickCount;
     RequestID = UUID.Random();
 }
Esempio n. 4
0
 public WebSocketHttpServerHandler(OSHttpRequest preq, HttpServerLib.HttpClientContext pContext, int bufferlen)
     : base(preq.HttpMethod, preq.Url.OriginalString)
 {
     _request        = preq;
     _networkContext = pContext.GiveMeTheNetworkStreamIKnowWhatImDoing();
     _networkContext.Stream.ReadTimeout = _defaultReadTimeout;
     _clientContext = pContext;
     _bufferLength  = bufferlen;
     _buffer        = new byte[_bufferLength];
 }
Esempio n. 5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="HttpResponse"/> class.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="request">The request.</param>
        public HttpResponse(HttpClientContext context, HttpRequest request)
        {
            _httpVersion = request.HttpVersion;
            if (string.IsNullOrEmpty(_httpVersion))
                throw new ArgumentException("HttpVersion in HttpRequest cannot be empty.");

            Status = HttpStatusCode.OK;
            _context = context;
            Connection = request.Connection;
        }
Esempio n. 6
0
 public void StartMonitoringContext(HttpClientContext context)
 {
     context.MonitorStartMS = EnvironmentTickCount();
     _contexts.Enqueue(context);
 }
Esempio n. 7
0
        private bool ContextTimedOut(HttpClientContext context, out SocketError disconnectError, out bool stopMonitoring)
        {
            stopMonitoring = false;
            disconnectError = SocketError.InProgress;

            // First our error conditions
            if (context == null)
            {
                stopMonitoring = true;
                return true;
            }

            // Recycled context
            if (context.Available)
            {
                stopMonitoring = true;
                return true;
            }

            // Next our special use conditions
            // Special case when multiple client contexts are being responded to by a single thread
            //if (context.EndWhenDone)
            //{
            //    stopMonitoring = true;
            //    return true;
            //}

            // Special case for websockets
            if (context.StreamPassedOff)
            {
                stopMonitoring = true;
                return true;
            }

            // Now for the case when the context has the stop monitoring bool set
            if (context.StopMonitoring)
            {
                stopMonitoring = true;
                return true;
            }

            // Now we start checking for actual timeouts

            // First we check that we got at least one line within context.TimeoutFirstLine milliseconds
            if (!context.FirstRequestLineReceived)
            {
                if (EnvironmentTickCountAdd(context.TimeoutFirstLine, context.MonitorStartMS) <= EnvironmentTickCount())
                {
                    disconnectError = SocketError.TimedOut;
                    context.MonitorStartMS = 0;
                    return true;
                }
            }

            // First we check that we got at least one line within context.TimeoutFirstLine milliseconds
            if (!context.FullRequestReceived)
            {
                if (EnvironmentTickCountAdd(context.TimeoutRequestReceived, context.MonitorStartMS) <= EnvironmentTickCount())
                {
                    disconnectError = SocketError.TimedOut;
                    context.MonitorStartMS = 0;
                    return true;
                }
            }

            // First we check that we got at least one line within context.TimeoutFirstLine milliseconds
            if (!context.FullRequestProcessed && !context.EndWhenDone)
            {
                if (EnvironmentTickCountAdd(context.TimeoutFullRequestProcessed, context.MonitorStartMS) <= EnvironmentTickCount())
                {
                    disconnectError = SocketError.TimedOut;
                    context.MonitorStartMS = 0;
                    return true;
                }
            }

            if (context.TriggerKeepalive)
            {
                context.TriggerKeepalive = false;
                context.MonitorKeepaliveMS = EnvironmentTickCount();
            }

            if (context.FullRequestProcessed && context.MonitorKeepaliveMS == 0)
            {
                stopMonitoring = true;
                return true;
            }

            if (context.MonitorKeepaliveMS != 0 &&
                EnvironmentTickCountAdd(context.TimeoutKeepAlive, context.MonitorKeepaliveMS) <= EnvironmentTickCount())
            {
                disconnectError = SocketError.TimedOut;
                context.MonitorStartMS = 0;
                context.MonitorKeepaliveMS = 0;
                return true;
            }

            return false;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="IHttpResponse"/> class.
        /// </summary>
        /// <param name="context">Client that send the <see cref="IHttpRequest"/>.</param>
        /// <param name="httpVersion">Version of HTTP protocol that the client uses.</param>
        /// <param name="connectionType">Type of HTTP connection used.</param>
        internal HttpResponse(HttpClientContext context, string httpVersion, ConnectionType connectionType)
        {
            Check.NotEmpty(httpVersion, "httpVersion");

            Status = HttpStatusCode.OK;
            _context = context;
            _httpVersion = httpVersion;
            Connection = connectionType;
        }
Esempio n. 9
0
        public OSHttpRequest(HttpServerLib.HttpClientContext context, HttpServerLib.HttpRequest req)
        {
            _request = req;
            _context = context;

            if (null != req.Headers["content-encoding"])
            {
                try
                {
                    _contentEncoding = Encoding.GetEncoding(_request.Headers["content-encoding"]);
                }
                catch (Exception)
                {
                    // ignore
                }
            }
            
            if (null != req.Headers["content-type"])
                _contentType = _request.Headers["content-type"];
            if (null != req.Headers["user-agent"])
                _userAgent = req.Headers["user-agent"];
            
            if (null != req.Headers["remote_addr"])
            {
                try
                {
                    IPAddress addr = IPAddress.Parse(req.Headers["remote_addr"]);
                    // sometimes req.Headers["remote_port"] returns a comma separated list, so use
                    // the first one in the list and log it 
                    string[] strPorts = req.Headers["remote_port"].Split(new char[] { ',' });
                    if (strPorts.Length > 1)
                    {
                        _log.ErrorFormat("[OSHttpRequest]: format exception on addr/port {0}:{1}, ignoring",
                                     req.Headers["remote_addr"], req.Headers["remote_port"]);
                    }
                    int port = Int32.Parse(strPorts[0]);
                    _remoteIPEndPoint = new IPEndPoint(addr, port);
                }
                catch (FormatException)
                {
                    _log.ErrorFormat("[OSHttpRequest]: format exception on addr/port {0}:{1}, ignoring", 
                                     req.Headers["remote_addr"], req.Headers["remote_port"]);
                }
            }

            _queryString = new NameValueCollection();
            _query = new Hashtable();
            try
            {
                foreach (HttpServerLib.HttpInputItem item in req.QueryString)
                {
                    try
                    {
                        _queryString.Add(item.Name, item.Value);
                        _query[item.Name] = item.Value;
                    }
                    catch (InvalidCastException)
                    {
                        _log.DebugFormat("[OSHttpRequest]: error parsing {0} query item, skipping it", item.Name);
                        continue;
                    }
                }
            }
            catch (Exception)
            {
                _log.ErrorFormat("[OSHttpRequest]: Error parsing querystring");
            }

//            Form = new Hashtable();
//            foreach (HttpInputItem item in req.Form)
//            {
//                _log.DebugFormat("[OSHttpRequest]: Got form item {0}={1}", item.Name, item.Value);
//                Form.Add(item.Name, item.Value);
//            }
        }
Esempio n. 10
0
 public OSHttpResponse(HttpServerLib.HttpResponse resp, HttpServerLib.HttpClientContext clientContext)
 {
     _httpResponse      = resp;
     _httpClientContext = clientContext;
 }
Esempio n. 11
0
 public HttpServerContextObj(HttpServerLib.HttpClientContext contxt, HttpServerLib.HttpRequest reqs)
 {
     context = contxt;
     req = reqs;
 }
        private void ProcessRequest(HttpClientContext context, HttpRequest request)
        {
            HttpResponse response = request.CreateResponse(context);
            try
            {
                foreach (IRule rule in _rules)
                {
                    if (!rule.Process(request, response))
                        continue;
                    response.Send();
                    return;
                }

                // load cookies if the exist.
                RequestCookies cookies = request.Headers["cookie"] != null
                                             ? new RequestCookies(request.Headers["cookie"])
                                             : new RequestCookies(string.Empty);

                request.SetCookies(cookies);

                IHttpSession session;
                if (cookies[_sessionCookieName] != null)
                {
                    string sessionCookie = cookies[_sessionCookieName].Value;

                    // there's a bug somewhere which f***s up headers which can render the session cookie useless.
                    // therefore let's consider the session cookie as not set if that have happened.
                    if (sessionCookie.Length > 40)
                    {
                        _logWriter.Write(this, LogPrio.Error, "Session cookie is invalid: " + sessionCookie);
                        cookies.Remove(_sessionCookieName);
                        _sessionStore.Remove(sessionCookie); // free the session cookie (and thus generating a new one).
                        session = _sessionStore.Create();
                    }
                    else
                        session = _sessionStore.Load(sessionCookie) ??
                                  _sessionStore.Create(sessionCookie);
                }
                else
                    session = _sessionStore.Create();

                HandleRequest(context, request, response, session);
            }
            catch (Exception err)
            {
                if (_exceptionHandler == null)
            #if DEBUG
                    throw;
            #else
                {
                    WriteLog(LogPrio.Fatal, err.Message);
                    return;
                }
            #endif
                _exceptionHandler(this, err);

                Exception e = err;
                while (e != null)
                {
                    if (e is SocketException)
                        return;

                    e = e.InnerException;
                }

                try
                {
            #if DEBUG
                    context.Respond("HTTP/1.0", HttpStatusCode.InternalServerError, "Internal server error", err.ToString(), "text/plain");
            #else
                    context.Respond("HTTP/1.0", HttpStatusCode.InternalServerError, "Internal server error");
            #endif
                }
                catch (Exception err2)
                {
                    LogWriter.Write(this, LogPrio.Fatal, "Failed to respond on message with Internal Server Error: " + err2);
                }

            }
        }
        public void Dispose()
        {
            if (_initialMsgTimeout > 0)
            {
                _receiveDone.Set();
                _initialMsgTimeout = 0;
            }
            if (_networkContext != null && _networkContext.Stream != null)
            {
                if (_networkContext.Stream.CanWrite)
                    _networkContext.Stream.Flush();
                _networkContext.Stream.Close();
                _networkContext.Stream.Dispose();
                _networkContext.Stream = null;
            }

            if (_request != null && _request.InputStream != null)
            {
                _request.InputStream.Close();
                _request.InputStream.Dispose();
                _request = null;
            }

            if (_clientContext != null)
            {
                _clientContext.Close();
                _clientContext = null;
            }
        }
 /// <summary>
 /// Create a response object.
 /// </summary>
 /// <returns>A new <see cref="IHttpResponse"/>.</returns>
 public HttpResponse CreateResponse(HttpClientContext context)
 {
     return new HttpResponse(context, this);
 }
Esempio n. 15
0
        public OSHttpRequest(HttpServerLib.HttpClientContext context, HttpServerLib.HttpRequest req)
        {
            _request = req;
            _context = context;

            if (null != req.Headers["content-encoding"])
            {
                try
                {
                    _contentEncoding = Encoding.GetEncoding(_request.Headers["content-encoding"]);
                }
                catch (Exception)
                {
                    // ignore
                }
            }

            if (null != req.Headers["content-type"])
            {
                _contentType = _request.Headers["content-type"];
            }
            if (null != req.Headers["user-agent"])
            {
                _userAgent = req.Headers["user-agent"];
            }

            if (null != req.Headers["remote_addr"])
            {
                try
                {
                    IPAddress addr = IPAddress.Parse(req.Headers["remote_addr"]);
                    // sometimes req.Headers["remote_port"] returns a comma separated list, so use
                    // the first one in the list and log it
                    string[] strPorts = req.Headers["remote_port"].Split(new char[] { ',' });
                    if (strPorts.Length > 1)
                    {
                        _log.ErrorFormat("[OSHttpRequest]: format exception on addr/port {0}:{1}, ignoring",
                                         req.Headers["remote_addr"], req.Headers["remote_port"]);
                    }
                    int port = Int32.Parse(strPorts[0]);
                    _remoteIPEndPoint = new IPEndPoint(addr, port);
                }
                catch (FormatException)
                {
                    _log.ErrorFormat("[OSHttpRequest]: format exception on addr/port {0}:{1}, ignoring",
                                     req.Headers["remote_addr"], req.Headers["remote_port"]);
                }
            }

            _queryString = new NameValueCollection();
            _query       = new Hashtable();
            try
            {
                foreach (HttpServerLib.HttpInputItem item in req.QueryString)
                {
                    try
                    {
                        _queryString.Add(item.Name, item.Value);
                        _query[item.Name] = item.Value;
                    }
                    catch (InvalidCastException)
                    {
                        _log.DebugFormat("[OSHttpRequest]: error parsing {0} query item, skipping it", item.Name);
                        continue;
                    }
                }
            }
            catch (Exception)
            {
                _log.ErrorFormat("[OSHttpRequest]: Error parsing querystring");
            }

//            Form = new Hashtable();
//            foreach (HttpInputItem item in req.Form)
//            {
//                _log.DebugFormat("[OSHttpRequest]: Got form item {0}={1}", item.Name, item.Value);
//                Form.Add(item.Name, item.Value);
//            }
        }
Esempio n. 16
0
        /// <summary>
        /// Turn an HttpRequest into an OSHttpRequestItem and place it
        /// in the queue. The OSHttpRequestQueue object will pulse the
        /// next available idle pump.
        /// </summary>
        protected void OnHttpRequest(HttpClientContext client, HttpRequest request)
        {
            // turn request into OSHttpRequest
            OSHttpRequest req = new OSHttpRequest(client, request);

            // place OSHttpRequest into _httpRequestQueue, will
            // trigger Pulse to idle waiting pumps
            _queue.Enqueue(req);
        }
        /// <summary>
        /// Process an incoming request.
        /// </summary>
        /// <param name="context">connection to client</param>
        /// <param name="request">request information</param>
        /// <param name="response">response that should be filled</param>
        /// <param name="session">session information</param>
        protected virtual void HandleRequest(HttpClientContext context, HttpRequest request, HttpResponse response,
											 IHttpSession session)
        {
            _logWriter.Write(this, LogPrio.Trace, "Processing request....");
            bool handled = false;
            try
            {
                DecodeBody(request);
                if (ProcessAuthentication(request, response, session))
                {
                    foreach (HttpModule module in _modules)
                    {
                        if (!module.Process(request, response, session))
                            continue;

                        handled = true;
                        if (!module.AllowSecondaryProcessing)
                            break;
                    }
                }
            }
            catch (HttpException err)
            {
                if (err.HttpStatusCode == HttpStatusCode.Unauthorized)
                {
                    AuthenticationModule mod;
                    lock (_authModules)
                        mod = _authModules.Count > 0 ? _authModules[0] : null;

                    if (mod != null)
                        RequestAuthentication(mod, request, response);
                }
                else
                    ErrorPage(response, err);
            }

            if (!handled && response.Status == HttpStatusCode.OK)
                ErrorPage(response, HttpStatusCode.NotFound, "Resource not found: " + request.Uri);

            if (!response.HeadersSent)
            {
                // Dispose session if it was not used.
                if (session.Count > 0)
                {
                    _sessionStore.Save(session);
                    // only set session cookie if it have not been sent in the request.
                    if (request.Cookies[_sessionCookieName] == null)
                        response.Cookies.Add(new ResponseCookie(_sessionCookieName, session.Id, DateTime.MinValue));//DateTime.Now.AddMinutes(20).AddDays(1)));
                }
                else
                    _sessionStore.AddUnused(session);
            }

            if (!response.Sent)
                response.Send();

            _logWriter.Write(this, LogPrio.Trace, "....done.");
        }
 public WebSocketHttpServerHandler(OSHttpRequest preq, HttpServerLib.HttpClientContext pContext, int bufferlen)
     : base(preq.HttpMethod, preq.Url.OriginalString)
 {
     _request = preq;
     _networkContext = pContext.GiveMeTheNetworkStreamIKnowWhatImDoing();
     _networkContext.Stream.ReadTimeout = _defaultReadTimeout;
     _clientContext = pContext;
     _bufferLength = bufferlen;
     _buffer = new byte[_bufferLength];
 }
 /// <summary>
 /// Can be overloaded to implement stuff when a client have been connected.
 /// </summary>
 /// <remarks>
 /// Default implementation does nothing.
 /// </remarks>
 /// <param name="client">client that disconnected</param>
 /// <param name="error">disconnect reason</param>
 protected virtual void OnClientDisconnected(HttpClientContext client, SocketError error)
 {
 }
 public void Enqueue(HttpClientContext context, HttpRequest request)
 {
     QueueItem item = new QueueItem { Context = context, Request = request };
     lock (_queue)
         _queue.Enqueue(item);
 }
 /// <summary>
 /// To be able to track request count.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="request"></param>
 private void ProcessRequestWrapper(HttpClientContext context, HttpRequest request)
 {
     _requestQueue.CurrentRequestCount += 1;
     ProcessRequest(context, request);
     _requestQueue.CurrentRequestCount -= 1;
 }
Esempio n. 22
0
 /// <summary>
 /// Instantiate an OSHttpResponse object from an OSHttpRequest
 /// object.
 /// </summary
 /// <param name="req">Incoming OSHttpRequest to which we are
 /// replying</param>
 public OSHttpResponse(OSHttpRequest req)
 {
     _httpResponse      = new HttpServerLib.HttpResponse(req.HttpClientContext, req.HttpRequest);
     _httpClientContext = req.HttpClientContext;
 }