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(); }
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); }
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); }