Пример #1
0
        public async Task <AboutLrsResponse> AboutAsync()
        {
            var r = new AboutLrsResponse();

            var req = new MyHttpRequest
            {
                Method   = "GET",
                Resource = "about"
            };

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.OK)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;
            r.Content = new About(Encoding.UTF8.GetString(res.Content));

            return(r);
        }
Пример #2
0
        private async Task <LrsResponse> DeleteDocument(string resource, Dictionary <string, string> queryParams)
        {
            var r = new LrsResponse();

            var req = new MyHttpRequest
            {
                Method      = "DELETE",
                Resource    = resource,
                QueryParams = queryParams
            };

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.NoContent)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;

            return(r);
        }
Пример #3
0
        private async Task <StatementLrsResponse> GetStatement(Dictionary <string, string> queryParams)
        {
            var r = new StatementLrsResponse();

            var req = new MyHttpRequest
            {
                Method      = "GET",
                Resource    = "statements",
                QueryParams = queryParams
            };

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.OK)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;
            r.Content = new Statement(new Json.StringOfJson(Encoding.UTF8.GetString(res.Content)));

            return(r);
        }
Пример #4
0
        public async Task <StatementsResultLrsResponse> MoreStatementsAsync(StatementsResult result)
        {
            var r = new StatementsResultLrsResponse();

            var req = new MyHttpRequest
            {
                Method   = "GET",
                Resource = Endpoint.GetLeftPart(UriPartial.Authority)
            };

            if (!req.Resource.EndsWith("/"))
            {
                req.Resource += "/";
            }
            req.Resource += result.More;

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.OK)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;
            var json = new Json.StringOfJson(Encoding.UTF8.GetString(res.Content));

            r.Content = new StatementsResult(json);

            return(r);
        }
Пример #5
0
        /// <summary>
        /// 向浏览器发送响应报文
        /// </summary>
        /// <param name="req"></param>
        /// <param name="response"></param>
        public void SendResponse(MyHttpRequest req, MyHttpResponse response)
        {
            PrepareResponseHeaders(response);
            response.SendChunked = true;                                                 //当报文长度不确定时用这个【TransferEncoding=chunked】
            response.Headers[HttpResponseHeader.Server]       = "MyServer";              //统一设置标头
            response.Headers[HttpResponseHeader.LastModified] = DateTime.Now.ToString(); //统一设置LastModified

            Stream httpBodyStream = GetHttpBodyStream(req, response);

            if (httpBodyStream == null)
            {
                response.ContentLength64 = 0;
                ResponseWithGzipCheck(req, response, httpBodyStream);
            }
            else
            {
                if (cacheShoot)
                {
                    response.AddHeader("IsCacheShoot", "Yes");
                }
                ResponseWithGzipCheck(req, response, httpBodyStream);
                httpBodyStream.Close();
                httpBodyStream.Dispose();
            }
            response.OutputStream.Close(); //统一关闭响应的输出流
            response.Close();              //统一关闭响应流
        }
Пример #6
0
        /// <summary>
        /// 根据HTTP请求,返回响应报文字节序列(用缓存)
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        protected Stream GetHttpBodyWithCache(MyHttpRequest req, MyHttpResponse resp)
        {
            Stream r = null;

            var ifModified = req.Headers["If-Modified-Since"];

            //如果浏览器发送过来的请求中没有If-Modified-Since标头,则不读缓存,重新生成页面,并更新缓存
            if (ifModified == null || ifModified == "")
            {
                cacheShoot = false;
                r          = GetHttpBodyWithoutCache(req, resp);
                //更新缓存
                cache.AddOrUpdateCache(req.Url.ToString(), r, DateTime.Now, 100);
                return(r);
            }

            var ifModifiedSince     = DateTime.Parse(ifModified);
            var cachedHtmlFileBytes = cache.GetCache(req.Url.ToString(), ifModifiedSince);

            if (cachedHtmlFileBytes == null)//缓存未命中
            {
                cacheShoot = false;
                r          = GetHttpBodyWithoutCache(req, resp);
                //写入缓存
                cache.AddOrUpdateCache(req.Url.ToString(), r, DateTime.Now, 100);
            }
            else//缓存命中
            {
                cacheShoot = true;
                r          = cachedHtmlFileBytes;
            }
            return(r);
        }
