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 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> /// 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; }
public void StartMonitoringContext(HttpClientContext context) { context.MonitorStartMS = EnvironmentTickCount(); _contexts.Enqueue(context); }
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; }
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); // } }
public OSHttpResponse(HttpServerLib.HttpResponse resp, HttpServerLib.HttpClientContext clientContext) { _httpResponse = resp; _httpClientContext = clientContext; }
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); }
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); // } }
/// <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."); }
/// <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; }
/// <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; }