示例#1
0
        private void OnEncode(ISession session, object data, System.IO.Stream stream)
        {
            PipeStream            pstream = stream.ToPipeStream();
            MemoryBlockCollection msgsize;

            if (SizeType == FixedSizeType.INT)
            {
                msgsize = pstream.Allocate(4);
            }
            else
            {
                msgsize = pstream.Allocate(2);
            }
            int length = (int)pstream.CacheLength;

            OnWrite(session, data, pstream);
            if (SizeType == FixedSizeType.INT)
            {
                int len = (int)pstream.CacheLength - length;
                if (!pstream.LittleEndian)
                {
                    len = BitHelper.SwapInt32(len);
                }
                msgsize.Full(len);
            }
            else
            {
                short len = (short)(pstream.CacheLength - length);
                if (!pstream.LittleEndian)
                {
                    len = BitHelper.SwapInt16(len);
                }
                msgsize.Full(len);
            }
        }
示例#2
0
        public void Encode(object data, IClient client, Stream stream)
        {
            PipeStream            pstream = stream.ToPipeStream();
            MemoryBlockCollection msgsize;

            if (SizeType == FixedSizeType.INT)
            {
                msgsize = pstream.Allocate(4);
            }
            else
            {
                msgsize = pstream.Allocate(2);
            }
            int length = (int)pstream.CacheLength;

            OnWrite(data, client, pstream);
            if (SizeType == FixedSizeType.INT)
            {
                int len = (int)pstream.CacheLength - length;
                if (!pstream.LittleEndian)
                {
                    len = BitHelper.SwapInt32(len);
                }
                msgsize.Full(len);
            }
            else
            {
                short len = (short)(pstream.CacheLength - length);
                if (!pstream.LittleEndian)
                {
                    len = BitHelper.SwapInt16(len);
                }
                msgsize.Full(len);
            }
        }
示例#3
0
        public async Task fortunes(PipeStream stream, HttpToken token, ISession session)
        {
            try
            {
                var data = await token.Db.LoadFortunesRows();

                stream.Write(_HtmlResultPreamble.Data, 0, _HtmlResultPreamble.Length);
                token.ContentLength = stream.Allocate(HttpHandler._LengthSize);
                GMTDate.Default.Write(stream);
                token.ContentPostion = stream.CacheLength;

                var html = token.GetHtmlBufferWriter();
                html.Reset();
                html.Write(_fortunesTableStart.Data, 0, _fortunesTableStart.Length);
                foreach (var item in data)
                {
                    html.Write(_fortunesRowStart.Data, 0, _fortunesRowStart.Length);
                    WriteNumeric(html, (uint)item.Id);
                    html.Write(_fortunesColumn.Data, 0, _fortunesColumn.Length);
                    html.Write(HtmlEncoder.Encode(item.Message));
                    html.Write(_fortunesRowEnd.Data, 0, _fortunesRowEnd.Length);
                }
                html.Write(_fortunesTableEnd.Data, 0, _fortunesTableEnd.Length);
                stream.Write(html.Data, 0, html.Length);
            }
            catch (Exception e_)
            {
                HttpServer.ApiServer.Log(BeetleX.EventArgs.LogType.Error, null, $"fortunes error {e_.Message}@{e_.StackTrace}");
                stream.Write(e_.Message);
            }
            OnCompleted(stream, session, token);
        }
示例#4
0
 private void OnWriteContentLength(PipeStream stream, HttpToken token)
 {
     stream.Write(_headerContentLength.Data, 0, _headerContentLength.Length);
     token.ContentLength = stream.Allocate(10);
     stream.Write(_2line, 0, 4);
     token.ContentPostion = stream.CacheLength;
 }
