1
- using System . IO ;
1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . IO ;
2
4
using System . Linq ;
3
5
using System . Net ;
4
6
using System . Net . Http ;
@@ -24,8 +26,8 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
24
26
var query = QueryHelpers . ParseQuery ( request . RequestUri . Query ) ;
25
27
26
28
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 ) ;
29
31
}
30
32
}
31
33
return originResponse ;
@@ -41,18 +43,19 @@ public LineSeparatedHttpContent(HttpContent originContent)
41
43
_originContent = originContent ;
42
44
}
43
45
44
- internal StreamReader StreamReader { get ; private set ; }
46
+ internal PeekableStreamReader StreamReader { get ; private set ; }
45
47
46
48
protected override async Task SerializeToStreamAsync ( Stream stream , TransportContext context )
47
49
{
48
50
_originStream = await _originContent . ReadAsStreamAsync ( ) ;
49
51
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
56
59
{
57
60
await writer . WriteAsync ( firstLine ) ;
58
61
await writer . FlushAsync ( ) ;
@@ -64,6 +67,67 @@ protected override bool TryComputeLength(out long length)
64
67
length = 0 ;
65
68
return false ;
66
69
}
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
+ }
67
131
}
68
- }
69
- }
132
+ }
133
+ }
0 commit comments