Пример #7
0
        public override Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp)
        {
            Stream r = null;

            if (localPath != null)
            {
                if (!File.Exists(localPath))
                {
                    resp.StatusCode        = (int)HttpStatusCode.NotFound;
                    resp.StatusDescription = "请求的PHP文档不存在!";
                    return(null);
                }

                resp.StatusCode        = (int)HttpStatusCode.OK;
                resp.StatusDescription = "MyPhpOK";

                //把HTTP请求转发给PHP处理
                string           phpCgi    = string.Format(@"{0}\PhpCgi\php.exe", Directory.GetCurrentDirectory());
                ProcessStartInfo startInfo = new ProcessStartInfo(phpCgi, localPath);
                startInfo.RedirectStandardOutput = true;
                startInfo.WindowStyle            = ProcessWindowStyle.Hidden;
                startInfo.UseShellExecute        = false;
                var          phpProcess = Process.Start(startInfo);
                var          output     = phpProcess.StandardOutput;
                var          buf        = output.BaseStream.ReadAllBytes();
                MemoryStream ms         = new MemoryStream();
                ms.Write(buf, 0, buf.Length);
                r = ms;
            }
            return(r);
        }
Пример #8
0
        public async Task <StatementsResultLrsResponse> QueryStatementsAsync(StatementsQuery query)
        {
            var r = new StatementsResultLrsResponse();

            var req = new MyHttpRequest
            {
                Method      = "GET",
                Resource    = "statements",
                QueryParams = query.ToParameterMap(Version)
            };

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.OK)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;
            r.Content = new StatementsResult(new Json.StringOfJson(Encoding.UTF8.GetString(res.Content)));

            return(r);
        }
Пример #9
0
 public override Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp)
 {
     //TextWriter tw = new StreamWriter(response.OutputStream);
     //var n = Path.GetFileName(req.GetLocalPath(PhysicalPath));
     //var workerReq = new SimpleWorkerRequest(n, null, tw);
     //HttpRuntime.ProcessRequest(workerReq);
     return(null);
 }
Пример #10
0
        public override Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp)
        {
            resp.StatusCode        = (int)HttpStatusCode.OK;
            resp.StatusDescription = "StaticOK";

            var fs = File.OpenRead(localPath);

            return(fs);
        }
Пример #11
0
        /// <summary>
        /// 考虑是否启用服务器端GZip压缩
        /// </summary>
        /// <param name="req"></param>
        /// <param name="response"></param>
        /// <param name="httpBodyStream"></param>
        protected void ResponseWithGzipCheck(MyHttpRequest req, MyHttpResponse response, Stream httpBodyStream)
        {
            bool useGzip = false;

            if (req.Headers["Accept-Encoding"].ToLower().Contains("gzip"))
            {
                useGzip = true;
            }
            response.ResponseToBrowser(httpBodyStream, useGzip);
        }
Пример #12
0
        public override bool CanHandle(MyHttpRequest req)
        {
            localPath = req.GetLocalPath(PhysicalPath);
            if (localPath == null)
            {
                return(false);
            }
            var ext = Path.GetExtension(localPath);

            return(ext.ToLower() == ".php");
        }
Пример #13
0
        public override bool CanHandle(MyHttpRequest req)
        {
            localPath = req.GetLocalPath(PhysicalPath);
            var ext = Path.GetExtension(localPath).ToLower();

            return(ext == ".aspx" ||
                   ext == ".ashx" ||
                   ext == ".asmx" ||
                   ext == ".cshtm" ||
                   ext == ".cshtml");
        }
        public void ProcessRequest(HttpContext context)
        {
            var request     = context.Request;
            var requestBody = new StreamReader(request.InputStream, request.ContentEncoding).ReadToEnd();
            GetDefectInfoListRequestData reqData = JsonConvert.DeserializeObject <GetDefectInfoListRequestData>(requestBody);
            MyHttpRequest myReq = new MyHttpRequest();
            Dictionary <string, object> dictionary = myReq.GetDefectInfoList(reqData);

            context.Response.ContentType = "application/json";
            context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(dictionary));
        }