示例#5
0
        protected override void OnWrite(ISession session, object data, PipeStream writer)
        {
            TypeHeader.WriteType(data, writer);
            MemoryBlockCollection bodysize = writer.Allocate(4);
            int bodyStartlegnth            = (int)writer.CacheLength;

            ProtoBuf.Meta.RuntimeTypeModel.Default.Serialize(writer, data);
            bodysize.Full((int)writer.CacheLength - bodyStartlegnth);
        }
 public Task Default(PipeStream stream, HttpToken token, ISession session)
 {
     stream.Write(_defaultPreamble.Data, 0, _defaultPreamble.Length);
     token.ContentLength = stream.Allocate(HttpHandler._LengthSize);
     GMTDate.Default.Write(stream);
     token.ContentPostion = stream.CacheLength;
     stream.Write("<b> beetlex server</b><hr/>");
     stream.Write("path not found!");
     OnCompleted(stream, session, token);
     return(Task.CompletedTask);
 }
示例#7
0
        public void Execute(PipeStream stream)
        {
            stream.Write(Method + " ");
            stream.Write(Url);
            if (QuestryString != null && QuestryString.Count > 0)
            {
                int i = 0;
                foreach (var item in this.QuestryString)
                {
                    if (i == 0)
                    {
                        stream.Write("?");
                    }
                    else
                    {
                        stream.Write("&");
                    }
                    stream.Write(item.Key + "=");
                    stream.Write(System.Net.WebUtility.UrlEncode(item.Value));
                    i++;
                }
            }
            stream.Write(HeaderTypeFactory.SPACE_BYTES, 0, 1);
            stream.Write(this.HttpProtocol);
            stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);

            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);
            }
        }
示例#8
0
        internal void Write(PipeStream stream)
        {
            string stateLine = string.Concat(HttpVersion, " ", mCode, " ", mCodeMsg);

            stream.WriteLine(stateLine);
            Header.Write(stream);
            MemoryBlockCollection contentLength = stream.Allocate(28);

            stream.WriteLine("");
            int count = Serializer.Serialize(stream, mBody);

            contentLength.Full("Content-Length: " + count.ToString().PadRight(10) + "\r\n", stream.Encoding);
        }
示例#9
0
 public void Encode(Options rpcOption, object data, PipeStream stream)
 {
     if (data == null)
     {
         stream.Write(0);
     }
     else
     {
         var head    = stream.Allocate(4);
         var postion = stream.CacheLength;
         MessagePackSerializer.Serialize(data.GetType(), stream, data);
         head.Full(stream.CacheLength - postion);
     }
 }
示例#10
0
文件: RPCPacket.cs 项目: zhouzu/XRPC
        public void Write(Options rpcOption, PipeStream stream)
        {
            mOption = rpcOption;
            try
            {
                var  head    = stream.Allocate(4);
                var  postion = stream.CacheLength;
                uint id      = (uint)ID;
                if (NeedReply)
                {
                    id |= 1 << 30;
                }
                stream.Write(id);
                stream.WriteShortUTF(Url);
                stream.Write(Status);
                if (Header != null)
                {
                    stream.Write((byte)Header.Count);
                    foreach (var item in Header)
                    {
                        stream.WriteShortUTF(item.Key);
                        stream.WriteShortUTF(item.Value);
                    }
                }
                else
                {
                    stream.Write((byte)0);
                }

                if (Data != null)
                {
                    stream.Write((byte)Data.Length);
                    for (int i = 0; i < Data.Length; i++)
                    {
                        rpcOption.ParameterFormater.Encode(rpcOption, Data[i], stream);
                    }
                }
                else
                {
                    stream.Write((byte)0);
                }

                head.Full(stream.CacheLength - postion);
            }
            catch (Exception e_)
            {
                throw new BXException($"Write protocol data error {e_.Message}", e_);
            }
        }
示例#11
0
 public void Encode(Options rpcOption, object data, PipeStream stream)
 {
     if (data == null)
     {
         stream.Write(0);
     }
     else
     {
         var    head    = stream.Allocate(4);
         var    postion = stream.CacheLength;
         string txt     = Newtonsoft.Json.JsonConvert.SerializeObject(data);
         stream.Write(txt);
         head.Full(stream.CacheLength - postion);
     }
 }
