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 { } }); }
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); }