예제 #1
0
        private void SendMsg()
        {
            IHttpMessage msg = _messageList[0];

            _messageList.Remove(msg);
            msg.RequestHandler();
        }
예제 #2
0
        static int GetWebSocketContentLength(IHttpMessage message)
        {
            // WebSocket messages have constant content-lengths.
            HttpHeaders h = message.Headers;

            if (message is IHttpRequest req)
            {
                if (HttpMethod.Get.Equals(req.Method) &&
                    h.Contains(HttpHeaderNames.SecWebsocketKey1) &&
                    h.Contains(HttpHeaderNames.SecWebsocketKey2))
                {
                    return(8);
                }
            }
            else if (message is IHttpResponse res)
            {
                if (res.Status.Code == 101 &&
                    h.Contains(HttpHeaderNames.SecWebsocketOrigin) &&
                    h.Contains(HttpHeaderNames.SecWebsocketLocation))
                {
                    return(16);
                }
            }

            // Not a web socket message
            return(-1);
        }
예제 #3
0
        static int GetWebSocketContentLength(IHttpMessage message)
        {
            // WebSocket messages have constant content-lengths.
            HttpHeaders h = message.Headers;

            switch (message)
            {
            case IHttpRequest req:
                if (HttpMethod.Get.Equals(req.Method) &&
                    h.Contains(HttpHeaderNames.SecWebsocketKey1) &&
                    h.Contains(HttpHeaderNames.SecWebsocketKey2))
                {
                    return(8);
                }
                break;

            case IHttpResponse res:
                if (res.Status.Code == StatusCodes.Status101SwitchingProtocols &&
                    h.Contains(HttpHeaderNames.SecWebsocketOrigin) &&
                    h.Contains(HttpHeaderNames.SecWebsocketLocation))
                {
                    return(16);
                }
                break;
            }

            // Not a web socket message
            return(-1);
        }
예제 #4
0
        protected virtual bool IsContentAlwaysEmpty(IHttpMessage msg)
        {
            if (msg is IHttpResponse res)
            {
                int code = res.Status.Code;

                // Correctly handle return codes of 1xx.
                //
                // See:
                //     - http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html Section 4.4
                //     - https://github.com/netty/netty/issues/222
                if (code >= 100 && code < 200)
                {
                    // One exception: Hixie 76 websocket handshake response
                    return(!(code == 101 && !res.Headers.Contains(HttpHeaderNames.SecWebsocketAccept) &&
                             res.Headers.Contains(HttpHeaderNames.Upgrade, HttpHeaderValues.Websocket, true)));
                }
                switch (code)
                {
                case 204:
                case 304:
                    return(true);
                }
            }
            return(false);
        }
        /// <summary>
        ///     Are about to send a new message
        /// </summary>
        /// <param name="message">Message to send</param>
        /// <remarks>
        ///     Can be used to prepare the next message. for instance serialize it etc.
        /// </remarks>
        /// <exception cref="NotSupportedException">Message is of a type that the encoder cannot handle.</exception>
        public void Prepare(object message)
        {
            if (message is IWebSocketMessage)
            {
                _message = (IWebSocketMessage)message;
                _message.Payload.Position = 0;
                _totalAmountToSend        = (int)_message.Payload.Length;
            }
            else
            {
                try
                {
                    _httpMessageEncoder.Prepare(message);

                    var httpMessage = message as IHttpMessage;
                    if (WebSocketUtils.IsWebSocketUpgrade(httpMessage))
                    {
                        _handshake = httpMessage;
                    }
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException("This encoder only supports messages deriving from 'HttpMessage' or 'WebSocketMessage'", e);
                }
            }
        }
예제 #6
0
 internal HttpResponse(string line, IHttpMessage message)
 {
     validation_code = Validate(line, out var version, out var status);
     Version         = version;
     StatusCode      = status;
     Message         = message;
 }
