// This source file is based on mock4net by Alexandre Victoor which is licensed under the Apache 2.0 License. // For more details see 'mock4net/LICENSE.txt' and 'mock4net/readme.md' in this project root. using JetBrains.Annotations; using System; using System.Collections.Generic; using System.Linq; using System.Net; using WireMock.Models; using WireMock.Types; using WireMock.Util; using Stef.Validation; namespace WireMock { /// /// The RequestMessage. /// public class RequestMessage : IRequestMessage { /// public string ClientIP { get; } /// public string Url { get; } /// public string AbsoluteUrl { get; } /// public string ProxyUrl { get; set; } /// public DateTime DateTime { get; set; } /// public string Path { get; } /// public string AbsolutePath { get; } /// public string[] PathSegments { get; } /// public string[] AbsolutePathSegments { get; } /// public string Method { get; } /// public IDictionary>? Headers { get; } /// public IDictionary? Cookies { get; } /// public IDictionary>? Query { get; } /// public string RawQuery { get; } /// public IBodyData? BodyData { get; } /// public string Body { get; } /// public object BodyAsJson { get; } /// public byte[] BodyAsBytes { get; } /// public string DetectedBodyType { get; } /// public string DetectedBodyTypeFromContentType { get; } /// public string DetectedCompression { get; } /// public string Host { get; } /// public string Protocol { get; } /// public int Port { get; } /// public string Origin { get; } /// /// Initializes a new instance of the class. /// /// The original url details. /// The HTTP method. /// The client IP Address. /// The BodyData. /// The headers. /// The cookies. public RequestMessage(UrlDetails urlDetails, string method, string clientIP, IBodyData? bodyData = null, IDictionary? headers = null, IDictionary? cookies = null) { Guard.NotNull(urlDetails, nameof(urlDetails)); Guard.NotNull(method, nameof(method)); Guard.NotNull(clientIP, nameof(clientIP)); AbsoluteUrl = urlDetails.AbsoluteUrl.ToString(); Url = urlDetails.Url.ToString(); Protocol = urlDetails.Url.Scheme; Host = urlDetails.Url.Host; Port = urlDetails.Url.Port; Origin = $"{Protocol}://{Host}:{Port}"; AbsolutePath = WebUtility.UrlDecode(urlDetails.AbsoluteUrl.AbsolutePath); Path = WebUtility.UrlDecode(urlDetails.Url.AbsolutePath); PathSegments = Path.Split('/').Skip(1).ToArray(); AbsolutePathSegments = AbsolutePath.Split('/').Skip(1).ToArray(); Method = method; ClientIP = clientIP; BodyData = bodyData; // Convenience getters for e.g. Handlebars Body = BodyData?.BodyAsString; BodyAsJson = BodyData?.BodyAsJson; BodyAsBytes = BodyData?.BodyAsBytes; DetectedBodyType = BodyData?.DetectedBodyType.ToString(); DetectedBodyTypeFromContentType = BodyData?.DetectedBodyTypeFromContentType.ToString(); DetectedCompression = BodyData?.DetectedCompression; Headers = headers?.ToDictionary(header => header.Key, header => new WireMockList(header.Value)); Cookies = cookies; RawQuery = urlDetails.Url.Query; Query = QueryStringParser.Parse(RawQuery); } /// /// Get a query parameter. /// /// The key. /// Defines if the key should be matched using case-ignore. /// The query parameter. public WireMockList? GetParameter(string? key, bool ignoreCase = false) { if (Query == null) { return null; } var query = !ignoreCase ? Query : new Dictionary>(Query, StringComparer.OrdinalIgnoreCase); return query.ContainsKey(key) ? query[key] : null; } } }