コード例 #1
0
        public void Should_return_data_in_order()
        {
            string expected = "1234";
            string data = "";

            var bufferedConsumer = new BufferedConsumer(s => { data = s; }, exception => { });

            bufferedConsumer.OnData(new ArraySegment<byte>(Encoding.UTF8.GetBytes("1")), () => { });
            bufferedConsumer.OnData(new ArraySegment<byte>(Encoding.UTF8.GetBytes("2")), () => { });
            bufferedConsumer.OnData(new ArraySegment<byte>(Encoding.UTF8.GetBytes("3")), () => { });
            bufferedConsumer.OnData(new ArraySegment<byte>(Encoding.UTF8.GetBytes("4")), () => { });

            bufferedConsumer.OnEnd();

            Assert.That(data, Is.EqualTo(expected));
        }
コード例 #2
0
        public void Should_return_data_in_order()
        {
            string expected = "1234";
            string data     = "";

            var bufferedConsumer = new BufferedConsumer(s => { data = s; }, exception => { });

            bufferedConsumer.OnData(new ArraySegment <byte>(Encoding.UTF8.GetBytes("1")), () => { });
            bufferedConsumer.OnData(new ArraySegment <byte>(Encoding.UTF8.GetBytes("2")), () => { });
            bufferedConsumer.OnData(new ArraySegment <byte>(Encoding.UTF8.GetBytes("3")), () => { });
            bufferedConsumer.OnData(new ArraySegment <byte>(Encoding.UTF8.GetBytes("4")), () => { });


            bufferedConsumer.OnEnd();

            Assert.That(data, Is.EqualTo(expected));
        }
コード例 #3
0
        /// <summary>
        /// IHttpRequestHandler.OnRequest internal handler
        /// </summary>
        internal void onRequest(HttpRequestHead head, IDataProducer body, IHttpResponseDelegate response)
        {
            RESTMethod method;
            if (Enum.TryParse<RESTMethod>(head.Method, out method))
            {
                Pair<ResourceInstance, object[]> resourceParameterPair = retrieveResource(head.Path, method);
                ResourceInstance resource = resourceParameterPair.V1;
                object[] resourceParameters = resourceParameterPair.V2;
                if (resource != null)
                {
                    ResourceMethod resourceMethod = resource.GetResourceMethod(method);
                    if (resourceMethod != null)
                    {
                        if (resourceMethod.Parameters.Length == resourceParameters.Length + 1)
                        {
                            NameValueCollection getQuery = HttpUtility.ParseQueryString(head.QueryString ?? "");
                            // now, if it's a POST, read POST data then
                            if (method == RESTMethod.POST)
                            {
                                var consumer = new BufferedConsumer(bufferedBody =>
                                {
                                    HttpMultipartParser.MultipartFormDataParser parser = new HttpMultipartParser.MultipartFormDataParser(new MemoryStream(Encoding.Default.GetBytes(bufferedBody)));
                                    NameValueCollection postQuery = new NameValueCollection();
                                    foreach (var param in parser.Parameters)
                                        postQuery.Add(param.Key, param.Value.Data);
                                    Context invocationContext = new Context(new Request(head, postQuery, getQuery));
                                    giveResponse(resourceMethod, invocationContext, response, resourceParameters);
                                }, error =>
                                {
                                    _logger.Error("IDataProducer.Connect failed", error);
                                });

                                body.Connect(consumer);
                            }
                            else
                            {
                                Context invocationContext = new Context(new Request(head, getParameters: getQuery));
                                giveResponse(resourceMethod, invocationContext, response, resourceParameters);
                            }
                        }
                        else
                        {
                            Response notFoundResponse = Response.Error(HttpStatusCode.NotFound);
                            response.OnResponse(notFoundResponse.Head, notFoundResponse.Body);
                        }
                    }
                    else
                    {
                        Response notImplementedResponse = Response.Error(HttpStatusCode.NotImplemented);
                        response.OnResponse(notImplementedResponse.Head, notImplementedResponse.Body);
                    }
                }
                else
                {
                    Response notFoundResponse = Response.Error(HttpStatusCode.NotFound);
                    response.OnResponse(notFoundResponse.Head, notFoundResponse.Body);
                }
            }
            else
            {
                Response methodNotAllowedResponse = Response.Error(HttpStatusCode.MethodNotAllowed);
                response.OnResponse(methodNotAllowedResponse.Head, methodNotAllowedResponse.Body);
            }
        }
コード例 #4
0
        public void OnRequest(HttpRequestHead request, IDataProducer requestBody, IHttpResponseDelegate response)
        {
            var ea = new RequestReceivedEventArgs();
            ea.RequestHead = request;
            ea.ResponseHead = ResponseMessageHelper.GetHttpResponseHead();

            string contentType = string.Empty;
            if(ea.RequestHead.Headers.ContainsKey("Content-Type"))
                contentType=ea.RequestHead.Headers["Content-Type"];
            int contentSize = 0;
            if(ea.RequestHead.Headers.ContainsKey("Content-Length"))
            {
                int.TryParse(ea.RequestHead.Headers["Content-Length"],out contentSize);
            }
            BufferedConsumer bc=new BufferedConsumer(bodyContents =>
                {
                    try
                    {
                        ea.RequestBody = bodyContents;
                        //Called when request body is read to end
                        if (RequestReceived != null)
                        {
                            RequestReceived(this, ea);
                        }
                        var bp = ea.ResponseBodyProducer as BufferedProducer;
                        if (bp != null)
                        {
                            ea.ResponseHead.Headers["Content-Length"] = bp.GetContentLength().ToString();
                        }
                    }
                    finally
                    {
                        response.OnResponse(ea.ResponseHead, ea.ResponseBodyProducer);
                    }
                }, error =>
                {
                }, contentType,contentSize);
            //Gets complete HTTP Request and runs code defined over
            requestBody.Connect(bc);
        }