예제 #7
0
 public static void SetTransferEncodingChunked(IHttpMessage m, bool chunked)
 {
     if (chunked)
     {
         _ = m.Headers.Set(HttpHeaderNames.TransferEncoding, HttpHeaderValues.Chunked);
         _ = m.Headers.Remove(HttpHeaderNames.ContentLength);
     }
     else
     {
         IList <ICharSequence> encodings = m.Headers.GetAll(HttpHeaderNames.TransferEncoding);
         if (0u >= (uint)encodings.Count)
         {
             return;
         }
         var values = new List <ICharSequence>(encodings);
         foreach (ICharSequence value in encodings)
         {
             if (HttpHeaderValues.Chunked.ContentEqualsIgnoreCase(value))
             {
                 _ = values.Remove(value);
             }
         }
         if (0u >= (uint)values.Count)
         {
             _ = m.Headers.Remove(HttpHeaderNames.TransferEncoding);
         }
         else
         {
             _ = m.Headers.Set(HttpHeaderNames.TransferEncoding, values);
         }
     }
 }
예제 #8
0
 /// <summary>
 /// Throws a <see cref="ProtocolException"/> if some <paramref name="condition"/> evaluates to false.
 /// </summary>
 /// <param name="condition">True to do nothing; false to throw the exception.</param>
 /// <param name="faultedMessage">The message being processed that would be responsible for the exception if thrown.</param>
 /// <param name="errorMessage">The error message for the exception.</param>
 /// <param name="args">The string formatting arguments, if any.</param>
 /// <exception cref="ProtocolException">Thrown if <paramref name="condition"/> evaluates to <c>false</c>.</exception>
 internal static void VerifyProtocol(bool condition, IHttpMessage faultedMessage, string errorMessage, params object[] args)
 {
     if (!condition)
     {
         throw new ProtocolException(string.Format(CultureInfo.CurrentCulture, errorMessage, args), faultedMessage);
     }
 }
 public static void Header(this IHttpMessage message, string header, Action <string> onPresent)
 {
     if (message.Headers.TryGetValue(header, out var headerValue))
     {
         onPresent(headerValue);
     }
 }
예제 #10
0
 private void OnReceiveOver(IHttpMessage msg)
 {
     lock (m_receiveList)
     {
         m_receiveList.Add(msg);
     }
 }
예제 #11
0
 public HttpResponse(HttpVersion version, HttpStatusCode code, IHttpMessage message)
 {
     Version         = version;
     StatusCode      = code;
     Message         = message;
     validation_code = HttpResponseValidationCode.Valid;
 }
        /// <summary>
        ///     Are about to send a new message
        /// </summary>
        /// <param name="message">Message to send</param>
        /// <remarks>
        ///     Can be used to prepare the next message. for instance serialize it etc.
        /// </remarks>
        /// <exception cref="NotSupportedException">Message is of a type that the encoder cannot handle.</exception>
        public void Prepare(object message)
        {
            if (message is IWebSocketMessage)
            {
                _message = (IWebSocketMessage)message;
                _message.Payload.Position = 0;
                _totalAmountToSend = (int)_message.Payload.Length;
            }
            else
            {
                try
                {
                    _httpMessageEncoder.Prepare(message);

                    var httpMessage = message as IHttpMessage;
                    if (WebSocketUtils.IsWebSocketUpgrade(httpMessage))
                    {
                        _handshake = httpMessage;
                    }
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException("This encoder only supports messages deriving from 'HttpMessage' or 'WebSocketMessage'", e);
                }
            }
        }
예제 #13
0
 public HttpRequest(HttpRequestKind kind, string resource, HttpVersion version, IHttpMessage message)
 {
     Kind            = kind;
     Resource        = new Resource(resource);
     Version         = version;
     Message         = message;
     validation_code = HttpRequestValidationCode.Valid;
 }
예제 #14
0
        private void AddHeaderToRequest(IHttpMessage request, string headerLine)
        {
            var headerParts = headerLine.Split(new[] { ':' }, 2);
            var headerName  = headerParts[0].Trim();
            var headerValue = headerParts.Length == 2 ? headerParts[1].Trim() : string.Empty;

            request.AddHeader(headerName, headerValue);
        }
예제 #15
0
        internal HttpBody(IHttpMessage message)
        {
            this.message = message;

            ContentType  = message.ContentType;
            EncodingText = message.ContentTransferEncoding;
            CharSet      = EncodingText.WebName;
        }
