protected virtual void OnHttpRequestReceived(HttpRequestState state) { try { RequestReceived?.Invoke(this, new RequestEventArgs(state)); } catch (Exception ex) { OnException(ex); } }
protected void ChangeState(HttpRequestState newState) { if (_onStateChangeCallback != null) { _onStateChangeCallback(CurrentState, newState); } PreviousState = CurrentState; CurrentState = newState; _state = CurrentState; }
public static void CloseSession() { ISession session = HttpRequestState.Get(currentSessionKey) as ISession; if (session == null) { return; } session.Close(); HttpRequestState.Remove(currentSessionKey); }
public static void LogHttpRequest(this ILogger logger, string url, string httpMethod, DateTimeOffset startTime, TimeSpan duration, Exception exception, LogLevel logLevel = LogLevel.Error) { var state = new HttpRequestState { HttpMethod = httpMethod, EventTime = startTime, RequestUrl = url, ResponseTime = duration, Success = exception == null }; logger.Log(logLevel, 1, state, exception, HttpRequestState.Formatter); }
public static void LogHttpRequest(this ILogger logger, string url, string httpMethod, DateTimeOffset startTime, TimeSpan duration, LogLevel logLevel = LogLevel.Information, string responseCode = null) { var state = new HttpRequestState { HttpMethod = httpMethod, EventTime = startTime, RequestUrl = url, ResponseCode = responseCode, ResponseTime = duration, Success = true }; logger.Log(logLevel, 1, state, null, HttpRequestState.Formatter); }
public ParserState ParseBuffer( byte[] buffer, int bytesReady, ref int bytesConsumed) { if (buffer == null) { throw Error.ArgumentNull("buffer"); } ParserState parseStatus = ParserState.NeedMoreData; ParserState subParseStatus = ParserState.NeedMoreData; switch (_requestStatus) { case HttpRequestState.RequestLine: try { subParseStatus = _requestLineParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { _requestStatus = HttpRequestState.RequestHeaders; subParseStatus = ParserState.NeedMoreData; goto case HttpRequestState.RequestHeaders; } else if (subParseStatus != ParserState.NeedMoreData) { // Report error - either Invalid or DataTooBig parseStatus = subParseStatus; break; } break; // read more data case HttpRequestState.RequestHeaders: if (bytesConsumed >= bytesReady) { // we already can tell we need more data break; } try { subParseStatus = _headerParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { parseStatus = subParseStatus; } else if (subParseStatus != ParserState.NeedMoreData) { parseStatus = subParseStatus; break; } break; // need more data } return parseStatus; }
protected virtual void HandlePacketHeader(IOTaskCompleteEventArgs <SocketReceiveTask> e) { if (IsWebSocket) //receive encoded message { byte first = e.Buffer.Buffer[e.Buffer.Offset]; /*support multi-part frames? * bool fin = (first & (1 << 7)) != 0; * bool rsv1 = (first & (1 << 6)) != 0; * bool rsv2 = (first & (1 << 5)) != 0; * bool rsv3 = (first & (1 << 4)) != 0; */ var opcode = (WebSocketOpCode)(first & ((1 << 4) - 1)); if (opcode == WebSocketOpCode.Close) { Disconnect(); return; } byte second = e.Buffer.Buffer[e.Buffer.Offset + 1]; int length = second & 127; bool masked = (second & (1 << 7)) != 0; if (!masked && should_mask) { //MASKED BIT NOT SET Disconnect(WebSocketCloseStatus.ProtocolError); return; } e.Task.UserToken = new WebSocketReceiveState { OpCode = opcode, IsMasking = masked }; switch (length) { case 126: //ushort State = ReceiveStatus.Decode_Length; e.Task.Count = 2; break; case 127: //ulong State = ReceiveStatus.Decode_Length; e.Task.Count = 8; break; default: State = ReceiveStatus.Payload; e.Task.Count = masked ? length + 4: length; break; } } else { ushort length = BitConverter.ToUInt16(e.Buffer.Buffer, e.Buffer.Offset); // Ares has a hard message limit of 4k... enforce? // Zorbo uses a *default* socket buffer of 8k // Anything larger than this is either special or an error if (length == 17735 || //Numerical equivalent of "GE" length == 17736 || //"HE" length == 20304) //"PO" { var token = new HttpRequestState(); token.Buffer.AddRange(e.Buffer.Buffer.Skip(e.Buffer.Offset).Take(2)); State = ReceiveStatus.Request_Head; e.Task.UserToken = token; e.Task.Count = length == 17735 ? 3 : 4;//need to receive rest of request from stream } else { if (length >= SocketManager.BufferSize) { throw new SocketException((int)SocketError.NoBufferSpaceAvailable); } State = ReceiveStatus.Payload; e.Task.Count = length + 1; } } //we got this far, keep receiving if (IsConnected) { Socket.QueueReceive(e.Task); } }
protected virtual bool ReadHttpRequest(PacketReader reader) { var sb = new StringBuilder(); string header = string.Empty; bool haveHeader = false; while (reader.Remaining >= 0) { sb.Append(reader.ReadChars(Math.Min(4, (int)reader.Remaining))); header = sb.ToString(); if (header.EndsWith("\r\n\r\n")) { haveHeader = true; break; } } if (!haveHeader) { return(false); } int contentLen = 0; string[] lines = header.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); Match match = Regex.Match(lines[0], "(\\S+)\\s+/(\\S*)\\s+(\\S*)"); if (match.Success) { var token = new HttpRequestState { Method = match.Groups[1].Value, RequestUri = match.Groups[2].Value, Protocol = match.Groups[3].Value }; for (int i = 1; i < lines.Length; i++) { match = Regex.Match(lines[i], "\\s*(\\S+)\\s*:\\s*(\\S+)"); if (match.Success) { string key = match.Groups[1].Value.ToUpper(); string value = match.Groups[2].Value; switch (key) { case "CONTENT-LENGTH": int.TryParse(value, out contentLen); break; case "SEC-WEBSOCKET-PROTOCOL": break; } token.Headers.Add(key, value); } } if (contentLen > 0) { if (reader.Remaining < contentLen) { return(false); } token.Content = reader.ReadString(contentLen); } OnHttpRequestReceived(token); return(true); } else { Disconnect(); return(false); } }
public ParserState ParseBuffer( byte[] buffer, int bytesReady, ref int bytesConsumed) { if (buffer == null) { throw Error.ArgumentNull("buffer"); } ParserState parseStatus = ParserState.NeedMoreData; ParserState subParseStatus = ParserState.NeedMoreData; switch (_requestStatus) { case HttpRequestState.RequestLine: try { subParseStatus = _requestLineParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { _requestStatus = HttpRequestState.RequestHeaders; subParseStatus = ParserState.NeedMoreData; goto case HttpRequestState.RequestHeaders; } else if (subParseStatus != ParserState.NeedMoreData) { // Report error - either Invalid or DataTooBig parseStatus = subParseStatus; break; } break; // read more data case HttpRequestState.RequestHeaders: if (bytesConsumed >= bytesReady) { // we already can tell we need more data break; } try { subParseStatus = _headerParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { parseStatus = subParseStatus; } else if (subParseStatus != ParserState.NeedMoreData) { parseStatus = subParseStatus; break; } break; // need more data } return(parseStatus); }
protected virtual void OnRequestStateChange(HttpRequestState from, HttpRequestState to) { Log(string.Concat("Request State Changed : ", from, " => ", to), LogSeverity.VERBOSE); }