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); }
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)); }