예제 #16
0
 private HttpRequest(string line, IHttpMessage message)
 {
     validation_code = Validate(line, out var kind, out var resource, out var version);
     Kind            = kind;
     Resource        = resource;
     Version         = version;
     Message         = message;
 }
예제 #17
0
 static void AppendCommon(StringBuilder buf, IHttpMessage msg)
 {
     _ = buf.Append($"{StringUtil.SimpleClassName(msg)}");
     _ = buf.Append("(decodeResult: ");
     _ = buf.Append(msg.Result);
     _ = buf.Append(", version: ");
     _ = buf.Append(msg.ProtocolVersion);
     _ = buf.Append($"){StringUtil.Newline}");
 }
 /// <summary>
 /// Reset decoder state so that we can decode a new message
 /// </summary>
 public void Clear()
 {
     _httpMessageDecoder.Clear();
     _handshake             = null;
     _frame                 = null;
     _frames                = new List <WebSocketFrame>();
     _frameContentBytesLeft = 0;
     _isWebSocket           = false;
 }
예제 #19
0
 private void LoadNext()
 {
     if (_messageList.Count > 0)
     {
         IHttpMessage msg = _messageList[0];
         _messageList.RemoveAt(0);
         NetWorkManager.Instance.Send(msg);
     }
 }
            protected override void ChannelRead0(IChannelHandlerContext ctx, IHttpMessage msg)
            {
                // If this handler is hit then no upgrade has been attempted and the client is just talking HTTP.
                s_logger.LogInformation("Directly talking: " + msg.ProtocolVersion + " (no upgrade was attempted)");
                IChannelPipeline pipeline = ctx.Pipeline;

                pipeline.AddAfter(ctx.Name, null, new Http2Helloworld.Server.HelloWorldHttp1Handler("Direct. No Upgrade Attempted."));
                pipeline.Replace(this, null, new HttpObjectAggregator(this.maxHttpContentLength));
                ctx.FireChannelRead(ReferenceCountUtil.Retain(msg));
            }
예제 #21
0
        internal static bool IsUnsupportedExpectation(IHttpMessage message)
        {
            if (!IsExpectHeaderValid(message))
            {
                return(false);
            }

            return(message.Headers.TryGet(HttpHeaderNames.Expect, out ICharSequence expectValue) &&
                   !HttpHeaderValues.Continue.ContentEqualsIgnoreCase(expectValue));
        }
 public static void AppendList(this IHttpMessage message, string header, string value)
 {
     if (message.Headers.ContainsKey(header) && message.Headers[header].Trim().Length > 0)
     {
         message.Headers[header] += ", " + value;
     }
     else
     {
         message.Headers[header] = value;
     }
 }
예제 #23
0
 public static void Set100ContinueExpected(IHttpMessage message, bool expected)
 {
     if (expected)
     {
         _ = message.Headers.Set(HttpHeaderNames.Expect, HttpHeaderValues.Continue);
     }
     else
     {
         _ = message.Headers.Remove(HttpHeaderNames.Expect);
     }
 }
예제 #24
0
        public static bool Is100ContinueExpected(IHttpMessage message)
        {
            if (!IsExpectHeaderValid(message))
            {
                return(false);
            }

            ICharSequence expectValue = message.Headers.Get(HttpHeaderNames.Expect, null);

            // unquoted tokens in the expect header are case-insensitive, thus 100-continue is case insensitive
            return(HttpHeaderValues.Continue.ContentEqualsIgnoreCase(expectValue));
        }
예제 #25
0
 public void Send(IHttpMessage msg)
 {
     if (Serverurl != null)
     {
         _messageList.Add(msg);
         SendMsg();
     }
     else
     {
         Debug.LogError("NetWorkManager.SERVER 为空!");
     }
 }
예제 #26
0
        public void upgrade()
        {
            IHttpMessage actual = null;

            var decoder = new WebSocketDecoder();

            decoder.MessageReceived = o => actual = (IHttpMessage)o;
            sendWebSocketUpgradeRequest(decoder);

            actual.Headers["host"].Should().Be("localhost");
            actual.Headers["connection"].Should().Be("upgrade");
            actual.Headers["upgrade"].Should().Be("websocket");
        }
        /// <summary>
        /// Intercept http messages and look for websocket upgrade requests
        /// </summary>
        /// <param name="message">message from http decoder</param>
        private void OnHttpMessage(object message)
        {
            var httpMessage = message as IHttpMessage;

            // TODO: is there a better way to detect WebSocket upgrade?
            if (WebSocketUtils.IsWebSocketUpgrade(httpMessage))
            {
                _handshake   = httpMessage;
                _isWebSocket = true;
            }

            _messageReceived(message);
        }
