1- using System . IO ;
1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . IO ;
24using System . Linq ;
35using System . Net ;
46using System . Net . Http ;
@@ -24,8 +26,8 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
2426 var query = QueryHelpers . ParseQuery ( request . RequestUri . Query ) ;
2527
2628 if ( query . TryGetValue ( "watch" , out var values ) && values . Any ( v => v == "true" ) )
27- {
28- originResponse . Content = new LineSeparatedHttpContent ( originResponse . Content ) ;
29+ {
30+ originResponse . Content = new LineSeparatedHttpContent ( originResponse . Content ) ;
2931 }
3032 }
3133 return originResponse ;
@@ -41,18 +43,19 @@ public LineSeparatedHttpContent(HttpContent originContent)
4143 _originContent = originContent ;
4244 }
4345
44- internal StreamReader StreamReader { get ; private set ; }
46+ internal PeekableStreamReader StreamReader { get ; private set ; }
4547
4648 protected override async Task SerializeToStreamAsync ( Stream stream , TransportContext context )
4749 {
4850 _originStream = await _originContent . ReadAsStreamAsync ( ) ;
4951
50- StreamReader = new StreamReader ( _originStream ) ;
51-
52- var firstLine = await StreamReader . ReadLineAsync ( ) ;
53- var writer = new StreamWriter ( stream ) ;
54-
55- // using (writer) // leave open
52+ StreamReader = new PeekableStreamReader ( _originStream ) ;
53+
54+ var firstLine = await StreamReader . PeekLineAsync ( ) ;
55+
56+ var writer = new StreamWriter ( stream ) ;
57+
58+ // using (writer) // leave open
5659 {
5760 await writer . WriteAsync ( firstLine ) ;
5861 await writer . FlushAsync ( ) ;
@@ -64,6 +67,67 @@ protected override bool TryComputeLength(out long length)
6467 length = 0 ;
6568 return false ;
6669 }
70+ }
71+ internal class PeekableStreamReader : StreamReader
72+ {
73+ private Queue < string > _buffer ;
74+ public PeekableStreamReader ( Stream stream ) : base ( stream )
75+ {
76+ _buffer = new Queue < string > ( ) ;
77+ }
78+
79+ public override string ReadLine ( )
80+ {
81+ if ( _buffer . Count > 0 )
82+ {
83+ return _buffer . Dequeue ( ) ;
84+ }
85+ return base . ReadLine ( ) ;
86+ }
87+ public override Task < string > ReadLineAsync ( )
88+ {
89+ if ( _buffer . Count > 0 )
90+ {
91+ return Task . FromResult ( _buffer . Dequeue ( ) ) ;
92+ }
93+ return base . ReadLineAsync ( ) ;
94+ }
95+ public async Task < string > PeekLineAsync ( )
96+ {
97+ var line = await ReadLineAsync ( ) ;
98+ _buffer . Enqueue ( line ) ;
99+ return line ;
100+ }
101+
102+ public override int Read ( )
103+ {
104+ throw new NotImplementedException ( ) ;
105+ }
106+
107+ public override int Read ( char [ ] buffer , int index , int count )
108+ {
109+ throw new NotImplementedException ( ) ;
110+ }
111+ public override Task < int > ReadAsync ( char [ ] buffer , int index , int count )
112+ {
113+ throw new NotImplementedException ( ) ;
114+ }
115+ public override int ReadBlock ( char [ ] buffer , int index , int count )
116+ {
117+ throw new NotImplementedException ( ) ;
118+ }
119+ public override Task < int > ReadBlockAsync ( char [ ] buffer , int index , int count )
120+ {
121+ throw new NotImplementedException ( ) ;
122+ }
123+ public override string ReadToEnd ( )
124+ {
125+ throw new NotImplementedException ( ) ;
126+ }
127+ public override Task < string > ReadToEndAsync ( )
128+ {
129+ throw new NotImplementedException ( ) ;
130+ }
67131 }
68- }
69- }
132+ }
133+ }
0 commit comments