Example #1
0
        public void Should_read_byte_from_underlaying_stream_when_reading_byte()
        {
            // Given
            var stream  = CreateFakeStream();
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            request.ReadByte();

            // Then
            A.CallTo(() => stream.ReadByte()).MustHaveHappened();
        }
Example #2
0
        public void Should_throw_notsupportedexception_when_setting_length()
        {
            // Given
            var stream  = new ConfigurableMemoryStream();
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            var exception = Record.Exception(() => request.SetLength(10L));

            // Then
            exception.ShouldBeOfType <NotSupportedException>();
        }
Example #3
0
        public void Should_seek_in_the_underlaying_stream_when_seek_is_called()
        {
            // Given
            var stream  = new ConfigurableMemoryStream();
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            request.Seek(10L, SeekOrigin.Current);

            // Then
            stream.HasBeenSeeked.ShouldBeTrue();
        }
Example #4
0
        public void Should_throw_invalidoperationexception_when_position_is_set_to_greater_than_length_of_stream()
        {
            // Given
            var stream  = new ConfigurableMemoryStream(Length: 100L);
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            var exception = Record.Exception(() => request.Position = 1000);

            // Then
            exception.ShouldBeOfType <InvalidOperationException>();
        }
Example #5
0
        public void Should_flush_underlaying_stream()
        {
            // Given
            var stream  = new ConfigurableMemoryStream();
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            request.Flush();

            // Then
            stream.HasBeenFlushed.ShouldBeTrue();
        }
Example #6
0
        public void Should_set_position_of_underlaying_stream()
        {
            // Given
            var stream  = new ConfigurableMemoryStream(Length: 2000L);
            var request = RequestStream.FromStream(stream, 2000L, 2001L, false);

            // When
            request.Position = 1234L;

            // Then
            stream.Position.ShouldEqual(1234L);
        }
Example #7
0
        public void Should_throw_argumentoutofrangexception_when_setting_position_to_less_than_zero()
        {
            // Given
            var stream  = new ConfigurableMemoryStream();
            var request = RequestStream.FromStream(stream, 2000L, 2001L, false);

            // When
            var exception = Record.Exception(() => request.Position = -1);

            // Then
            exception.ShouldBeOfType <InvalidOperationException>();
        }
Example #8
0
        public void Should_return_length_of_underlaying_stream()
        {
            // Given
            var stream  = new ConfigurableMemoryStream(Length: 1234L);
            var request = RequestStream.FromStream(stream, 0, 1235, false);

            // When
            var result = request.Length;

            // Then
            result.ShouldEqual(1234L);
        }
Example #9
0
        public void Should_return_false_when_queried_about_supporting_timeout()
        {
            // Given
            var stream  = new ConfigurableMemoryStream();
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            var result = request.CanTimeout;

            // Then
            result.ShouldBeFalse();
        }
Example #10
0
        public void Should_return_true_when_queried_about_supporting_seeking()
        {
            // Given
            var stream  = new ConfigurableMemoryStream();
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            var result = request.CanSeek;

            // Then
            result.ShouldBeTrue();
        }
Example #11
0
        public void Should_throw_argumentoutofrangeexception_when_thresholdLength_is_less_than_zero()
        {
            // Given
            var       stream         = new ConfigurableMemoryStream();
            const int tresholdLength = -1;

            // When
            var exception = Record.Exception(() => RequestStream.FromStream(stream, 0, tresholdLength));

            // Then
            exception.ShouldBeOfType <ArgumentOutOfRangeException>();
        }
Example #12
0
        public void Should_return_length_of_underlaying_stream()
        {
            // Given
            A.CallTo(() => this.stream.Length).Returns(1234L);
            var request = RequestStream.FromStream(this.stream, 0, 1235, false);

            // When
            var result = request.Length;

            // Then
            result.ShouldEqual(1234L);
        }
