/// <summary> /// Response 정보를 byte array로 변환한다. /// </summary> /// <remarks> /// 길이가 아주 길고, 실제 크기를 알 수 없을 때 Response 개체의 stream을 처리하는 로직이 있음. /// </remarks> /// <param name="response"></param> /// <returns></returns> public static byte[] ResponseToArray(WebResponse response) { response.ShouldNotBeNull("response"); if(IsDebugEnabled) log.Debug("Convert content of WebResponse to byte array..."); using(var stream = response.GetResponseStream()) { stream.ShouldNotBeNull("ResponseStream"); // 길이를 알 수 없을 때 사용한다. var length = response.ContentLength; if(length == 0) return new byte[0]; var flag = false; // 실제 크기를 알지 못할 때, 기본 크기로 계속 늘리기 위해 // if(length == -1) { flag = true; length = HttpConsts.DEFAULT_BUFFER_LENGTH; } var buffer = new byte[(uint)(int)length]; var offset = 0; int readCount; while((readCount = stream.Read(buffer, offset, (int)length - offset)) > 0) { offset += readCount; if(flag && (offset == length)) { length += HttpConsts.DEFAULT_BUFFER_LENGTH; var buffer2 = new byte[(uint)(int)length]; Buffer.BlockCopy(buffer, 0, buffer2, 0, offset); buffer = buffer2; } } //do //{ // readCount = stream.Read(buffer, offset, (int) length - offset); // offset += readCount; // // stream의 크기가 기본 크기보다 더 크므로 버퍼의 크기를 늘린다. // if(flag && (offset == length)) // { // length += HttpConsts.DEFAULT_BUFFER_LENGTH; // var buffer2 = new byte[(uint) (int) length]; // Buffer.BlockCopy(buffer, 0, buffer2, 0, offset); // buffer = buffer2; // } //} while(readCount != 0); stream.Close(); // 실제 크기를 알 수 없으므로 남아있는 여분의 Array를 제거한다. if(flag) { var tmpBuffer = new byte[(uint)offset]; Buffer.BlockCopy(buffer, 0, tmpBuffer, 0, offset); buffer = tmpBuffer; } return buffer; } }