Beispiel #1
0
        public void Run()
        {
            ThreadPool.QueueUserWorkItem((o) =>
            {
                Console.WriteLine("Nock.net: Webserver running *:8080 ...");
                try
                {
                    while (_listener.IsListening)
                    {
                        ThreadPool.QueueUserWorkItem((c) =>
                        {
                            var ctx = c as HttpListenerContext;
                            try
                            {
                                Console.WriteLine("Nock.net: Url requested - " + ctx.Request.RawUrl);
                                NockHttpWebResponse webResponse = GetResponse(ctx.Request);

                                foreach (var header in webResponse.Headers.AllKeys)
                                {
                                    SetResponseHeader(header, webResponse.Headers, ctx.Response);
                                }

                                ctx.Response.StatusCode = webResponse.Status;

                                if (webResponse.Body.StartsWith("Nock.net"))
                                {
                                    webResponse.Body = string.Empty;
                                }

                                byte[] buf = Encoding.UTF8.GetBytes(webResponse.Body);
                                ctx.Response.ContentLength64 = buf.Length;
                                ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                            }
                            finally
                            {
                                ctx.Response.OutputStream.Close();
                            }
                        }, _listener.GetContext());
                    }
                }
                catch { }
            });
        }
Beispiel #2
0
        private static NockHttpWebResponse GetResponse(HttpListenerRequest request)
        {
            if (nock.Recorder.IsRecording)
            {
                nock.Recorder.RecordRequest(request);
            }

            var headers = request.Headers;

            var requestUri = request.RawUrl;

            if (!requestUri.ToLower().StartsWith("http://") && !requestUri.ToLower().StartsWith("https://"))
            {
                requestUri = request.Url.AbsoluteUri;
            }

            var nockedMatch = RequestMatcher.FindNockedWebResponse(new NockHttpWebRequest()
            {
                RequestUri  = requestUri,
                Headers     = headers,
                Method      = request.HttpMethod,
                InputStream = request.InputStream,
                Query       = request.QueryString
            });

            NockHttpWebResponse response = new NockHttpWebResponse();

            response.Headers = new NameValueCollection();
            response.Status  = 500;
            response.Body    = "";

            if (nockedMatch.NockedRequest != null)
            {
                var nock = nockedMatch.NockedRequest;

                response.Status = (int)nock.StatusCode;

                if (nock.ResponseCreator != null)
                {
                    try
                    {
                        var url = request.RawUrl;

                        if (url.Contains("?"))
                        {
                            url = url.Substring(0, url.IndexOf("?"));
                        }

                        var requestDetails  = new RequestDetails(url, headers, request.QueryString, nockedMatch.RequestedBody);
                        var createdResponse = nock.ResponseCreator(requestDetails);

                        response.Body    = createdResponse.ResponseBody ?? string.Empty;
                        response.Headers = createdResponse.ResponseHeaders;
                    }
                    catch (Exception ex)
                    {
                        var body = string.Format("Nock.net: An error occured when making a request to '{0}', Exception: {1}, response creator delegate failed, now returning a Expectation failed status code.", request.RawUrl, ex.Message);
                        Console.WriteLine(body);
                        response.Status = (int)HttpStatusCode.ExpectationFailed;
                        byte[] buf = Encoding.UTF8.GetBytes(body);
                        response.Body = body;
                    }
                }
                else
                {
                    response.Body    = nock.Response ?? string.Empty;
                    response.Headers = AddHeaders <NameValueCollection, WebHeaderCollection>(nock.ResponseHeaders, null);
                }
            }
            else
            {
                HttpWebRequest webRequest = WebRequest.Create(request.Url) as HttpWebRequest;
                webRequest.Proxy = null;

                webRequest.Headers = AddHeaders <NameValueCollection, WebHeaderCollection>(request.Headers, webRequest);

                webRequest.Method = request.HttpMethod;

                if (nock.RequestTimeoutInMilliseconds.HasValue)
                {
                    webRequest.Timeout = nock.RequestTimeoutInMilliseconds.Value;
                }

                if (!string.IsNullOrEmpty(nockedMatch.RequestedBody))
                {
                    try
                    {
                        var bytes = Encoding.UTF8.GetBytes(nockedMatch.RequestedBody);

                        using (var requestStream = webRequest.GetRequestStream())
                        {
                            requestStream.Write(bytes, 0, bytes.Length);
                            requestStream.Close();
                        }
                    }
                    catch (Exception)
                    {
                    }
                }

                HttpWebResponse webResponse;

                try
                {
                    webResponse = webRequest.GetResponse() as HttpWebResponse;
                    var reader       = new StreamReader(webResponse.GetResponseStream(), true);
                    var responseBody = reader.ReadToEnd();
                    response.Status  = (int)webResponse.StatusCode;
                    response.Headers = AddHeaders <NameValueCollection, WebHeaderCollection>(webResponse.Headers, null);
                    response.Body    = responseBody;
                }
                catch (Exception ex)
                {
                    var body = string.Format("Nock.net: An error occured when making a request to '{0}', Exception: {1}, now returning a Expectation failed status code.", request.RawUrl, ex.Message);
                    Console.WriteLine(body);
                    response.Status = (int)HttpStatusCode.ExpectationFailed;
                    byte[] buf = Encoding.UTF8.GetBytes(body);
                    response.Body = body;
                }
            }

            return(response);
        }