예제 #1
0
        /// <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;
            }
        }