Beispiel #1
0
 public StreamBufferEnumerator(int id, Stream stream, long streamLen, int chunkSize = BlockSize)
 {
     this.logId = id;
     DiagnoseHelper.CheckArgument(stream, "target stream can not null");
     LogHelper.OnlineLogger.Debug(string.Format("Create stream enumerator, length={0}, chunksize={1}, {2}",
                                                streamLen, chunkSize, HttpLayer.LogRequetId(logId)));
     ChunkSize     = chunkSize;
     targetStreams = new StreamCollection(stream);
     streamLength  = streamLen;
     Reset();
 }
Beispiel #2
0
        public bool MoveNext()
        {
            bool canMoveNext = false;

            try
            {
                ///Reduce new buffer times for background task
                if (Current.IsNullOrEmpty())
                {
                    Current = new byte[ChunkSize];
                }
                else
                {
                    Array.Clear(Current, 0, Current.Length);
                }

                CurrentLength = targetStreams.Read(Current, 0, ChunkSize);
                if (CurrentLength != 0)
                {
                    Offset     += CurrentLength;
                    canMoveNext = true;
                }
                else
                {
                    if (streamLength != -1)
                    {
                        if (Offset < streamLength)
                        {
                            LogHelper.OnlineLogger.Error(string.Format("Cannot read any data before EOF, id={0}. {1}", targetStreams.GetHashCode(), HttpLayer.LogRequetId(logId)));
                            throw new WebException("Cannot read any data before EOF", WebExceptionStatus.UnknownError);
                        }
                        else
                        {
                            LogHelper.OnlineLogger.Debug(string.Format("Reach EOF, id={0}. {1}", targetStreams.GetHashCode(), HttpLayer.LogRequetId(logId)));
                        }
                    }
                    else
                    {
                        LogHelper.OnlineLogger.Warn(string.Format("Cannot read any data, Stream Length = -1, id={0}. {1}", targetStreams.GetHashCode(), HttpLayer.LogRequetId(logId)));
                    }
                }
            }
            catch (EndOfStreamException ex)
            {
                LogHelper.OnlineLogger.Warn(string.Format("Reach end of stream {0}. {1}", ex.ToString(), HttpLayer.LogRequetId(logId)));
            }
            catch (ObjectDisposedException ex)
            {
                LogHelper.OnlineLogger.Warn(string.Format("Can not read disposed stream {0}. {1}" + ex.ToString(), HttpLayer.LogRequetId(logId)));
            }

            return(canMoveNext);
        }
Beispiel #3
0
        internal override void DeseralizeFromStream()
        {
            DiagnoseHelper.CheckReference(ResponseStream, "Can not get response stream");

            ResponseStream.Seek(0, SeekOrigin.Begin);

            ContentTypeEntity ct = new ContentTypeEntity(OriginalResponse.ContentType);

            int contentLen = (int)OriginalResponse.ContentLength;

            //DiagnoseHelper.CheckStringIgnoreCase(ct.ContentType, HttpLayer.JSonContentType, "Login response content type is not correct");
            byte[] buffer = null;
            if (contentLen != -1)
            {
                buffer = new byte[contentLen];

                int leftLen = contentLen;

                while (leftLen != 0)
                {
                    int readLen = ResponseStream.Read(buffer, 0, leftLen);
                    leftLen -= readLen;

                    if (leftLen != 0)
                    {
                        LogHelper.OnlineLogger.Debug("ToDo:: can not read all data in once, need to sleep!" + HttpLayer.LogRequetId(ResponseId));
                    }
                }
            }
            else
            {
                List <byte> buffList   = new List <byte>();
                int         tempBufLen = 10 * 1024;
                byte[]      bufTemp    = new byte[tempBufLen];

                int readLen = 0;
                while ((readLen = ResponseStream.Read(bufTemp, 0, tempBufLen)) != 0)
                {
                    if (readLen == tempBufLen)
                    {
                        buffList.AddRange(bufTemp);
                    }
                    else
                    {
                        buffList.AddRange(bufTemp.Take(readLen));
                    }
                }

                buffer = buffList.ToArray();

                contentLen = buffList.Count;
            }

            string sResult = ct.Encoding.GetString(buffer, 0, contentLen);

            DiagnoseHelper.CheckString(sResult, "Login response content is empty");

            this.Object = JsonConvert.DeserializeObject <JObject>(sResult);
        }