예제 #28
0
        public override void Deserialization(Node localNode, Route route, IHttpMessage httpMessage)
        {
            Source  = httpMessage.Head.GetField(HttpConst.MessageSource).Value;
            Destiny = httpMessage.Head.GetField(HttpConst.MessageDestiny).Value;
            Path    = httpMessage.Head.GetField(HttpConst.MessagePath).Value;

            Hops = int.Parse(httpMessage.Head.GetField(HttpConst.MessageHops).Value);

            var formatter = new BinaryFormatter();

            httpMessage.Body.ContentStream.Position = 0;
            Payload = formatter.Deserialize(httpMessage.Body.ContentStream) as OverlayMessage;
        }
예제 #29
0
        IHttpContent InvalidChunk(IByteBuffer buf, Exception cause)
        {
            this.currentState = State.BadMessage;

            // Advance the readerIndex so that ByteToMessageDecoder does not complain
            // when we produced an invalid message without consuming anything.
            buf.SkipBytes(buf.ReadableBytes);

            IHttpContent chunk = new DefaultLastHttpContent(Unpooled.Empty);

            chunk.Result = DecoderResult.Failure(cause);
            this.message = null;
            this.trailer = null;
            return(chunk);
        }
예제 #30
0
        public static bool IsKeepAlive(IHttpMessage message)
        {
            if (message.Headers.TryGet(HttpHeaderNames.Connection, out ICharSequence connection) &&
                HttpHeaderValues.Close.ContentEqualsIgnoreCase(connection))
            {
                return(false);
            }

            if (message.ProtocolVersion.IsKeepAliveDefault)
            {
                return(!HttpHeaderValues.Close.ContentEqualsIgnoreCase(connection));
            }
            else
            {
                return(HttpHeaderValues.KeepAlive.ContentEqualsIgnoreCase(connection));
            }
        }
예제 #31
0
        private bool IsContentTypeSpecifiedForBody(IHttpMessage message)
        {
            //No content-type required if there is no body
            if (message.Body == null)
            {
                return(true);
            }

            IDictionary <string, object> headers = null;

            if (message.Headers != null)
            {
                headers = new Dictionary <string, object>(message.Headers, StringComparer.OrdinalIgnoreCase);
            }

            return(headers != null && headers.ContainsKey("Content-Type"));
        }
예제 #32
0
        static void AssertRequest(TestRequest[] expected, IHttpMessage[] actual)
        {
            for (int i = 0; i < expected.Length; i++)
            {

                Assert.IsTrue(i <= actual.Length - 1, "Expected more requests than received");

                var expectedRequest = expected[i];
                var actualRequest = actual[i];
                //Console.WriteLine("Asserting request " + expectedRequest.Name);
                Assert.AreEqual(expectedRequest.Method, actualRequest.Method, "Unexpected method.");
                Assert.AreEqual(expectedRequest.RequestUri, actualRequest.RequestUri, "Unexpected request URI.");
                Assert.AreEqual(expectedRequest.VersionMajor, actualRequest.HttpVersion.Major, "Unexpected major version.");
                Assert.AreEqual(expectedRequest.VersionMinor, actualRequest.HttpVersion.Minor, "Unexpected minor version.");
                Assert.AreEqual(expectedRequest.RequestPath, actualRequest.RequestPath, "Unexpected request path.");
                Assert.AreEqual(expectedRequest.QueryString, actualRequest.QueryString, "Unexpected query string.");
                Assert.AreEqual(expectedRequest.Fragment, actualRequest.Fragment, "Unexpected fragment.");
                //Assert.AreEqual(expected.RequestPath, test.RequestPath, "Unexpected path.");

                Assert.AreEqual(expectedRequest.ShouldKeepAlive, actualRequest.ShouldKeepAlive, "Wrong value for ShouldKeepAlive");

                foreach (var pair in expectedRequest.Headers)
                {
                    Assert.IsTrue(actualRequest.Headers.Any(h => string.Equals(h.Key, pair.Key, StringComparison.OrdinalIgnoreCase)), "Actual headers did not contain key '" + pair.Key + "'");
                    Assert.AreEqual(pair.Value, actualRequest.Headers.Where(h => string.Equals(h.Key, pair.Key, StringComparison.OrdinalIgnoreCase)).Select(h => h.Value).First(), "Actual headers had wrong value for key '" + pair.Key + "'");
                }

                foreach (var pair in actualRequest.Headers)
                {
                    Assert.IsTrue(expectedRequest.Headers.ContainsKey(pair.Key), "Unexpected header named '" + pair.Key + "'");
                }

                if (expectedRequest.Body != null)
                {
                    var expectedBody = Encoding.UTF8.GetString(expectedRequest.Body);
                    Assert.IsNotNull(actualRequest.Body, "Expected non-null request body");
                    StreamReader sr = new StreamReader(actualRequest.Body, Encoding.UTF8);
                    var actualBody = sr.ReadToEnd();
                    Assert.AreEqual(expectedBody, actualBody, "Body differs");
                }
                else
                    Assert.AreEqual(0, actualRequest.Body.Length);
            }
        }
