private void EndGetResponse(IAsyncResult ar) { var httpRequestState = ar.AsyncState as HttpRequestState; var webRequest = httpRequestState.WebRequest; try { var webResponse = webRequest.EndGetResponse(ar); var responseStream = webResponse.GetResponseStream(); var outStream = new MemoryStream(); var buffer = new byte[Constants.BufferSize]; var state = new HttpResponseState(webResponse, buffer, outStream); responseStream.BeginRead(buffer, 0, Constants.BufferSize, EndRead, state); } catch (WebException e) { if (e.Response is HttpWebResponse response) { DownloadedPage = new Page(Uri, string.Empty) { StatusCode = response.StatusCode, ContentType = response.ContentType }; } Completed = true; } }
private void HandleRequest(IAsyncResult result) { var context = _listener.EndGetContext(result); _listener.BeginGetContext(HandleRequest, _listener); var state = new HttpResponseState { Stream = context.Request.InputStream, Buffer = new byte[ChunkSize], Response = context.Response, Request = context.Request }; context.Request.InputStream.BeginRead(state.Buffer, 0, state.Buffer.Length, Callback, state); }
public ParserState ParseBuffer( byte[] buffer, int bytesReady, ref int bytesConsumed) { if (buffer == null) { throw new ArgumentNullException("buffer"); } ParserState parseStatus = ParserState.NeedMoreData; ParserState subParseStatus = ParserState.NeedMoreData; switch (_responseStatus) { case HttpResponseState.StatusLine: try { subParseStatus = _statusLineParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { _responseStatus = HttpResponseState.ResponseHeaders; subParseStatus = ParserState.NeedMoreData; goto case HttpResponseState.ResponseHeaders; } else if (subParseStatus != ParserState.NeedMoreData) { // Report error - either Invalid or DataTooBig parseStatus = subParseStatus; break; } break; // read more data case HttpResponseState.ResponseHeaders: if (bytesConsumed >= bytesReady) { // we already can tell we need more data break; } try { subParseStatus = _headerParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { parseStatus = subParseStatus; } else if (subParseStatus != ParserState.NeedMoreData) { parseStatus = subParseStatus; break; } break; // need more data } return(parseStatus); }
public ParserState ParseBuffer( byte[] buffer, int bytesReady, ref int bytesConsumed) { if (buffer == null) { throw new ArgumentNullException("buffer"); } ParserState parseStatus = ParserState.NeedMoreData; ParserState subParseStatus = ParserState.NeedMoreData; switch (_responseStatus) { case HttpResponseState.StatusLine: try { subParseStatus = _statusLineParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { _responseStatus = HttpResponseState.ResponseHeaders; subParseStatus = ParserState.NeedMoreData; goto case HttpResponseState.ResponseHeaders; } else if (subParseStatus != ParserState.NeedMoreData) { // Report error - either Invalid or DataTooBig parseStatus = subParseStatus; break; } break; // read more data case HttpResponseState.ResponseHeaders: if (bytesConsumed >= bytesReady) { // we already can tell we need more data break; } try { subParseStatus = _headerParser.ParseBuffer(buffer, bytesReady, ref bytesConsumed); } catch (Exception) { subParseStatus = ParserState.Invalid; } if (subParseStatus == ParserState.Done) { parseStatus = subParseStatus; } else if (subParseStatus != ParserState.NeedMoreData) { parseStatus = subParseStatus; break; } break; // need more data } return parseStatus; }