/// <summary> /// Creates the request URI by combining scheme (provided) with parsed values of /// host and path. /// </summary> /// <param name="uriScheme">The URI scheme to use for the request URI.</param> /// <param name="httpRequest">The unsorted HTTP request.</param> /// <returns>A fully qualified request URI.</returns> private static Uri CreateRequestUri(string uriScheme, HttpUnsortedRequest httpRequest) { Contract.Assert(httpRequest != null, "httpRequest cannot be null."); Contract.Assert(uriScheme != null, "uriScheme cannot be null"); IEnumerable <string> hostValues; if (httpRequest.HttpHeaders.TryGetValues(FormattingUtilities.HttpHostHeader, out hostValues)) { int hostCount = hostValues.Count(); if (hostCount != 1) { throw Error.InvalidOperation(Resources.HttpMessageParserInvalidHostCount, FormattingUtilities.HttpHostHeader, hostCount); } } else { throw Error.InvalidOperation(Resources.HttpMessageParserInvalidHostCount, FormattingUtilities.HttpHostHeader, 0); } // We don't use UriBuilder as hostValues.ElementAt(0) contains 'host:port' and UriBuilder needs these split out into separate host and port. string requestUri = String.Format(CultureInfo.InvariantCulture, "{0}://{1}{2}", uriScheme, hostValues.ElementAt(0), httpRequest.RequestUri); return(new Uri(requestUri)); }
private static async Task <HttpRequestMessage> ReadAsHttpRequestMessageAsyncCore(this HttpContent content, string uriScheme, int bufferSize, int maxHeaderSize, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); Stream stream = await content.ReadAsStreamAsync(); HttpUnsortedRequest httpRequest = new HttpUnsortedRequest(); HttpRequestHeaderParser parser = new HttpRequestHeaderParser(httpRequest, HttpRequestHeaderParser.DefaultMaxRequestLineSize, maxHeaderSize); ParserState parseStatus; byte[] buffer = new byte[bufferSize]; int bytesRead = 0; int headerConsumed = 0; while (true) { try { bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); } catch (Exception e) { throw new IOException(Resources.HttpMessageErrorReading, e); } try { parseStatus = parser.ParseBuffer(buffer, bytesRead, ref headerConsumed); } catch (Exception) { parseStatus = ParserState.Invalid; } if (parseStatus == ParserState.Done) { return(CreateHttpRequestMessage(uriScheme, httpRequest, stream, bytesRead - headerConsumed)); } else if (parseStatus != ParserState.NeedMoreData) { throw Error.InvalidOperation(Resources.HttpMessageParserError, headerConsumed, buffer); } else if (bytesRead == 0) { throw new IOException(Resources.ReadAsHttpMessageUnexpectedTermination); } } }
private static HttpRequestMessage CreateHttpRequestMessage(string uriScheme, HttpUnsortedRequest httpRequest, Stream contentStream, int rewind) { Contract.Assert(uriScheme != null, "URI scheme must be non null"); Contract.Assert(httpRequest != null, "httpRequest must be non null"); Contract.Assert(contentStream != null, "contentStream must be non null"); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(); // Set method, requestURI, and version httpRequestMessage.Method = httpRequest.Method; httpRequestMessage.RequestUri = CreateRequestUri(uriScheme, httpRequest); httpRequestMessage.Version = httpRequest.Version; // Set the header fields and content if any httpRequestMessage.Content = CreateHeaderFields(httpRequest.HttpHeaders, httpRequestMessage.Headers, contentStream, rewind); return(httpRequestMessage); }