示例#12
0
        private void OnEncode(ISession session, object data, System.IO.Stream stream)
        {
            PipeStream            pstream = stream.ToPipeStream();
            MemoryBlockCollection msgsize = pstream.Allocate(4);
            int length = (int)pstream.CacheLength;

            OnWrite(session, data, pstream);
            if (SizeType == FixedSizeType.INT)
            {
                msgsize.Full((int)pstream.CacheLength - length);
            }
            else
            {
                msgsize.Full((Int16)pstream.CacheLength - length);
            }
        }
示例#13
0
        public void Encode(object data, IClient client, Stream stream)
        {
            PipeStream            pstream = stream.ToPipeStream();
            MemoryBlockCollection msgsize = pstream.Allocate(4);
            int length = (int)pstream.CacheLength;

            OnWrite(data, client, pstream);
            if (SizeType == FixedSizeType.INT)
            {
                msgsize.Full((int)pstream.CacheLength - length);
            }
            else
            {
                msgsize.Full((Int16)pstream.CacheLength - length);
            }
        }
示例#14
0
        internal void Write(PipeStream stream)
        {
            stream.Write(HttpVersion);
            stream.Write(HeaderType.SPACE_BYTES[0]);
            stream.Write(mCode);
            stream.Write(HeaderType.SPACE_BYTES[0]);
            stream.Write(CodeMsg);
            stream.Write(HeaderType.LINE_BYTES);
            Header.Write(stream);
            for (int i = 0; i < mSetCookies.Count; i++)
            {
                HeaderType.Write(HeaderType.SET_COOKIE, stream);
                stream.Write(mSetCookies[i]);
                stream.Write(HeaderType.LINE_BYTES);
            }
            if (mBody != null)
            {
                StaticResurce.FileBlock fb = mBody as StaticResurce.FileBlock;
                if (fb != null)
                {
                    stream.Write(HeaderType.LINE_BYTES);
                    fb.Write(stream);
                }
                else
                {
                    MemoryBlockCollection contentLength = stream.Allocate(28);
                    stream.Write(HeaderType.LINE_BYTES);
                    int count = Serializer.Serialize(stream, mBody);
                    contentLength.Full("Content-Length: " + count.ToString().PadRight(10) + "\r\n", stream.Encoding);
                }
            }
            else
            {
                stream.Write(HeaderType.NULL_CONTENT_LENGTH_BYTES);
                stream.Write(HeaderType.LINE_BYTES);
            }

            if (Session.Server.EnableLog(EventArgs.LogType.Debug))
            {
                Session.Server.Log(EventArgs.LogType.Debug, Session, "{0} {1}", Request.ClientIPAddress, this.ToString());
            }

            if (Session.Server.EnableLog(EventArgs.LogType.Info))
            {
                Session.Server.Log(EventArgs.LogType.Info, Session, "{4} {0} {1} response {2} {3}", Request.Method, Request.Url, Code, CodeMsg, Request.ClientIPAddress);
            }
        }
示例#15
0
        public async ValueTask db(PipeStream stream, HttpToken token, ISession session)
        {
            try
            {
                var data = await token.Db.LoadSingleQueryRow();

                stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length);
                token.ContentLength = stream.Allocate(HttpHandler._LengthSize);
                GMTDate.Default.Write(stream);
                token.ContentPostion = stream.CacheLength;
                System.Text.Json.JsonSerializer.Serialize <World>(GetUtf8JsonWriter(stream, token), data, SerializerOptions);
            }
            catch (Exception e_)
            {
                HttpServer.ApiServer.Log(BeetleX.EventArgs.LogType.Error, null, $"db error {e_.Message}@{e_.StackTrace}");
                stream.Write(e_.Message);
            }
            OnCompleted(stream, session, token);
        }
