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); }
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); }
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); }
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); }
/// <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(); //统一关闭响应流 }
/// <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); }
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); }
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); }
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); }
public override Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp) { resp.StatusCode = (int)HttpStatusCode.OK; resp.StatusDescription = "StaticOK"; var fs = File.OpenRead(localPath); return(fs); }
/// <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); }
public override bool CanHandle(MyHttpRequest req) { localPath = req.GetLocalPath(PhysicalPath); if (localPath == null) { return(false); } var ext = Path.GetExtension(localPath); return(ext.ToLower() == ".php"); }
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)); }
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); }
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"); } } }
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); }
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)); }
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); }
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)); }
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; }
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); }
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); }
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); }
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); }
public BodyModelBinder(MyHttpRequest req, MethodInfo m = null) : base(req, m) { GetBodyData(Req.InputStream); }
/// <summary> /// 能否解析当前URL /// </summary> /// <returns></returns> public abstract bool CanHandle(MyHttpRequest req);
/// <summary> /// 根据HTTP请求,返回响应报文正文字节序列(不用缓存) /// </summary> /// <param name="req"></param> /// <returns></returns> public abstract Stream GetHttpBodyWithoutCache(MyHttpRequest req, MyHttpResponse resp);
/// <summary> /// 获取响应报文的正文 /// 虚方法,默认使用缓存,子类可以重写为不使用缓存 /// </summary> /// <param name="req"></param> /// <returns></returns> public virtual Stream GetHttpBodyStream(MyHttpRequest req, MyHttpResponse resp) { return(GetHttpBodyWithCache(req, resp)); }