11namespace Microsoft . Net . Http . Client ;
22
33using System ;
4+ using System . IO ;
45
56public class ManagedHandler : HttpMessageHandler
67{
@@ -172,7 +173,7 @@ private async Task<HttpResponseMessage> ProcessRequestAsync(HttpRequestMessage r
172173
173174 if ( request . IsHttps ( ) )
174175 {
175- SslStream sslStream = new SslStream ( transport , false , ServerCertificateValidationCallback ) ;
176+ SslStream sslStream = new SslStream ( new BlockZeroByteReadsStream ( transport ) , false , ServerCertificateValidationCallback ) ;
176177 await sslStream . AuthenticateAsClientAsync ( request . GetHostProperty ( ) , ClientCertificates , SslProtocols . Tls12 , false ) ;
177178 transport = sslStream ;
178179 }
@@ -384,4 +385,72 @@ private async Task TunnelThroughProxyAsync(HttpRequestMessage request, Stream tr
384385 throw new HttpRequestException ( "Failed to negotiate the proxy tunnel: " + connectResponse ) ;
385386 }
386387 }
388+
389+ internal sealed class BlockZeroByteReadsStream : Stream
390+ {
391+ public override bool CanRead
392+ {
393+ get { return innerStream . CanRead ; }
394+ }
395+
396+ public override bool CanSeek
397+ {
398+ get { return innerStream . CanSeek ; }
399+ }
400+
401+ public override bool CanWrite
402+ {
403+ get { return innerStream . CanWrite ; }
404+ }
405+
406+ public override long Length
407+ {
408+ get { return innerStream . Length ; }
409+ }
410+
411+ public override long Position
412+ {
413+ get { return innerStream . Position ; }
414+ set { innerStream . Position = value ; }
415+ }
416+
417+ private Stream innerStream ;
418+
419+ public BlockZeroByteReadsStream ( Stream stream )
420+ {
421+ innerStream = stream ;
422+ }
423+
424+ public override Task < int > ReadAsync ( byte [ ] buffer , int offset , int count , CancellationToken cancellationToken )
425+ {
426+ if ( count == 0 ) return Task . FromResult ( 0 ) ;
427+ return innerStream . ReadAsync ( buffer , offset , count , cancellationToken ) ;
428+ }
429+
430+ public override int Read ( byte [ ] buffer , int offset , int count )
431+ {
432+ if ( count == 0 ) return 0 ;
433+ return innerStream . Read ( buffer , offset , count ) ;
434+ }
435+
436+ public override void Flush ( )
437+ {
438+ innerStream . Flush ( ) ;
439+ }
440+
441+ public override long Seek ( long offset , SeekOrigin origin )
442+ {
443+ return innerStream . Seek ( offset , origin ) ;
444+ }
445+
446+ public override void SetLength ( long value )
447+ {
448+ innerStream . SetLength ( value ) ;
449+ }
450+
451+ public override void Write ( byte [ ] buffer , int offset , int count )
452+ {
453+ innerStream . Write ( buffer , offset , count ) ;
454+ }
455+ }
387456}
0 commit comments