Example #13
0
        public void Should_work_even_with_a_non_seekable_stream()
        {
            // Given
            var stream  = new ConfigurableMemoryStream(Seekable: false);
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            var result = request.CanRead;

            // Then
            result.ShouldBeTrue();
        }
Example #14
0
        public void ValidateSignatureFromHeaderWithContent(string secretKey, string headerName)
        {
            var signature = this.Request.Headers[headerName].FirstOrDefault() ?? string.Empty;
            var content   = RequestStream.FromStream(this.Request.Body).AsString() ?? string.Empty;

            var result = SignatureUtility.ValidateSignature(signature, secretKey, content);

            if (result == false)
            {
                throw new UnauthorizedException();
            }
        }
Example #15
0
        public void Should_write_to_underlaying_stream_when_write_is_called()
        {
            // Given
            var buffer  = new byte[1];
            var request = RequestStream.FromStream(this.stream, 0, 1, false);

            // When
            request.Write(buffer, 0, buffer.Length);

            // Then
            A.CallTo(() => this.stream.Write(buffer, 0, buffer.Length)).MustHaveHappened();
        }
Example #16
0
        public void Should_return_state_of_underlaying_stream_when_queried_about_supporting_writing()
        {
            // Given
            A.CallTo(() => this.stream.CanWrite).Returns(true);
            var request = RequestStream.FromStream(this.stream, 0, 1, false);

            // When
            var result = request.CanWrite;

            // Then
            result.ShouldBeTrue();
        }
Example #17
0
        public void Should_return_the_new_position_of_the_underlaying_stream_when_seek_is_called()
        {
            // Given
            A.CallTo(() => this.stream.Seek(A <long> .Ignored, A <SeekOrigin> .Ignored)).Returns(100L);
            var request = RequestStream.FromStream(this.stream, 0, 1, false);

            // When
            var result = request.Seek(10L, SeekOrigin.Current);

            // Then
            result.ShouldEqual(100L);
        }
Example #18
0
        public void Should_return_read_byte_from_underlaying_stream_when_readbyte_is_called()
        {
            // Given
            A.CallTo(() => this.stream.ReadByte()).Returns(5);
            var request = RequestStream.FromStream(this.stream, 0, 1, false);

            // When
            var result = request.ReadByte();

            // Then
            result.ShouldEqual(5);
        }
Example #19
0
        public void Should_throw_invalidoperationexception_when_position_is_set_to_greater_than_length_of_stream()
        {
            // Given
            A.CallTo(() => this.stream.Length).Returns(100L);
            var request = RequestStream.FromStream(this.stream, 0, 1, false);

            // When
            var exception = Record.Exception(() => request.Position = 1000);

            // Then
            exception.ShouldBeOfType <InvalidOperationException>();
        }
Example #20
0
        public void Should_set_position_of_underlaying_stream()
        {
            // Given
            A.CallTo(() => this.stream.Length).Returns(2000L);
            var request = RequestStream.FromStream(this.stream, 0, 2001, false);

            // When
            request.Position = 1234L;

            // Then
            this.stream.Position.ShouldEqual(1234L);
        }
Example #21
0
        public void Should_not_dispose_wrapped_stream_when_not_switched()
        {
            // Given
            var stream   = new ConfigurableMemoryStream();
            var instance = RequestStream.FromStream(stream, 0, 1, true);

            // When
            instance.Dispose();

            // Then
            stream.HasBeenDisposed.ShouldBeFalse();
        }
Example #22
0
        public void Should_call_endwrite_on_underlaying_stream_when_endwrite_is_called()
        {
            // Given
            var asyncResult = A.Fake <IAsyncResult>();
            var request     = RequestStream.FromStream(this.stream, 0, 10, true);

            // When
            request.EndWrite(asyncResult);

            // Then
            A.CallTo(() => this.stream.EndWrite(asyncResult)).MustHaveHappened();
        }