Пример #15
0
        public async Task <StatementLrsResponse> SaveStatementAsync(Statement statement)
        {
            var r   = new StatementLrsResponse();
            var req = new MyHttpRequest
            {
                QueryParams = new Dictionary <string, string>(),
                Resource    = "statements"
            };

            if (statement.Id == null)
            {
                req.Method = "POST";
            }
            else
            {
                req.Method = "PUT";
                req.QueryParams.Add("statementId", statement.Id.ToString());
            }

            req.ContentType = "application/json";
            req.Content     = Encoding.UTF8.GetBytes(statement.ToJson(Version));

            var res = await MakeRequest(req);

            if (statement.Id == null)
            {
                if (res.Status != HttpStatusCode.OK)
                {
                    r.Success       = false;
                    r.HttpException = res.Ex;
                    r.SetErrMsgFromBytes(res.Content);
                    return(r);
                }

                var ids = JArray.Parse(Encoding.UTF8.GetString(res.Content));
                statement.Id = new Guid((string)ids[0]);
            }
            else
            {
                if (res.Status != HttpStatusCode.NoContent)
                {
                    r.Success       = false;
                    r.HttpException = res.Ex;
                    r.SetErrMsgFromBytes(res.Content);
                    return(r);
                }
            }

            r.Success = true;
            r.Content = statement;

            return(r);
        }
Пример #16
0
        public override void Authenticate(MyHttpRequest request)
        {
            base.Authenticate(request);

            // check expiration time etc.
            if (_user.localExpiresAt < DateTime.UtcNow)
            {
                if (!RefreshUser())
                {
                    throw new NotAuthorizedException("AD has no longer this user");
                }
            }
        }
Пример #17
0
        private async Task <LrsResponse> SaveDocument(string resource, Dictionary <string, string> queryParams, Document document)
        {
            var r = new LrsResponse();

            var req = new MyHttpRequest
            {
                Method      = "PUT",
                Resource    = resource,
                QueryParams = queryParams,
                ContentType = document.ContentType,
                Content     = document.Content
            };

            if (!string.IsNullOrEmpty(document.Etag))
            {
                req.Headers = new Dictionary <string, string> {
                    { "If-Match", document.Etag }
                };
            }
            else
            {
                req.Headers = new Dictionary <string, string> {
                    { "If-None-Match", "*" }
                };
            }


            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.NoContent)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;

            return(r);
        }
Пример #18
0
        public async Task <StatementsResultLrsResponse> SaveStatementsAsync(List <Statement> statements)
        {
            var r = new StatementsResultLrsResponse();

            var req = new MyHttpRequest
            {
                Resource    = "statements",
                Method      = "POST",
                ContentType = "application/json"
            };

            var jarray = new JArray();

            foreach (var st in statements)
            {
                jarray.Add(st.ToJObject(Version));
            }
            req.Content = Encoding.UTF8.GetBytes(jarray.ToString());

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.OK)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            var ids = JArray.Parse(Encoding.UTF8.GetString(res.Content));

            for (var i = 0; i < ids.Count; i++)
            {
                statements[i].Id = new Guid((string)ids[i]);
            }

            r.Success = true;
            r.Content = new StatementsResult(statements);

            return(r);
        }
        public void ProcessRequest(HttpContext context)
        {
            var request     = context.Request;
            var requestBody = new StreamReader(request.InputStream, request.ContentEncoding).ReadToEnd();
            MoveDefectImageByPUIdRequestData reqData = JsonConvert.DeserializeObject <MoveDefectImageByPUIdRequestData>(requestBody);
            MyHttpRequest myReq = new MyHttpRequest();
            Dictionary <string, object> dictionary = new Dictionary <string, object>();

            if (reqData.changefilename == 1)
            {
                dictionary = myReq.MoveImageFile(reqData.puId, reqData.changefilename);
            }
            else
            {
                dictionary = myReq.MoveImageFile(reqData.puId, reqData.startDate);
            }


            context.Response.ContentType = "application/json";
            context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(dictionary));
        }
Пример #20
0
        private async Task <MyHttpResponse> GetDocument(string resource, Dictionary <string, string> queryParams, Document document)
        {
            var req = new MyHttpRequest
            {
                Method      = "GET",
                Resource    = resource,
                QueryParams = queryParams,
                ContentType = "application/json"
            };

            var res = await MakeRequest(req);

            if (res.Status == HttpStatusCode.OK)
            {
                document.Content     = res.Content;
                document.ContentType = res.ContentType;
                document.Timestamp   = res.LastModified;
                document.Etag        = res.Etag;
            }

            return(res);
        }
