public SerializableRequest Clone() { var c = new SerializableRequest { Content = this.Content, ContentType = this.ContentType, Host = this.Host, Method = this.Method, Url = this.Url, Protocol = this.Protocol }; CloneHash(c.Headers, Headers); CloneHash(c.PathParams, PathParams); CloneHash(c.QueryParams, QueryParams); return(c); }
private SerializableResponse ForwardRequest(SerializableRequest serializableReuqest) { //throw new Exception(); var serializableResponse = new SerializableResponse(); var method = HttpMethod.Get; if (serializableReuqest.Method == "GET") { method = HttpMethod.Get; } if (serializableReuqest.Method == "POST") { method = HttpMethod.Post; } if (serializableReuqest.Method == "PUT") { method = HttpMethod.Put; } if (serializableReuqest.Method == "DELETE") { method = HttpMethod.Delete; } var qp = ""; if (serializableReuqest.QueryParams.Any()) { qp = "?" + string.Join("&", serializableReuqest.QueryParams.Select(kvp => kvp.Key + "=" + kvp.Value)); } var requestMessage = new HttpRequestMessage(method, serializableReuqest.Url + qp); foreach (var requestHeader in serializableReuqest.Headers) { if (requestHeader.Key == "Host") { var uri = new Uri(serializableReuqest.Url); requestMessage.Headers.Add(requestHeader.Key, uri.Host); } else { if (!requestHeader.Key.ToLowerInvariant().StartsWith("expire")) { requestMessage.Headers.Add(requestHeader.Key, requestHeader.Value); } } } if (serializableReuqest.Method == "POST" || serializableReuqest.Method == "PUT") { requestMessage.Content = new ByteArrayContent(serializableReuqest.Content); } HttpClientHandler handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; var client = new HttpClient(handler); var asyncResponse = client.SendAsync(requestMessage); asyncResponse.Wait(); var realResponse = asyncResponse.Result; serializableResponse.ContentType = realResponse.Content.Headers.ContentType.MediaType; serializableResponse.Headers["Date"] = DateTime.Now.ToString("r"); serializableResponse.Headers["Last-Modified"] = DateTime.Now.ToString("r"); var realResponsedata = realResponse.Content.ReadAsByteArrayAsync(); realResponsedata.Wait(); serializableResponse.Content = realResponsedata.Result; if (_textData.Contains(serializableResponse.ContentType)) { var txt = Encoding.UTF8.GetString(serializableResponse.Content); var target = Encoding.UTF8.GetString(serializableResponse.Content); var results = new List <Match>(); //string txt = "this is my url http://www.google.com and visit this website and this is my url http://www.yahoo.com"; foreach (Match item in Regex.Matches(txt, @"(http|ftp|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?")) { try { var uri = new Uri(item.Value); if (_replaceableUrl.Any(u => uri.Host.ToLowerInvariant().Contains(u.ToLowerInvariant()))) { if (!_ignoreUrl.Any(u => uri.Host.ToLowerInvariant().Contains(u.ToLowerInvariant()))) { var newUri = uri.ToString().Replace(uri.Scheme + "://", _local + "/" + uri.Scheme + "/"); target = target.Replace(item.Value, newUri); } } } catch (Exception) { } } if (serializableResponse.ContentType == "application/json") { target = JValue.Parse(target).ToString(Formatting.Indented); } serializableResponse.Content = Encoding.UTF8.GetBytes(target); } return(serializableResponse); }
private void Process(HttpListenerContext context) { var serializedRequest = new SerializableRequest(); var req = context.Request; var path = req.Url.AbsolutePath; if (path.ToLowerInvariant().EndsWith("favicon.ico")) { context.Response.StatusCode = 200; context.Response.OutputStream.Flush(); context.Response.OutputStream.Close(); return; } Console.WriteLine(req.Url); var filePath = path.TrimStart('/').Replace("/", "\\"); //var host = path.TrimStart('/').Split('/').First(); serializedRequest.Host = req.Url.Host + ":" + req.Url.Port; serializedRequest.Url = path;// "/" + string.Join("/", path.TrimStart('/').Split('/').Skip(1)); //var nugetUrl = "https://" + host; HttpMethod method = HttpMethod.Get; serializedRequest.Method = req.HttpMethod.ToUpperInvariant(); if (serializedRequest.Method == "GET") { method = HttpMethod.Get; } if (serializedRequest.Method == "POST") { method = HttpMethod.Post; } if (serializedRequest.Method == "PUT") { method = HttpMethod.Put; } //sr.ContentType = req.ContentType; serializedRequest.Headers = new Dictionary <String, String>(); serializedRequest.QueryParams = new Dictionary <String, String>(); foreach (string item in req.QueryString.Keys) { if (item == null) { serializedRequest.QueryParams[item] = "true"; } else { serializedRequest.QueryParams[item] = req.QueryString[item]; } } foreach (var reqh in req.Headers.AllKeys) { if (reqh == null) { continue; } serializedRequest.Headers.Add(reqh, req.Headers[reqh]); } serializedRequest.Content = GetRequestPostData(req); SerializableResponse res = null; _counter++; //File.WriteAllText(_counter + ".0.json", sr.Serialize()); var uri = new Uri("http://test" + serializedRequest.Url).Segments.Where(a => a != "/").Select(a => a.Trim('/')).ToArray(); var protocol = uri[0]; var server = uri[1]; var realUri = protocol + "://" + server + "/" + string.Join("/", uri.Skip(2)); var cloned = serializedRequest.Clone(); cloned.Url = realUri; var localPath = Path.Combine(_path, serializedRequest.ToLocalPath()); try { if (!Directory.Exists(Path.GetDirectoryName(localPath))) { Directory.CreateDirectory(Path.GetDirectoryName(localPath)); } if (_logRequests) { var data = JsonConvert.SerializeObject(serializedRequest); data = JValue.Parse(data).ToString(Formatting.Indented); File.WriteAllText(localPath + ".request", data); } res = ForwardRequest(cloned); //Console.WriteLine("Written " + serializedRequest.ToLocalPath()); File.WriteAllBytes(localPath + ".response", res.Content); File.WriteAllText(localPath + ".mime", res.ContentType); } catch (Exception ex) { Console.WriteLine(ex); if (File.Exists(localPath + ".response")) { res = new SerializableResponse { ContentType = File.ReadAllText(localPath + ".mime"), Content = File.ReadAllBytes(localPath + ".response"), HttpCode = 200 }; } } if (res == null) { res = new SerializableResponse { ContentType = "text", Content = Encoding.UTF8.GetBytes("404 not found " + serializedRequest.Url), HttpCode = 404 }; } context.Response.StatusCode = res.HttpCode; context.Response.ContentType = res.ContentType; foreach (var h in res.Headers) { context.Response.Headers.Add(h.Key, h.Value); } context.Response.ContentLength64 = res.Content.Length; context.Response.OutputStream.Write(res.Content, 0, res.Content.Length); context.Response.OutputStream.Flush(); context.Response.OutputStream.Close(); }