Example #23
0
        public void Should_call_endread_on_underlaying_stream_when_endread_is_called()
        {
            // Given
            var stream      = CreateFakeStream();
            var asyncResult = A.Fake <IAsyncResult>();
            var request     = RequestStream.FromStream(stream, 0, 10, true);

            // When
            request.EndRead(asyncResult);

            // Then
            A.CallTo(() => stream.EndRead(asyncResult)).MustHaveHappened();
        }
Example #24
0
        public void Should_read_from_underlaying_stream_when_read_is_called()
        {
            // Given
            var stream  = CreateFakeStream();
            var buffer  = new byte[1];
            var request = RequestStream.FromStream(stream, 0, 1, false);

            // When
            request.Read(buffer, 0, buffer.Length);

            // Then
            A.CallTo(() => stream.Read(buffer, 0, buffer.Length)).MustHaveHappened();
        }
Example #25
0
        private Request ConvertRequestToNancyRequest(IRequest request)
        {
            var expectedRequestLength =
                GetExpectedRequestLength(request.Headers);

            return(new Request(
                       request.Method,
                       request.Uri.LocalPath,
                       ConvertToNancyHeaders(request.Headers),
                       RequestStream.FromStream(request.Body, expectedRequestLength, true),
                       request.Uri.Scheme,
                       request.Uri.Query));
        }
Example #26
0
        public void Should_return_position_of_underlaying_stream()
        {
            // Given
            var request = RequestStream.FromStream(this.stream, 0, 1, false);

            A.CallTo(() => this.stream.Position).Returns(1234L);

            // When
            var result = request.Position;

            // Then
            result.ShouldEqual(1234L);
        }
Example #27
0
        private static Request CreateNancyRequest(HttpContextBase context)
        {
            var expectedRequestLength =
                GetExpectedRequestLength(context.Request.Headers.ToDictionary());

            return(new Request(
                       (context.Request.Form["_method"] ?? context.Request.HttpMethod).ToUpperInvariant(),
                       context.Request.AppRelativeCurrentExecutionFilePath.Replace("~", string.Empty),
                       context.Request.Headers.ToDictionary(),
                       RequestStream.FromStream(context.Request.InputStream, expectedRequestLength, true),
                       context.Request.Url.Scheme,
                       context.Request.Url.Query));
        }
Example #28
0
        private Request ConvertRequestToNancyRequest(HttpListenerRequest request)
        {
            var baseUri = this.GetBaseUri(request);

            if (baseUri == null)
            {
                throw new InvalidOperationException(string.Format("Unable to locate base URI for request: {0}", request.Url));
            }

            var expectedRequestLength =
                GetExpectedRequestLength(request.Headers.ToDictionary());

            var relativeUrl = baseUri.MakeAppLocalPath(request.Url);

            var nancyUrl = new Url
            {
                Scheme   = request.Url.Scheme,
                HostName = request.Url.Host,
                Port     = request.Url.IsDefaultPort ? null : (int?)request.Url.Port,
                BasePath = baseUri.AbsolutePath.TrimEnd('/'),
                Path     = HttpUtility.UrlDecode(relativeUrl),
                Query    = request.Url.Query,
            };

            byte[] certificate = null;

            if (this.configuration.EnableClientCertificates)
            {
                var x509Certificate = request.GetClientCertificate();

                if (x509Certificate != null)
                {
                    certificate = x509Certificate.RawData;
                }
            }

            // NOTE: For HTTP/2 we want fieldCount = 1,
            // otherwise (HTTP/1.0 and HTTP/1.1) we want fieldCount = 2
            var fieldCount = request.ProtocolVersion.Major == 2 ? 1 : 2;

            var protocolVersion = string.Format("HTTP/{0}", request.ProtocolVersion.ToString(fieldCount));

            return(new Request(
                       request.HttpMethod,
                       nancyUrl,
                       RequestStream.FromStream(request.InputStream, expectedRequestLength, StaticConfiguration.DisableRequestStreamSwitching ?? false),
                       request.Headers.ToDictionary(),
                       (request.RemoteEndPoint != null) ? request.RemoteEndPoint.Address.ToString() : null,
                       certificate,
                       protocolVersion));
        }