示例#16
0
        public async ValueTask updates(string queryString, PipeStream stream, HttpToken token, ISession session)
        {
            int count = 1;

            if (!string.IsNullOrEmpty(queryString))
            {
                var values = queryString.Split('=');
                if (values.Length > 1)
                {
                    if (int.TryParse(values[1], out int size))
                    {
                        count = size;
                    }
                }
            }
            if (count > 500)
            {
                count = 500;
            }
            if (count < 1)
            {
                count = 1;
            }
            try
            {
                var data = await token.Db.LoadMultipleUpdatesRows(count);

                stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length);
                token.ContentLength = stream.Allocate(HttpHandler._LengthSize);
                GMTDate.Default.Write(stream);
                token.ContentPostion = stream.CacheLength;
                System.Text.Json.JsonSerializer.Serialize <World[]>(GetUtf8JsonWriter(stream, token), data, SerializerOptions);
            }
            catch (Exception e_)
            {
                HttpServer.ApiServer.Log(BeetleX.EventArgs.LogType.Error, null, $"updates error {e_.Message}@{e_.StackTrace}");
                stream.Write(e_.Message);
            }
            OnCompleted(stream, session, token);
        }
示例#17
0
        private void OnWriteContentLength(PipeStream stream, HttpToken token)
        {
            var action = token.CurrentRequest.Action;

            if (action == ActionType.Json)
            {
                stream.Write(_jsonPreamble.Data, 0, _jsonPreamble.Length);
                stream.Write(_2line, 0, 4);
            }
            else if (action == ActionType.Plaintext)
            {
                stream.Write(_plaintextPreamble.Data, 0, _plaintextPreamble.Length);
                stream.Write(_2line, 0, 4);
            }
            else
            {
                stream.Write(_headerContentLength.Data, 0, _headerContentLength.Length);
                token.ContentLength = stream.Allocate(HttpHandler._LengthSize);
                stream.Write(_2line, 0, 4);
                token.ContentPostion = stream.CacheLength;
            }
        }
示例#18
0
 void IDataResponse.Write(PipeStream stream)
 {
     if (GZip)
     {
         var mb = stream.Allocate(16);
         stream.Write(HeaderTypeFactory.LINE_BYTES);
         int len = stream.CacheLength;
         if (gZipStream == null)
         {
             gZipStream = new GZipStream(stream, CompressionMode.Compress, true);
         }
         gZipStream.Write(Data.Array, Data.Offset, Data.Count);
         gZipStream.Flush();
         if (Offset == mFileResource.Length)
         {
             if (gZipStream != null)
             {
                 using (stream.LockFree())
                 {
                     gZipStream.Dispose();
                 }
             }
         }
         string lenstr = (stream.CacheLength - len).ToString("X");
         mb.Full(Encoding.UTF8.GetBytes(lenstr.PadRight(16)));
     }
     else
     {
         int len = Data.Count;
         stream.Write(len.ToString("X"));
         stream.Write(HeaderTypeFactory.LINE_BYTES);
         stream.Write(Data.Array, Data.Offset, Data.Count);
     }
     stream.WriteLine("");
     if (Offset == mFileResource.Length)
     {
         stream.Write(HeaderTypeFactory.CHUNKED_BYTES);
     }
 }
        public async Task caching(string queryString, PipeStream stream, HttpToken token, ISession session)
        {
            int count = 1;

            if (!string.IsNullOrEmpty(queryString))
            {
                var values = queryString.Split('=');
                if (values.Length > 1)
                {
                    if (int.TryParse(values[1], out int size))
                    {
                        count = size;
                    }
                }
            }
            if (count > 500)
            {
                count = 500;
            }
            if (count < 1)
            {
                count = 1;
            }
            try
            {
                var data = await token.Db.LoadCachedQueries(count);

                stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length);
                token.ContentLength = stream.Allocate(HttpHandler._LengthSize);
                GMTDate.Default.Write(stream);
                token.ContentPostion = stream.CacheLength;
                await JsonSerializer.NonGeneric.Utf8.SerializeAsync(data, stream);
            }
            catch (Exception e_)
            {
                stream.Write(e_.Message);
            }
            OnCompleted(stream, session, token);
        }
