Exemplo n.º 1
0
 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;
         }
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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;
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        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;
            }
        }
Exemplo n.º 7
0
 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;
             }
         }
     }
 }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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;
            }
        }
Exemplo n.º 10
0
        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);
                }
            }
        }
Exemplo n.º 11
0
        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);
            }
        }
Exemplo n.º 12
0
 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);
 }
Exemplo n.º 13
0
 public static void BindFormUrl(IDataContext context, string data)
 {
     context.Add("body", data);
     HttpParse.AsynczeFromUrlEncoded(data, context);
 }
Exemplo n.º 14
0
        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);
            }
        }
Exemplo n.º 15
0
 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;
                     }
                 }
             }
         }
     }
 }
Exemplo n.º 16
0
        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);
                }
            }
        }
Exemplo n.º 17
0
        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);
                }
            }
        }
Exemplo n.º 18
0
 public static void BindFormUrl(IDataContext context, ReadOnlySpan <char> data)
 {
     HttpParse.AsynczeFromUrlEncoded(data, context);
 }
Exemplo n.º 19
0
        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);
            }
        }
Exemplo n.º 20
0
        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;
            }
        }
Exemplo n.º 21
0
        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);
            }
        }
Exemplo n.º 22
0
        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;
        }