public static RequestContext BuildRequestContext(string requestHeaderText, NetworkStream requestStream) { if (string.IsNullOrWhiteSpace(requestHeaderText)) { throw new ArgumentException($"{nameof(requestHeaderText)} cannot be null, empty or whitespace."); } if (requestStream == null) { throw new ArgumentNullException($"{nameof(requestStream)} cannot be null."); } string[] requestHeaderFields = requestHeaderText.Split(Environment.NewLine); string[] requestLineSegments = requestHeaderFields .First() .Split(' '); if (requestLineSegments.Length != 3) { throw new HttpRequestParserException($"Invalid RequestLine- Format. Number of Segments:{requestLineSegments.Length}, expected 3."); } string method = requestLineSegments[0]; string requestedPath = requestLineSegments[1]; string version = requestLineSegments[2]; if (!supportedVersion.Contains(version, StringComparer.OrdinalIgnoreCase)) { throw new HttpRequestParserException($"Invalid Request Version: {version}."); } string[] requestedPathSegments = requestedPath .Split('?'); string path = string.Empty; string queryString = string.Empty; if (requestedPathSegments.Length > 0) { path = requestedPathSegments[0]; } if (requestedPathSegments.Length > 1) { queryString = requestedPathSegments[1]; } RequestContext.RequestLine requestLine = new RequestContext.RequestLine(version, path, requestedPath, ConvertMethod(method)); IReadOnlyDictionary <string, string> parsedQueryString = ParseQueryString(queryString); Multimap <string, string> parsedRequestHeaderFields = ParseRequestHeaderFields(requestHeaderFields); return(RequestContext.Build(requestLine, parsedQueryString, parsedRequestHeaderFields, requestStream)); }