示例#20
0
 internal void Write(PipeStream stream)
 {
     stream.Write(HttpVersion);
     stream.Write(HeaderType.SPACE_BYTES[0]);
     stream.Write(mCode);
     stream.Write(HeaderType.SPACE_BYTES[0]);
     stream.Write(CodeMsg);
     stream.Write(HeaderType.LINE_BYTES);
     Header.Write(stream);
     for (int i = 0; i < mSetCookies.Count; i++)
     {
         HeaderType.Write(HeaderType.SET_COOKIE, stream);
         stream.Write(mSetCookies[i]);
         stream.Write(HeaderType.LINE_BYTES);
     }
     if (mBody != null)
     {
         StaticResurce.FileBlock fb = mBody as StaticResurce.FileBlock;
         if (fb != null)
         {
             stream.Write(HeaderType.LINE_BYTES);
             fb.Write(stream);
         }
         else
         {
             MemoryBlockCollection contentLength = stream.Allocate(28);
             stream.Write(HeaderType.LINE_BYTES);
             int count = Serializer.Serialize(stream, mBody);
             contentLength.Full("Content-Length: " + count.ToString().PadRight(10) + "\r\n", stream.Encoding);
         }
     }
     else
     {
         stream.Write(HeaderType.NULL_CONTENT_LENGTH_BYTES);
         stream.Write(HeaderType.LINE_BYTES);
     }
 }
示例#21
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);
            }
        }
示例#22
0
        private void OnWrite(PipeStream stream)
        {
            IResult result = mBody as IResult;

            if (result != null)
            {
                result.Setting(this);
            }
            byte[] buffer = HttpParse.GetByteBuffer();
            int    hlen   = 0;

            hlen         = hlen + Encoding.ASCII.GetBytes(HttpVersion, 0, HttpVersion.Length, buffer, hlen);
            buffer[hlen] = HeaderTypeFactory._SPACE_BYTE;
            hlen++;
            hlen         = hlen + Encoding.ASCII.GetBytes(Code, 0, Code.Length, buffer, hlen);
            buffer[hlen] = HeaderTypeFactory._SPACE_BYTE;
            hlen++;
            hlen = hlen + Encoding.ASCII.GetBytes(CodeMsg, 0, CodeMsg.Length, buffer, hlen);

            buffer[hlen] = HeaderTypeFactory._LINE_R;
            hlen++;
            buffer[hlen] = HeaderTypeFactory._LINE_N;
            hlen++;

            stream.Write(buffer, 0, hlen);
            stream.Write(HeaderTypeFactory.SERVAR_HEADER_BYTES, 0, HeaderTypeFactory.SERVAR_HEADER_BYTES.Length);
            Header.Write(stream);
            if (result != null)
            {
                result.ContentType.Write(stream);
            }
            var datebuffer = GMTDate.Default.DATE;

            stream.Write(datebuffer.Array, 0, datebuffer.Count);

            for (int i = 0; i < mSetCookies.Count; i++)
            {
                HeaderTypeFactory.Write(HeaderTypeFactory.SET_COOKIE, stream);
                stream.Write(mSetCookies[i]);
                stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);
            }
            if (mBody != null)
            {
                if (mBody is IDataResponse dataResponse)
                {
                    stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);
                    dataResponse.Write(stream);
                }
                else
                {
                    if (result.HasBody)
                    {
                        if (result.Length > 0)
                        {
                            stream.Write(HeaderTypeFactory.CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.CONTENT_LENGTH_BYTES.Length);
                            stream.Write(result.Length.ToString());
                            stream.Write(HeaderTypeFactory.TOW_LINE_BYTES, 0, 4);
                            result.Write(stream, this);
                        }
                        else
                        {
                            stream.Write(HeaderTypeFactory.CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.CONTENT_LENGTH_BYTES.Length);
                            MemoryBlockCollection contentLength = stream.Allocate(10);
                            stream.Write(HeaderTypeFactory.TOW_LINE_BYTES, 0, 4);
                            int len = stream.CacheLength;
                            result.Write(stream, this);
                            int count = stream.CacheLength - len;
                            // contentLength.Full(count.ToString().PadRight(10), stream.Encoding);
                            contentLength.Full(GetLengthBuffer(count.ToString()));
                        }
                    }
                    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.NULL_CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.NULL_CONTENT_LENGTH_BYTES.Length);
                stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);
            }

            if (Session.Server.EnableLog(EventArgs.LogType.Debug))
            {
                Session.Server.Log(EventArgs.LogType.Debug, Session, "{0} {1}", Request.RemoteIPAddress, this.ToString());
            }

            if (Session.Server.EnableLog(EventArgs.LogType.Info))
            {
                Session.Server.Log(EventArgs.LogType.Info, Session, "{4} {0} {1} response {2} {3}", Request.Method, Request.Url, Code, CodeMsg, Request.RemoteIPAddress);
            }
        }
