11/*----------------------------------------------------------
2- This Source Code Form is subject to the terms of the
3- Mozilla Public License, v.2.0. If a copy of the MPL
4- was not distributed with this file, You can obtain one
2+ This Source Code Form is subject to the terms of the
3+ Mozilla Public License, v.2.0. If a copy of the MPL
4+ was not distributed with this file, You can obtain one
55at http://mozilla.org/MPL/2.0/.
66----------------------------------------------------------*/
77
@@ -25,7 +25,8 @@ class HttpResponseBody : IDisposable
2525
2626 private readonly bool _autoDecompress ;
2727 private long _contentSize = 0 ;
28- private Stream _rawStream ;
28+ private readonly Stream _rawStream ;
29+ private bool _inMemoryResponseInited ;
2930
3031 public HttpResponseBody ( HttpWebResponse response , string dumpToFile )
3132 {
@@ -35,47 +36,59 @@ public HttpResponseBody(HttpWebResponse response, string dumpToFile)
3536 return ;
3637 }
3738
39+ _inMemoryResponseInited = false ;
3840 _rawStream = response . GetResponseStream ( ) ;
3941 _autoDecompress = string . Equals ( response . ContentEncoding , "gzip" , StringComparison . OrdinalIgnoreCase ) ;
4042 _contentSize = _autoDecompress ? - 1 : response . ContentLength ;
4143
4244 if ( ! String . IsNullOrEmpty ( dumpToFile ) )
4345 {
44- InitFileBackedResponse ( response , dumpToFile ) ;
46+ InitFileBackedResponse ( dumpToFile ) ;
4547 }
46- else if ( _autoDecompress )
48+ else if ( _autoDecompress )
4749 {
48- InitInMemoryResponse ( response ) ;
50+ InitInMemoryResponse ( ) ;
4951 }
5052 }
5153
52- private void InitInMemoryResponse ( HttpWebResponse response )
54+ private void InitInMemoryResponse ( )
5355 {
54- if ( _contentSize > INMEMORY_BODY_LIMIT )
56+ if ( _contentSize > INMEMORY_BODY_LIMIT )
5557 {
5658 var filename = Path . GetTempFileName ( ) ;
5759 _backFileIsTemp = true ;
58- InitFileBackedResponse ( response , filename ) ;
60+ InitFileBackedResponse ( filename ) ;
5961 }
6062 else
6163 {
62- if ( _contentSize == UNDEFINED_LENGTH )
64+ if ( _contentSize == UNDEFINED_LENGTH )
6365 {
64- ReadToStream ( response ) ;
66+ ReadToStream ( ) ;
6567 }
6668 else
6769 {
68- ReadToArray ( response ) ;
70+ ReadToArray ( ) ;
6971 }
7072 }
73+ _inMemoryResponseInited = true ;
7174 }
7275
7376 public bool AutoDecompress => _autoDecompress ;
7477
7578 public long ContentSize => _contentSize < 0 ? 0 : _contentSize ;
7679
77- public Stream OpenReadStream ( )
80+ public Stream OpenReadStream ( bool raw = false )
7881 {
82+ if ( raw )
83+ {
84+ return GetResponseStream ( ) ;
85+ }
86+
87+ if ( ! _inMemoryResponseInited )
88+ {
89+ InitInMemoryResponse ( ) ;
90+ }
91+
7992 if ( _backingFileName != null )
8093 {
8194 return new FileStream ( _backingFileName , FileMode . Open , FileAccess . Read ) ;
@@ -85,20 +98,20 @@ public Stream OpenReadStream()
8598 return new MemoryStream ( _inMemBody ) ;
8699 }
87100 else
88- return _rawStream ;
101+ throw new InvalidOperationException ( "No response body" ) ;
89102 }
90103
91- private Stream GetResponseStream ( HttpWebResponse response )
104+ private Stream GetResponseStream ( )
92105 {
93106 if ( _autoDecompress )
94- return new GZipStream ( response . GetResponseStream ( ) , CompressionMode . Decompress ) ;
95- return response . GetResponseStream ( ) ;
107+ return new GZipStream ( _rawStream , CompressionMode . Decompress ) ;
108+ return _rawStream ;
96109 }
97110
98- private void ReadToStream ( HttpWebResponse response )
111+ private void ReadToStream ( )
99112 {
100- using ( var responseStream = GetResponseStream ( response ) )
101- using ( var ms = new MemoryStream ( ) )
113+ using ( var responseStream = GetResponseStream ( ) )
114+ using ( var ms = new MemoryStream ( ) )
102115 {
103116 bool memStreamIsAlive = true ;
104117
@@ -114,7 +127,7 @@ private void ReadToStream(HttpWebResponse response)
114127
115128 readTotal += bytesRead ;
116129
117- if ( readTotal > INMEMORY_BODY_LIMIT )
130+ if ( readTotal > INMEMORY_BODY_LIMIT )
118131 {
119132 var filename = Path . GetTempFileName ( ) ;
120133 _backFileIsTemp = true ;
@@ -130,10 +143,11 @@ private void ReadToStream(HttpWebResponse response)
130143 }
131144
132145 break ;
146+
133147 }
134148 }
135149
136- if ( memStreamIsAlive )
150+ if ( memStreamIsAlive )
137151 {
138152 _inMemBody = new byte [ ms . Length ] ;
139153 ms . Position = 0 ;
@@ -145,11 +159,11 @@ private void ReadToStream(HttpWebResponse response)
145159 }
146160 }
147161
148- private void ReadToArray ( HttpWebResponse response )
162+ private void ReadToArray ( )
149163 {
150164 System . Diagnostics . Debug . Assert ( _contentSize <= INMEMORY_BODY_LIMIT ) ;
151165
152- using var stream = GetResponseStream ( response ) ;
166+ using var stream = GetResponseStream ( ) ;
153167 var mustRead = ( int ) _contentSize ;
154168 _inMemBody = new byte [ mustRead ] ;
155169 int offset = 0 ;
@@ -167,12 +181,12 @@ private void ReadToArray(HttpWebResponse response)
167181 }
168182 }
169183
170- private void InitFileBackedResponse ( HttpWebResponse response , string backingFileName )
184+ private void InitFileBackedResponse ( string backingFileName )
171185 {
172186 _backingFileName = backingFileName ;
173- using ( var responseStream = GetResponseStream ( response ) )
187+ using ( var responseStream = GetResponseStream ( ) )
174188 {
175- using ( var file = new FileStream ( backingFileName , FileMode . Create ) )
189+ using ( var file = new FileStream ( backingFileName , FileMode . Create ) )
176190 {
177191 StreamToStreamCopy ( responseStream , file ) ;
178192 }
@@ -205,9 +219,9 @@ private void Dispose(bool manualDispose)
205219
206220 private void KillTemporaryFile ( )
207221 {
208- if ( _backFileIsTemp && _backingFileName != null )
222+ if ( _backFileIsTemp && _backingFileName != null )
209223 {
210- if ( File . Exists ( _backingFileName ) )
224+ if ( File . Exists ( _backingFileName ) )
211225 {
212226 try
213227 {
@@ -231,4 +245,4 @@ public void Dispose()
231245 Dispose ( false ) ;
232246 }
233247 }
234- }
248+ }
0 commit comments