示例#1
0
 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;
 }
示例#3
0
        public static void CloseSession()
        {
            ISession session = HttpRequestState.Get(currentSessionKey) as ISession;

            if (session == null)
            {
                return;
            }

            session.Close();
            HttpRequestState.Remove(currentSessionKey);
        }
示例#4
0
        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);
        }
示例#5
0
        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;
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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);
        }
示例#10
0
 protected virtual void OnRequestStateChange(HttpRequestState from, HttpRequestState to)
 {
     Log(string.Concat("Request State Changed : ", from, " => ", to), LogSeverity.VERBOSE);
 }