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