Пример #21
0
        public override Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp)
        {
            if (actionResult == null)
            {
                return(null);
            }

            resp.StatusCode        = (int)HttpStatusCode.OK;
            resp.StatusDescription = "MyMvcOK";

            MvcContext ctx = new MvcContext
            {
                UserAssembly   = userAssembly,
                ControllerName = matchedUrlRule.KeyValueDic["Controller"],
                ActionName     = matchedUrlRule.KeyValueDic["Action"],
                Request        = req,
                Response       = resp,
                PhysicalPath   = this.PhysicalPath
            };

            return(actionResult.GetHttpBody(ctx));
        }
Пример #22
0
        public virtual void Authenticate(MyHttpRequest request)
        {
            if (!bool.TryParse(WebConfigurationManager.AppSettings["Persona_CheckIpAndCookie"], out bool checkIp) || checkIp)
            {
                if (_user.LastIp != request.UserHostAddress)
                {
                    throw new NotAuthorizedException("Last logged IP address changed");
                }

                if (_user.LastAppCookie != request.Cookies[".AspNet.ApplicationCookie"].Value)
                {
                    throw new NotAuthorizedException("Last cookie changed");
                }
            }

            // Auto logoff - too long inactivity
            if (_user.LastAction == null || (int.TryParse(WebConfigurationManager.AppSettings["Persona_AutoLogoutAfterMin"], out int autoLogoutMin) && _user.LastAction < DateTime.UtcNow - TimeSpan.FromMinutes(autoLogoutMin)))
            {
                throw new LoggedOff("Logged off for inactivity");
            }

            _user.LastAction = DateTime.UtcNow;
        }
Пример #23
0
        private async Task <ProfileKeysLrsResponse> GetProfileKeys(string resource, Dictionary <string, string> queryParams)
        {
            var r = new ProfileKeysLrsResponse();

            var req = new MyHttpRequest
            {
                Method      = "GET",
                Resource    = resource,
                QueryParams = queryParams
            };

            var res = await MakeRequest(req);

            if (res.Status != HttpStatusCode.OK)
            {
                r.Success       = false;
                r.HttpException = res.Ex;
                r.SetErrMsgFromBytes(res.Content);
                return(r);
            }

            r.Success = true;

            var keys = JArray.Parse(Encoding.UTF8.GetString(res.Content));

            if (keys.Count > 0)
            {
                r.Content = new List <string>();
                foreach (var key in keys)
                {
                    r.Content.Add((string)key);
                }
            }

            return(r);
        }
Пример #24
0
        public override bool CanHandle(MyHttpRequest req)
        {
            if (req == null)
            {
                return(false);
            }
            var url         = req.Url;
            var relativeUrl = url.AbsolutePath;

            localPath = string.Format("{0}{1}", PhysicalPath, relativeUrl.Substring(1, relativeUrl.Length - 1).Replace('/', '\\'));

            //浏览器发过来的URL字符串通常会进行编码(尤其对于URL中包含汉字的情况),所以此处要对其进行解码
            localPath = HttpUtility.UrlDecode(localPath);

            var matchedExt = ServerConfig.AcceptedFileTypes.Where(str => Path.GetExtension(localPath).ToLower() == str).FirstOrDefault();

            if (matchedExt == null)
            {
                return(false);
            }
            var isLocalFileExist = File.Exists(localPath);

            return(isLocalFileExist);
        }