예제 #33
0
 /// <summary>
 /// Check if http message is a valid WebSocket upgrade request
 /// </summary>
 /// <param name="httpMessage">message to check</param>
 /// <returns>true if message is a valid WebSocket upgrade request</returns>
 public static bool IsWebSocketUpgrade(IHttpMessage httpMessage)
 {
     return httpMessage != null &&
         (httpMessage.Headers["Connection"] ?? string.Empty).IndexOf("upgrade", StringComparison.OrdinalIgnoreCase) != -1 &&
         (httpMessage.Headers["Upgrade"] ?? string.Empty).IndexOf("websocket", StringComparison.OrdinalIgnoreCase) != -1;
 }
 /// <summary>
 /// Reset decoder state so that we can decode a new message
 /// </summary>
 public void Clear()
 {
     _httpMessageDecoder.Clear();
     _handshake = null;
     _frame = null;
     _frames = new List<WebSocketFrame>();
     _frameContentBytesLeft = 0;
     _isWebSocket = false;
 }
        /// <summary>
        /// Intercept http messages and look for websocket upgrade requests
        /// </summary>
        /// <param name="message">message from http decoder</param>
        private void OnHttpMessage(object message)
        {
            var httpMessage = message as IHttpMessage;
            // TODO: is there a better way to detect WebSocket upgrade?
            if (WebSocketUtils.IsWebSocketUpgrade(httpMessage))
            {
                _handshake = httpMessage;
                _isWebSocket = true;
            }

            _messageReceived(message);
        }
 private void ReadResponse(IHttpMessage response)
 {
     response.Entity.Stream.Position = 0;
     ResponseText = new StreamReader(response.Entity.Stream).ReadToEnd();
 }
            /// <summary>
            /// Creates a test configuration for an operation in the batch.
            /// </summary>
            /// <param name="operation">The operation to get the configuration for.</param>
            /// <returns>Test configuration based on the batch test configuration with the format modified to apply to the operation in question.</returns>
            private ReaderTestConfiguration GetOperationTestConfiguration(IHttpMessage operation)
            {
                string contentType = operation.GetHeaderValueIfExists(Microsoft.OData.Core.ODataConstants.ContentTypeHeader);

                ODataFormat format = this.batchTestConfiguration.Format;
                if (IsAtomMimeType(contentType))
                {
                    format = ODataFormat.Atom;
                }
                else if (IsJsonMimeType(contentType))
                {
                    format = ODataFormat.Json;
                }

                return new ReaderTestConfiguration(
                    format,
                    this.batchTestConfiguration.MessageReaderSettings,
                    this.batchTestConfiguration.IsRequest,
                    this.batchTestConfiguration.Synchronous,
                    this.batchTestConfiguration.Version);
            }
예제 #38
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RequestValueProvider" /> class.
 /// </summary>
 /// <param name="request">The request.</param>
 public RequestValueProvider(IHttpMessage request)
 {
     _request = request;
 }