Пример #1
0
        public SerializableResponse Clone()
        {
            var res = new SerializableResponse
            {
                HttpCode    = HttpCode,
                ContentType = ContentType
            };

            foreach (var item in Headers)
            {
                res.Headers.Add(item.Key, item.Value);
            }
            res.Content = Content;
            return(res);
        }
Пример #2
0
        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\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?"))
                {
                    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);
        }
Пример #3
0
        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();
        }