/// <summary>
        /// Adds the received request to the list of received requests
        /// </summary>
        /// <param name="httpListenerContext"></param>
        protected void AddRequest(HttpListenerContext httpListenerContext)
        {
            RequestInstance newRequest = new RequestInstance();

            newRequest.TimeStamp = DateTime.Now;
            newRequest.Headers   = GetDictionaryFromCollection(httpListenerContext.Request.Headers);

            newRequest.Method = httpListenerContext.Request.HttpMethod;

            // calling HttpUtility.ParseQueryString due to a known defect in context.Request.QueryString
            newRequest.GetQueryString = GetDictionaryFromCollection(HttpUtility.ParseQueryString(httpListenerContext.Request.Url.Query));

            newRequest.PostQueryString = new Dictionary <string, string>();
            newRequest.Files           = new List <UploadedFile>();

            newRequest = ProcessPost(newRequest, httpListenerContext);

            newRequest.Uri = httpListenerContext.Request.Url.AbsoluteUri.Substring(EndpointAddress.Length);
            if (newRequest.Uri.Contains("?"))
            {
                newRequest.Uri = newRequest.Uri.Substring(0, newRequest.Uri.IndexOf('?'));
            }

            RequestsReceived.Add(newRequest);
        }
        /// <summary>
        /// Converts post contents of received HttpListenerRequest to RequestInstance
        /// (Includes PostQueryString and uploaded files)
        /// </summary>
        /// <returns>RequestInstance containing post contents of HttpListenerRequest</returns>
        /// <param name="newRequest">The RequestInstance to put post contents into</param>
        /// <param name="context">the HttpListenerContext on listener</param>
        protected override RequestInstance ProcessPost(RequestInstance newRequest, HttpListenerContext context)
        {
            if (context.Request.ContentType != null && context.Request.ContentType.ToLower().Contains("multipart"))
            {
                newRequest.Files = UploadedFileParser.ParseUploadedFiles(context.Request.InputStream);
            }

            return(newRequest);
        }
        /// <summary>
        /// Converts post contents of received HttpListenerRequest to RequestInstance
        /// (Includes PostQueryString and uploaded files)
        /// </summary>
        /// <returns>RequestInstance containing post contents of HttpListenerRequest</returns>
        /// <param name="newRequest">The RequestInstance to put post contents into</param>
        /// <param name="context">the HttpListenerContext on listener</param>
        protected override RequestInstance ProcessPost(RequestInstance newRequest, HttpListenerContext context)
        {
            string rawPostQueryString = new StreamReader(context.Request.InputStream).ReadToEnd();

            newRequest.RawPostQueryString = rawPostQueryString;
            if (rawPostQueryString.Length > 0)
            {
                newRequest.PostQueryString = GetDictionaryFromCollection(HttpUtility.ParseQueryString(rawPostQueryString));
            }

            return(newRequest);
        }
 /// <summary>
 /// Converts post contents of received HttpListenerRequest to RequestInstance
 /// (Includes PostQueryString and uploaded files)
 /// </summary>
 /// <returns>RequestInstance containing post contents of HttpListenerRequest</returns>
 /// <param name="newRequest">The RequestInstance to put post contents into</param>
 /// <param name="context">the HttpListenerContext on listener</param>
 protected virtual RequestInstance ProcessPost(RequestInstance newRequest, HttpListenerContext context)
 {
     throw new NotImplementedException($"Not implemented in {GetType().Name}.");
 }