Пример #25
0
        private MyHttpRequest GetHttpRequest()
        {
            MyHttpRequest result = new MyHttpRequest();

            if (acceptedSocket == null)
            {
                return(null);
            }
            var bytes         = acceptedSocket.ReceiveConveniently();
            var requestString = Encoding.ASCII.GetString(bytes);
            var lines         = requestString.Split('\r');

            #region 设置Headers
            foreach (var line in lines.Skip(1))
            {
                string temp = line.Trim();
                if (temp == null || temp == "")
                {
                    continue;
                }
                var kvString = temp.Split(new string[] { ": " }, StringSplitOptions.RemoveEmptyEntries);
                if (kvString.Length == 0)
                {
                    continue;
                }
                result.Headers.Add(kvString[0], kvString[1]);
            }
            #endregion

            #region 设置HttpMethod、Url、ProtocolVersion
            var httpMethodLine  = lines[0].Trim();
            var httpMethodLines = httpMethodLine.Split(' ');
            if (httpMethodLines.Length == 3)
            {
                result.HttpMethod = httpMethodLines[0];
                string     hostAndPort = result.Headers["Host"];
                var        strs        = hostAndPort.Split(':');
                UriBuilder b           = new UriBuilder("http", strs[0], int.Parse(strs[1]));
                var        baseUri     = b.Uri;
                var        uri         = new Uri(baseUri, httpMethodLines[1]);
                result.Url = uri;
                try
                {
                    result.ProtocolVersion = new Version(httpMethodLines[2].Replace("HTTP/", ""));
                }
                catch
                { }
            }
            #endregion



            result.RemoteEndPoint = acceptedSocket.RemoteEndPoint as IPEndPoint;

            string body = lines.Last().Trim();
            result.HasEntityBody = body != "";

            #region 设置请求输入流
            Stream ms = new MemoryStream();
            if (body != "")
            {
                var buf = Encoding.ASCII.GetBytes(body);
                ms.Write(buf, 0, buf.Length);
                result.InputStream = ms;
            }
            else
            {
                ms = MemoryStream.Null;
            }
            #endregion

            result.UserAgent = result.Headers["User-Agent"];

            return(result);
        }
Пример #26
0
        public override bool CanHandle(MyHttpRequest req)
        {
            var url = req.Url;

            if (!CheckUrlRules(url))
            {
                return(false);
            }

            #region 已知类名,利用反射获取对应的类
            //MyHttpServer类库被引用到用户项目中以后,需要在用户项目中查找URL指定的控制器类
            var controllerString = matchedUrlRule.KeyValueDic["Controller"] + "Controller";
            var actionString     = matchedUrlRule.KeyValueDic["Action"];

            //用户网站项目编译后的dll路径
            string userDll = string.Format("{0}{1}.dll", PhysicalPath, WebSiteName);
            userAssembly = Assembly.LoadFrom(userDll);

            if (userAssembly == null)
            {
                return(false);
            }
            controllerType = userAssembly.GetTypes().Where(t => t.Name == controllerString).FirstOrDefault();
            #endregion

            #region 已知方法名,获取对应的方法
            var actionMethods = controllerType.GetMethods().Where(m => m.Name == actionString).ToList();

            List <BaseModelBinder> modelBinders = new List <BaseModelBinder>();//Action参数模型绑定器的集合
            modelBinders.Add(new UrlModelBinder(matchedUrlRule, req));
            modelBinders.Add(new BodyModelBinder(req));

            foreach (var act in actionMethods)//遍历所有同名方法
            {
                lock (lockerObj)
                {
                    realParam.Clear();
                    foreach (var binder in modelBinders)
                    {
                        binder.Method = act;
                        var r = binder.Parse();
                        if (r != null)
                        {
                            realParam = r;
                            break;
                        }
                    }
                    if (realParam == null)
                    {
                        continue;
                    }
                    //if (realParam.Count == 0)
                    //    continue;
                    if (act.GetParameters().Length != realParam.Count)
                    {
                        continue;
                    }
                    actionMethod = act;
                    break;
                }
            }
            #endregion

            InitActionResult();

            return(controllerType != null && actionMethod != null);
        }
Пример #27
0
 public BodyModelBinder(MyHttpRequest req, MethodInfo m = null)
     : base(req, m)
 {
     GetBodyData(Req.InputStream);
 }
Пример #28
0
 /// <summary>
 /// 能否解析当前URL
 /// </summary>
 /// <returns></returns>
 public abstract bool CanHandle(MyHttpRequest req);
Пример #29
0
 /// <summary>
 /// 根据HTTP请求,返回响应报文正文字节序列(不用缓存)
 /// </summary>
 /// <param name="req"></param>
 /// <returns></returns>
 public abstract Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp);
Пример #30
0
 /// <summary>
 /// 获取响应报文的正文
 /// 虚方法,默认使用缓存,子类可以重写为不使用缓存
 /// </summary>
 /// <param name="req"></param>
 /// <returns></returns>
 public virtual Stream GetHttpBodyStream(MyHttpRequest req, MyHttpResponse resp)
 {
     return(GetHttpBodyWithCache(req, resp));
 }