StreamReader がバッファリングを行わないようにする方法はありますか?
バイナリまたはテキストの可能性がある Process からの出力を処理しようとしています。出力は HTTP レスポンスのようになります。
Content-type: application/whatever
Another-header: value
text or binary data here
私がやりたいことは、 を使用してヘッダーを解析し、StreamReader
そのBaseStream
かから読み取りStreamReader
、残りのコンテンツを処理することです。基本的に私が始めたのは次のとおりです。
private static readonly Regex HttpHeader = new Regex("([^:]+): *(.*)");
private void HandleOutput(StreamReader reader)
{
var headers = new NameValueCollection();
string line;
while((line = reader.ReadLine()) != null)
{
Match header = HttpHeader.Match(line);
if(header.Success)
{
headers.Add(header.Groups[1].Value, header.Groups[2].Value);
}
else
{
break;
}
}
DoStuff(reader.ReadToEnd());
}
これはバイナリデータを破壊するようです。そこで、最後の行を次のように変更しました。
if(headers["Content-type"] != "text/html")
{
// reader.BaseStream.Position is not at the same place that reader
// makes it looks like it is.
// i.e. reader.Read() != reader.BaseStream.Read()
DoBinaryStuff(reader.BaseStream);
}
else
{
DoTextStuff(reader.ReadToEnd());
}
...しかし、StreamReader はその入力をバッファリングするため、reader.BaseStream は間違った位置にあります。StreamReader のバッファを解除する方法はありますか? または、StreamReader にストリームをリセットして StreamReader がある場所に戻すように指示できますか?