Example #29
0
        private static async Task <Nancy.Response> ProcessWriteMethod(NancyModule module, HttpMethod method, string inUri, IRequestProvider requestProvider)
        {
            var result = new Nancy.Response();
            HttpResponseMessage response = null;
            var responseContent          = string.Empty;

            try
            {
                var hc = new HttpClient()
                {
                    BaseAddress = new Uri(inUri)
                };

                string  jsonString = RequestStream.FromStream(module.Request.Body).AsString();
                dynamic jsonObj    = string.IsNullOrEmpty(jsonString) ?
                                     new ExpandoObject() :
                                     JsonConvert.DeserializeObject <ExpandoObject>(jsonString);

                jsonObj.UserId = await InputModule.GetUserId(module, requestProvider);

                var content = new StringContent(JsonConvert.SerializeObject(jsonObj));
                content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");

                var message = new HttpRequestMessage(
                    method,
                    InputModule.GetPath(module.Context.Request)
                    )
                {
                    Content = content
                };
                foreach (var kvp in module.Context.Request.Headers.ToList())
                {
                    if (Array.IndexOf(new string[] { "Content-Length", "Content-Type" }, kvp.Key) < 0)
                    {
                        message.Headers.Add(kvp.Key, string.Join(',', kvp.Value));
                    }
                }
                response = await hc.SendAsync(message);

                responseContent = await response.Content.ReadAsStringAsync();

                response.EnsureSuccessStatusCode();

                result = new TextResponse(HttpStatusCode.OK, responseContent);
            }
            catch (Exception ex)
            {
                result = new TextResponse(HttpStatusCode.BadRequest, (response != null) ? responseContent : ex.ToString());
            }
            return(result);
        }
Example #30
0
        private static Request CreateNancyRequestFromIncomingWebRequest(IncomingWebRequestContext webRequest, Stream requestBody, OperationContext context)
        {
            var address =
                ((RemoteEndpointMessageProperty)
                 OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name]);

            var baseUri =
                GetUrlAndPathComponents(webRequest.UriTemplateMatch.BaseUri);

            if (!baseUri.OriginalString.EndsWith("/"))
            {
                baseUri = new Uri(string.Concat(baseUri.OriginalString, "/"));
            }

            var relativeUri =
                baseUri.MakeRelativeUri(GetUrlAndPathComponents(webRequest.UriTemplateMatch.RequestUri));

            var expectedRequestLength =
                GetExpectedRequestLength(webRequest.Headers.ToDictionary());

            var nancyUrl = new Url {
                BasePath = webRequest.UriTemplateMatch.BaseUri.AbsolutePath,
                Scheme   = webRequest.UriTemplateMatch.RequestUri.Scheme,
                HostName = webRequest.UriTemplateMatch.BaseUri.Host,
                Port     = webRequest.UriTemplateMatch.RequestUri.IsDefaultPort ? null : (int?)webRequest.UriTemplateMatch.RequestUri.Port,
                Path     = string.Concat("/", relativeUri),
                Query    = webRequest.UriTemplateMatch.RequestUri.Query
            };

            byte[] certificate = null;

            if (context.ServiceSecurityContext != null && context.ServiceSecurityContext.AuthorizationContext.ClaimSets.Count > 0)
            {
                var claimset =
                    context.ServiceSecurityContext.AuthorizationContext.ClaimSets.FirstOrDefault(
                        c => c is X509CertificateClaimSet) as X509CertificateClaimSet;

                if (claimset != null)
                {
                    certificate = claimset.X509Certificate.RawData;
                }
            }

            return(new Request(
                       webRequest.Method,
                       nancyUrl,
                       RequestStream.FromStream(requestBody, expectedRequestLength, false),
                       webRequest.Headers.ToDictionary(),
                       address.Address,
                       certificate));
        }