예제 #1
0
        protected override Request CreateRequest(TestContext ctx, Uri uri)
        {
            var request = new ChunkedRequest(this, uri);

            // May need to adjust these values a bit.
            if (Type == ChunkContentType.SyncReadTimeout)
            {
                request.RequestExt.ReadWriteTimeout = 500;
            }
            else
            {
                request.RequestExt.ReadWriteTimeout = 1500;
            }
            return(request);
        }
예제 #2
0
        async Task <Response> GetResponseFromHttp(TestContext ctx, ChunkedRequest request, HttpWebResponse response, WebException error, CancellationToken cancellationToken)
        {
            var content = string.Empty;
            var status  = response.StatusCode;

            ctx.Assert(status, Is.EqualTo(HttpStatusCode.OK), "success");
            ctx.Assert(error, Is.Null, "null error");

            var stream = response.GetResponseStream();

            try {
                if (Type == ChunkContentType.BeginEndAsyncRead || Type == ChunkContentType.BeginEndAsyncReadNoWait)
                {
                    var provider = DependencyInjector.Get <IStreamProvider> ();

                    var buffer = new byte [1024];
                    var result = provider.BeginRead(stream, buffer, 0, buffer.Length, null, null);

                    if (Type != ChunkContentType.BeginEndAsyncReadNoWait)
                    {
                        await Task.Run(() => {
                            var timeout    = ctx.Settings.DisableTimeouts ? -1 : 500;
                            var waitResult = result.AsyncWaitHandle.WaitOne(timeout);
                            ctx.Assert(waitResult, "WaitOne");
                        });
                    }

                    var ret = provider.EndRead(stream, result);
                    ctx.Assert(ret, Is.GreaterThan(0), "non-zero read");
                    content = Encoding.UTF8.GetString(buffer, 0, ret);
                }

                var reader = new StreamReader(stream);
                if (Type == ChunkContentType.SyncRead || Type == ChunkContentType.SyncReadTimeout)
                {
                    content += reader.ReadToEnd();
                }
                else
                {
                    content += await reader.ReadToEndAsync();
                }

                if (Type == ChunkContentType.ServerAbort)
                {
                    ctx.Assert(content.Length, Is.EqualTo(1), "read one byte");
                }

                if (ExpectException)
                {
                    ctx.AssertFail("expected exception");
                }
            } catch (IOException ex) {
                error   = new WebException("failed to read response", ex, (XWebExceptionStatus)WebExceptionStatus.ResponseContentException, response);
                content = null;
            } catch (WebException ex) {
                if (Type == ChunkContentType.SyncReadTimeout)
                {
                    ctx.Assert((WebExceptionStatus)ex.Status, Is.EqualTo(WebExceptionStatus.Timeout), "expected Timeout");
                    error = new WebException(ex.Message, ex, (XWebExceptionStatus)WebExceptionStatus.Timeout, response);
                }
                else if (Type == ChunkContentType.TruncatedChunk)
                {
                    ctx.Assert((WebExceptionStatus)ex.Status, Is.EqualTo(WebExceptionStatus.ConnectionClosed), "expected ConnectionClosed");
                    error = new WebException(ex.Message, ex, (XWebExceptionStatus)WebExceptionStatus.ResponseContentTruncated, response);
                }
                else
                {
                    throw;
                }
                content = null;
            } finally {
                stream.Dispose();
                response.Dispose();
            }

            return(new SimpleResponse(request, status, StringContent.CreateMaybeNull(content), error));
        }