示例#23
0
        internal void Write(PipeStream stream)
        {
            IResult result = mBody as IResult;

            if (result != null)
            {
                this.Header[HeaderTypeFactory.CONTENT_TYPE] = result.ContentType;
                result.Setting(this);
            }

            byte[] buffer = HttpParse.GetByteBuffer();
            //string line = string.Concat(HttpVersion, " ", mCode, " ", CodeMsg, "\r\n");
            //var hlen = Encoding.ASCII.GetBytes(line, 0, line.Length, buffer, 0);
            int hlen = 0;

            hlen         = hlen + Encoding.ASCII.GetBytes(HttpVersion, 0, HttpVersion.Length, buffer, hlen);
            buffer[hlen] = HeaderTypeFactory._SPACE_BYTE;
            hlen++;
            hlen         = hlen + Encoding.ASCII.GetBytes(mCode, 0, mCode.Length, buffer, hlen);
            buffer[hlen] = HeaderTypeFactory._SPACE_BYTE;
            hlen++;
            hlen = hlen + Encoding.ASCII.GetBytes(CodeMsg, 0, CodeMsg.Length, buffer, hlen);

            buffer[hlen] = HeaderTypeFactory._LINE_R;
            hlen++;
            buffer[hlen] = HeaderTypeFactory._LINE_N;
            hlen++;

            stream.Write(buffer, 0, hlen);
            stream.Write(HeaderTypeFactory.SERVAR_HEADER_BYTES, 0, HeaderTypeFactory.SERVAR_HEADER_BYTES.Length);
            Header.Write(stream);
            for (int i = 0; i < mSetCookies.Count; i++)
            {
                HeaderTypeFactory.Write(HeaderTypeFactory.SET_COOKIE, stream);
                stream.Write(mSetCookies[i]);
                stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);
            }
            if (mBody != null)
            {
                StaticResurce.FileBlock fb = mBody as StaticResurce.FileBlock;
                if (fb != null)
                {
                    stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);
                    fb.Write(stream);
                }
                else
                {
                    if (result.HasBody)
                    {
                        if (result.Length > 0)
                        {
                            stream.Write(HeaderTypeFactory.CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.CONTENT_LENGTH_BYTES.Length);
                            stream.Write(result.Length.ToString());
                            stream.Write(HeaderTypeFactory.TOW_LINE_BYTES, 0, 4);
                            result.Write(stream, this);
                        }
                        else
                        {
                            stream.Write(HeaderTypeFactory.CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.CONTENT_LENGTH_BYTES.Length);
                            MemoryBlockCollection contentLength = stream.Allocate(10);
                            stream.Write(HeaderTypeFactory.TOW_LINE_BYTES, 0, 4);
                            int len = stream.CacheLength;
                            result.Write(stream, this);
                            int count = stream.CacheLength - len;
                            //contentLength.Full("Content-Length: " + count.ToString().PadRight(10) + "\r\n\r\n", stream.Encoding);
                            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.NULL_CONTENT_LENGTH_BYTES, 0, HeaderTypeFactory.NULL_CONTENT_LENGTH_BYTES.Length);
                stream.Write(HeaderTypeFactory.LINE_BYTES, 0, 2);
            }

            if (Session.Server.EnableLog(EventArgs.LogType.Debug))
            {
                Session.Server.Log(EventArgs.LogType.Debug, Session, "{0} {1}", Request.ClientIPAddress, this.ToString());
            }

            if (Session.Server.EnableLog(EventArgs.LogType.Info))
            {
                Session.Server.Log(EventArgs.LogType.Info, Session, "{4} {0} {1} response {2} {3}", Request.Method, Request.Url, Code, CodeMsg, Request.ClientIPAddress);
            }
        }