コード例 #1
0
        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));
        }