SslStream发送UTF-8多字节URL编码时%被转义的原因问询
SslStream发送含特殊字符URL时的转义异常
我尝试通过SslStream和StreamWriter发送包含特殊字符的URL GET请求,代码如下:
var req = new HttpRequestMessage( HttpMethod.Get, m_client.BaseAddress ); m_sessionClient.AddSessionInfoTo( req ); var uri = req.RequestUri; var client = new TcpClient( uri.Host, uri.Port ); Stream stream = client.GetStream(); var ssl = new SslStream( stream ); ssl.AuthenticateAsClient( uri.Host ); var writer = new StreamWriter( ssl, new UTF8Encoding( encoderShouldEmitUTF8Identifier: false ) ); await writer.WriteAsync( $"{req.Method.Method} " ); await writer.FlushAsync(); var path = "/echo/%C9%52"; var rawPathAndQuery = Encoding.UTF8.GetBytes( path ); await ssl.WriteAsync( rawPathAndQuery, 0, rawPathAndQuery.Length ); await writer.WriteAsync( " HTTP/1.1\r\nHost: " ); await writer.WriteAsync( req.RequestUri.Host ); await writer.WriteAsync( "\r\n" ); await writer.WriteAsync( "\r\n" ); await writer.FlushAsync();
这段代码预期发送的请求路径是/echo/%C9%52(对应字符ÉR),但通过Wireshark捕获到的实际请求却是GET /echo/%25C9R HTTP/1.1——%C9被转义成了%25C9,相当于%字符本身被URL编码了。
这个问题仅出现在多字节UTF-8场景(即编码值≥%80的字符)中。我想知道导致该行为的原因,不需要解决方案。我查过StreamWriter和SslStream的文档,没有找到任何关于UTF-8转义的相关说明,而且在浏览器中直接访问echo/%C9是可以正常工作的。
内容的提问来源于stack exchange,提问作者AnaCoda
相关产品推荐
相关产品推荐

