private void ResponseStatus(PipeStream pipeStream) { if (Status == RequestStatus.Responding) { var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); if (indexof.EofData != null) { pipeStream.Read(mBuffer, 0, indexof.Length); GetRequestStream().Write(mBuffer, 0, indexof.Length); var result = HttpParse.AnalyzeResponseLine(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); Code = result.Item2; Status = RequestStatus.RespondingHeader; } } }
public bool Login(string name, string pwd, IHttpContext context) { string vpwd = string.Format("{0}{1}", context.Server.ServerConfig.ManagerPWD, context.Request.Cookies[LOGIN_KEY]); vpwd = HttpParse.MD5Encrypt(vpwd); string vname = HttpParse.MD5Encrypt(context.Server.ServerConfig.Manager); if (name == vname && pwd == vpwd) { string tokey = HttpParse.MD5Encrypt(context.Server.ServerConfig.Manager + DateTime.Now.Day + context.Request.Header[HeaderType.CLIENT_IPADDRESS]); context.Response.SetCookie(LOGIN_TOKEN, tokey); context.Response.SetCookie(LOGIN_KEY, ""); return(true); } return(false); }
public static bool LoginProcess(string name, string pwd, IHttpContext context, DateTime?cookieTimeOut) { string vpwd = string.Format("{0}{1}", context.Server.ServerConfig.ManagerPWD, context.Request.Cookies[LOGIN_KEY]); vpwd = HttpParse.MD5Encrypt(vpwd); string vname = HttpParse.MD5Encrypt(context.Server.ServerConfig.Manager); if (name == vname && pwd == vpwd) { string ip = context.Request.RemoteIPAddress.Split(':')[0]; string tokey = HttpParse.MD5Encrypt(context.Server.ServerConfig.Manager + DateTime.Now.Day + ip); context.Response.SetCookie(LOGIN_TOKEN, tokey, cookieTimeOut); context.Response.SetCookie(LOGIN_KEY, ""); return(true); } return(false); }
protected virtual void LoadFile() { int length; System.IO.Stream fsstream; if (InnerResource) { fsstream = Assembly.GetManifestResourceStream(FullName); } else { fsstream = System.IO.File.Open(FullName, FileMode.Open, FileAccess.Read, FileShare.Read); } using (fsstream) { length = (int)fsstream.Length; byte[] buffer = HttpParse.GetByteBuffer(); if (length > 0) { using (System.IO.MemoryStream memory = new MemoryStream()) { using (GZipStream gstream = new GZipStream(memory, CompressionMode.Compress)) { while (length > 0) { int len = fsstream.Read(buffer, 0, buffer.Length); length -= len; gstream.Write(buffer, 0, len); gstream.Flush(); if (length == 0) { Data = memory.ToArray(); } } } } } else { Data = new Byte[0]; } } // fsstream.Close(); Length = Data.Length; }
private string GetResourceUrl(string name) { char[] charname = name.ToCharArray(); List <int> indexs = new List <int>(); for (int i = 0; i < charname.Length; i++) { if (charname[i] == '.') { indexs.Add(i); } } for (int i = 0; i < indexs.Count - 1; i++) { charname[indexs[i]] = '/'; } return(HttpParse.CharToLower(charname)); }
public override void Execute(ActionContext context) { string tokey = context.HttpContext.Request.Cookies[AdminController.LOGIN_TOKEN]; string stokey = HttpParse.MD5Encrypt(context.HttpContext.Server.ServerConfig.Manager + DateTime.Now.Day + context.HttpContext.Request.Header[HeaderType.CLIENT_IPADDRESS]); if (tokey == stokey) { context.Execute(); } else { ActionResult Result = new ActionResult(); Result.Code = 408; context.Result = Result; } }
private void SaveTempFile(System.Reflection.Assembly assembly, string recname, string filename) { using (System.IO.Stream stream = assembly.GetManifestResourceStream(recname)) { byte[] buffer = HttpParse.GetByteBuffer(); int length = (int)stream.Length; using (System.IO.FileStream fs = System.IO.File.Create(filename)) { while (length > 0) { int len = stream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, len); fs.Flush(); length -= len; } } } }
public LoadedState Load(PipeStream stream) { string line; if (mState == LoadedState.None) { if (stream.TryReadWith(HeaderTypeFactory.LINE_BYTES, out line)) { HttpParse.AnalyzeResponseLine(line, this); mState = LoadedState.Method; } } if (mState == LoadedState.Method) { if (Header.Read(stream, Cookies)) { mState = LoadedState.Header; } } if (mState == LoadedState.Header) { if (string.Compare(Header[HeaderTypeFactory.CONNECTION], "close", true) == 0) { this.KeepAlive = false; } if (string.Compare(Header[HeaderTypeFactory.TRANSFER_ENCODING], "chunked", true) == 0) { Chunked = true; } else { string lenstr = Header[HeaderTypeFactory.CONTENT_LENGTH]; int length = 0; if (lenstr != null) { int.TryParse(lenstr, out length); } Length = length; } mState = LoadedState.Completed; } return(mState); }
public override void Execute(ActionContext context) { string tokey = context.HttpContext.Request.Cookies[AdminController.LOGIN_TOKEN]; string ip = context.HttpContext.Request.ClientIPAddress.Split(':')[0]; string stokey = HttpParse.MD5Encrypt(context.HttpContext.Server.ServerConfig.Manager + DateTime.Now.Day + ip); if (tokey == stokey) { context.Execute(); } else { ActionResult Result = new ActionResult(); Result.Code = 403; Result.Data = LoginUrl; context.Result = Result; } }
private void ResponseHeader(PipeStream pipeStream) { PipeStream agentStream = GetRequestStream(); if (Status == RequestStatus.RespondingHeader) { var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); while (indexof.End != null) { pipeStream.Read(mBuffer, 0, indexof.Length); if (indexof.Length == 2) { agentStream.Write(mBuffer, 0, indexof.Length); Status = RequestStatus.RespondingBody; return; } else { var header = HttpParse.AnalyzeHeader(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); if (string.Compare(header.Item1, HeaderTypeFactory.TRANSFER_ENCODING, true) == 0 && string.Compare(header.Item2, "chunked", true) == 0) { mTransferEncoding = true; } if (string.Compare(header.Item1, HeaderTypeFactory.CONTENT_LENGTH, true) == 0) { mRequestLength = int.Parse(header.Item2); } if (string.Compare(header.Item1, HeaderTypeFactory.SERVER, true) == 0) { agentStream.Write(Gateway.GATEWAY_SERVER_HEDER, 0, Gateway.GATEWAY_SERVER_HEDER.Length); } else { agentStream.Write(mBuffer, 0, indexof.Length); } } indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); } } }
public override bool Executing(ActionContext context) { string tokey = context.HttpContext.Request.Cookies[_Admin.LOGIN_TOKEN]; string ip = context.HttpContext.Request.RemoteIPAddress.Split(':')[0]; string stokey = HttpParse.MD5Encrypt(context.HttpContext.Server.ServerConfig.Manager + DateTime.Now.Day + ip); if (tokey == stokey) { return(true); } else { ActionResult Result = new ActionResult(); Result.Code = 403; Result.Data = LoginUrl; context.Result = Result; return(false); } }
public bool Read(PipeStream stream) { while (stream.TryReadLine(out string line)) { if (string.IsNullOrEmpty(line)) { return(true); } if (Code == null) { var result = HttpParse.AnalyzeResponseLine(line.AsSpan()); Code = result.Item2; HttpVersion = result.Item1; Message = result.Item3; } else { var header = HttpParse.AnalyzeHeader(line.AsSpan()); Headers[header.Item1] = header.Item2; } } return(false); }
public static void BindFormUrl(IDataContext context, string data) { context.Add("body", data); HttpParse.AsynczeFromUrlEncoded(data, context); }
public void ProcessFile(HttpRequest request, HttpResponse response) { string url = request.BaseUrl; if (Server.ServerConfig.UrlIgnoreCase) { url = HttpParse.CharToLower(request.BaseUrl); } if (url == "/") { for (int i = 0; i < mDefaultPages.Count; i++) { string defaultpage = url + mDefaultPages[i]; string ext = HttpParse.GetBaseUrlExt(defaultpage); FileContentType fct = null; if (!mExts.TryGetValue(ext, out fct)) { continue; } FileResource fr = GetFileResource(defaultpage); if (fr != null) { OutputFileResource(fct, fr, response); return; } } if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, request.Session, "{0} get {1} file not found", request.ClientIPAddress, request.BaseUrl); } if (!Server.OnHttpRequesNotfound(request, response).Cancel) { NotFoundResult notFound = new NotFoundResult("{0} file not found", request.Url); response.Result(notFound); } return; } if (ExtSupport(request.Ext)) { url = System.Net.WebUtility.UrlDecode(url); FileContentType fct = mExts[request.Ext]; FileResource fr = GetFileResource(url); if (fr != null) { OutputFileResource(fct, fr, response); } else { string file; string fileurl = HttpParse.GetBaseUrl(request.Url); fileurl = System.Net.WebUtility.UrlDecode(fileurl); if (ExistsFile(request, fileurl, out file)) { fr = CreateResource(file, false); if (fr != null) { OutputFileResource(fct, fr, response); } } else { if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, request.Session, "{0} get {1} file not found", request.ClientIPAddress, request.BaseUrl); } if (!Server.OnHttpRequesNotfound(request, response).Cancel) { NotFoundResult notFound = new NotFoundResult("{0} file not found", request.Url); response.Result(notFound); } } } } else { if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, request.Session, "{0} get {1} file ext not support", request.ClientIPAddress, request.BaseUrl); } NotSupportResult notSupport = new NotSupportResult("get {0} file {1} ext not support", request.Url, request.Ext); response.Result(notSupport); } }
public void Load(IDataContext dataContext, HttpRequest request) { if (!string.IsNullOrEmpty(mStartBoundary)) { var stream = request.Stream; if (stream.ReadLine() == mStartBoundary) { string name = null, filename = null, contentType = null; while (stream.TryReadWith(HeaderTypeFactory.LINE_BYTES, out string headerLine)) { if (string.IsNullOrEmpty(headerLine)) { System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); while (true) { IndexOfResult indexOf = stream.IndexOf(HeaderTypeFactory.LINE_BYTES); if (indexOf.End == null) { break; } if (indexOf.Length == mEndBoundary.Length + 2) { byte[] buffer = HttpParse.GetByteBuffer(); stream.Read(buffer, 0, indexOf.Length); string line = Encoding.UTF8.GetString(buffer, 0, indexOf.Length - 2); if (line == mEndBoundary) { CreateParameter(dataContext, request, name, filename, contentType, memoryStream); name = filename = contentType = null; return; } else { memoryStream.Write(buffer, 0, indexOf.Length - 2); } } else if (indexOf.Length == mStartBoundary.Length + 2) { byte[] buffer = HttpParse.GetByteBuffer(); stream.Read(buffer, 0, indexOf.Length); string line = Encoding.UTF8.GetString(buffer, 0, indexOf.Length - 2); if (line == mStartBoundary) { CreateParameter(dataContext, request, name, filename, contentType, memoryStream); name = filename = contentType = null; break; } else { memoryStream.Write(buffer, 0, indexOf.Length - 2); } } else { IMemoryBlock block = indexOf.Start; while (block != null) { int offset = 0; int length = block.Length; if (block.ID == indexOf.Start.ID) { offset = indexOf.StartPostion; } if (block.ID == indexOf.End.ID) { length = indexOf.EndPostion + 1; } memoryStream.Write(block.Data, offset, length - offset); if (block.ID == indexOf.End.ID) { stream.ReadFree(indexOf.Length); break; } else { block = block.NextMemory; } } } } } else { var result = HttpParse.AnalyzeContentHeader(headerLine); if (result.Name == ContentDisposition) { if (result.Properties != null) { for (int i = 0; i < result.Properties.Length; i++) { if (result.Properties[i].Name == "name") { name = result.Properties[i].Value; } else if (result.Properties[i].Name == "filename") { filename = result.Properties[i].Value; } } } } else if (result.Name == ContentType) { contentType = result.Value; } } } } } }
private void OnReadResponseHeader(PipeStream pipeStream) { if (Request.Server.EnableLog(BeetleX.EventArgs.LogType.Info)) { Request.Server.Log(BeetleX.EventArgs.LogType.Info, $"Gateway {Request.ID} {Request.RemoteIPAddress} {Request.Method} {Request.Url} -> {Server.Host}:{Server.Port} response stream reading"); } PipeStream agentStream = GetRequestStream(); if (Status == RequestStatus.RespondingHeader) { mClientAgent.Status = TcpClientAgentStatus.ResponseReciveHeader; var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); while (indexof.End != null) { pipeStream.Read(mBuffer, 0, indexof.Length); if (indexof.Length == 2) { if (Request.VersionNumber == "1.0" && Request.KeepAlive) { agentStream.Write(Gateway.KEEP_ALIVE, 0, Gateway.KEEP_ALIVE.Length); } mResponseHeader.Add(Gateway.GATEWAY_HEADER, Gateway.GATEWAY_VERSION); UrlRoute.Pluginer.HeaderWriting(Request, Response, mResponseHeader); mResponseHeader.Write(agentStream); if (Server.Gateway.OutputServerAddress) { agentStream.Write("Logic-Server: " + Server.ServerName + "\r\n"); } agentStream.Write(mBuffer, 0, indexof.Length); Status = RequestStatus.RespondingBody; if (Request.Server.EnableLog(BeetleX.EventArgs.LogType.Info)) { Request.Server.Log(BeetleX.EventArgs.LogType.Info, $"gateway {Request.ID} {Request.RemoteIPAddress} {Request.Method} {Request.Url} -> {Server.Host}:{Server.Port} response stream read header "); } return; } else { var header = HttpParse.AnalyzeHeader(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); if (string.Compare(header.Item1, HeaderTypeFactory.TRANSFER_ENCODING, true) == 0 && string.Compare(header.Item2, "chunked", true) == 0) { mTransferEncoding = true; } if (string.Compare(header.Item1, HeaderTypeFactory.CONTENT_LENGTH, true) == 0) { mRequestLength = int.Parse(header.Item2); } //if (string.Compare(header.Item1, HeaderTypeFactory.SERVER, true) == 0) //{ // mResponseHeader.Add(HeaderTypeFactory.SERVER, "Bumblebee(BeetleX)"); //} //else //{ mResponseHeader.Add(header.Item1, header.Item2); //} } indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); } } }
public void ProcessFile(HttpRequest request, HttpResponse response) { string url = HttpParse.CharToLower(request.BaseUrl); if (url == "/") { for (int i = 0; i < mDefaultPages.Count; i++) { string defaultpage = url + mDefaultPages[i]; string ext = HttpParse.GetBaseUrlExt(defaultpage); FileContentType fct = null; if (!mExts.TryGetValue(ext, out fct)) { continue; } FileResource fr = GetFileResource(defaultpage); if (fr != null) { OutputFileResource(fct, fr, response); return; } } response.NotFound(); if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, request.Session, "{0} get {1} file not found", request.ClientIPAddress, request.BaseUrl); } return; } if (ExtSupport(request.Ext)) { FileContentType fct = mExts[request.Ext]; FileResource fr = GetFileResource(url); if (fr != null) { OutputFileResource(fct, fr, response); } else { if (ExistsFile(request.BaseUrl)) { string file = GetFile(url); fr = CreateResource(file); if (fr != null) { OutputFileResource(fct, fr, response); } } else { response.NotFound(); if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, request.Session, "{0} get {1} file not found", request.ClientIPAddress, request.BaseUrl); } } } } else { response.NotSupport(); if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, request.Session, "{0} get {1} file not found", request.ClientIPAddress, request.BaseUrl); } } }
public static void BindFormUrl(IDataContext context, ReadOnlySpan <char> data) { HttpParse.AsynczeFromUrlEncoded(data, context); }
internal void Execute(PipeStream stream) { var buffer = HttpParse.GetByteBuffer(); int offset = 0; offset += Encoding.ASCII.GetBytes(Method, 0, Method.Length, buffer, offset); buffer[offset] = HeaderTypeFactory._SPACE_BYTE; offset++; offset += Encoding.ASCII.GetBytes(Url, 0, Url.Length, buffer, offset); if (QuestryString != null && QuestryString.Count > 0) { int i = 0; foreach (var item in this.QuestryString) { string key = item.Key; string value = item.Value; if (string.IsNullOrEmpty(value)) { continue; } value = System.Net.WebUtility.UrlEncode(value); if (i == 0) { buffer[offset] = HeaderTypeFactory._QMARK; offset++; } else { buffer[offset] = HeaderTypeFactory._AND; offset++; } offset += Encoding.ASCII.GetBytes(key, 0, key.Length, buffer, offset); buffer[offset] = HeaderTypeFactory._EQ; offset++; offset += Encoding.ASCII.GetBytes(value, 0, value.Length, buffer, offset); i++; } } buffer[offset] = HeaderTypeFactory._SPACE_BYTE; offset++; offset += Encoding.ASCII.GetBytes(HttpProtocol, 0, HttpProtocol.Length, buffer, offset); buffer[offset] = HeaderTypeFactory._LINE_R; offset++; buffer[offset] = HeaderTypeFactory._LINE_N; offset++; stream.Write(buffer, 0, offset); if (Header != null) { Header.Write(stream); } if (Method == POST || Method == PUT) { if (Body != null) { stream.Write(HeaderTypeFactory.CONTENT_LENGTH_BYTES, 0, 16); MemoryBlockCollection contentLength = stream.Allocate(10); stream.Write(HeaderTypeFactory.TOW_LINE_BYTES, 0, 4); int len = stream.CacheLength; Formater.Serialization(Body, stream); int count = stream.CacheLength - len; contentLength.Full(count.ToString().PadRight(10), stream.Encoding); } else { stream.Write(HeaderTypeFactory.NULL_CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.NULL_CONTENT_LENGTH_BYTES.Length); stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2); } } else { stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2); } }
private void loadChunkedData(PipeStream stream) { Next: string line; if (chunkeLength == 0) { if (!stream.TryReadWith(HeaderTypeFactory.LINE_BYTES, out line)) { return; } chunkeLength = int.Parse(line, System.Globalization.NumberStyles.HexNumber); if (chunkeLength == 0) { stream.ReadFree(2); var item = response; pipeStream.Flush(); item.Stream = pipeStream; response = null; pipeStream = null; Completed?.Invoke(Client, item); return; } response.Length += chunkeLength; } else if (chunkeLength == -1) { if (stream.TryReadWith(HeaderTypeFactory.LINE_BYTES, out line)) { chunkeLength = 0; } else { return; } } if (chunkeLength > 0) { if (pipeStream == null) { pipeStream = new PipeStream(); } while (true) { byte[] buffer = HttpParse.GetByteBuffer(); int count = buffer.Length; if (count > chunkeLength) { count = chunkeLength; } int read = stream.Read(buffer, 0, count); if (read == 0) { return; } pipeStream.Write(buffer, 0, read); chunkeLength -= read; if (chunkeLength == 0) { chunkeLength = -1; break; } } } if (stream.Length > 0) { goto Next; } }
public void ProcessFile(HttpRequest request, HttpResponse response) { FileContentType fct = null; FileResource fr = null; string url = request.BaseUrl; var result = MatchVirtuslFolder(request.BaseUrl); if (result != null) { FileResult fileResult = new FileResult(result); OutputFile(fileResult, request, response); return; } if (url[url.Length - 1] == '/') { for (int i = 0; i < mDefaultPages.Count; i++) { string defaultpage = url + mDefaultPages[i]; string ext = HttpParse.GetBaseUrlExt(defaultpage); if (!mExts.TryGetValue(ext, out fct)) { continue; } fr = GetFileResource(defaultpage); if (fr != null) { OutputFileResource(fct, fr, response); return; } } if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, null, $"HTTP {request.ID} {request.RemoteIPAddress} get {request.Url} file not found"); } if (!Server.OnHttpRequesNotfound(request, response).Cancel) { NotFoundResult notFound = new NotFoundResult("{0} file not found", request.Url); response.Result(notFound); } return; } if (ExtSupport(request.Ext)) { url = System.Net.WebUtility.UrlDecode(url); fct = mExts[request.Ext]; fr = GetFileResource(url); if (!Server.Options.Debug && fr != null) { OutputFileResource(fct, fr, response); } else { string file; string fileurl = HttpParse.GetBaseUrl(request.Url); fileurl = System.Net.WebUtility.UrlDecode(fileurl); if (ExistsFile(request, fileurl, out file)) { fr = CreateResource(file, false); if (fr != null) { OutputFileResource(fct, fr, response); } } else { if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, null, $"HTTP {request.ID} {request.RemoteIPAddress} get {request.Url} file not found"); } if (!Server.OnHttpRequesNotfound(request, response).Cancel) { NotFoundResult notFound = new NotFoundResult("{0} file not found", request.Url); response.Result(notFound); } } } } else { if (Server.EnableLog(EventArgs.LogType.Warring)) { Server.BaseServer.Log(EventArgs.LogType.Warring, null, $"HTTP {request.ID} {request.RemoteIPAddress} get { request.BaseUrl} file ext not support"); } NotSupportResult notSupport = new NotSupportResult("get {0} file {1} ext not support", request.Url, request.Ext); response.Result(notSupport); } }
private void loadChunkedData(PipeStream stream) { Next: string line; if (chunkeLength > 0) { if (pipeStream == null) pipeStream = new PipeStream(); while (true) { byte[] buffer = HttpParse.GetByteBuffer(); int count = buffer.Length; if (count > chunkeLength) count = chunkeLength; int read = stream.Read(buffer, 0, count); if (read == 0) return; pipeStream.Write(buffer, 0, read); chunkeLength -= read; if (chunkeLength == 0) { chunkeLength = 0; break; } } } else { if (!stream.TryReadWith(HeaderTypeFactory.LINE_BYTES, out line)) return; if (string.IsNullOrEmpty(line)) { if (end) { var item = response; pipeStream.Flush(); item.Stream = pipeStream; response = null; pipeStream = null; end = false; Completed?.Invoke(Client, item); return; } else { goto Next; } } else { try { chunkeLength = int.Parse(line, System.Globalization.NumberStyles.HexNumber); if (chunkeLength == 0) { end = true; } else response.Length += chunkeLength; } catch (Exception e_) { throw e_; } } } if (stream.Length > 0) goto Next; }