@@ -64,7 +64,7 @@ namespace Shadowsocks.Controller.Service
|
||||
Close();
|
||||
}
|
||||
|
||||
private static readonly Regex HttpRequestHeaderRegex = new Regex(@"^([A-Z]+?) ([^\s]+) HTTP/1\.\d$");
|
||||
private static readonly Regex HttpRequestHeaderRegex = new Regex(@"^(?<method>[A-Z]+?) (?<path>[^\s]+) (?<tail>HTTP/1\.\d)$");
|
||||
|
||||
private int _requestLineCount = 0;
|
||||
private bool _isConnect = false;
|
||||
@@ -101,31 +101,57 @@ namespace Shadowsocks.Controller.Service
|
||||
|
||||
Logging.Debug(line);
|
||||
|
||||
if (!line.StartsWith("Proxy-"))
|
||||
{
|
||||
_headers.Enqueue(line);
|
||||
}
|
||||
|
||||
if (_requestLineCount == 0)
|
||||
{
|
||||
var m = HttpRequestHeaderRegex.Match(line);
|
||||
if (m.Success)
|
||||
{
|
||||
var method = m.Groups[1].Value;
|
||||
var method = m.Groups["method"].Value;
|
||||
var path = m.Groups["path"].Value;
|
||||
|
||||
if (method == "CONNECT")
|
||||
{
|
||||
_isConnect = true;
|
||||
|
||||
if (!ParseHost(m.Groups[2].Value))
|
||||
if (!ParseHost(path))
|
||||
{
|
||||
throw new Exception("Bad http header: " + line);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var targetUrl = new Uri(path);
|
||||
|
||||
if (!ParseHost(targetUrl.Authority))
|
||||
{
|
||||
throw new Exception("Bad http header: " + line);
|
||||
}
|
||||
|
||||
var newRequestLine = $"{method} {targetUrl.PathAndQuery} {m.Groups["tail"].Value}";
|
||||
_headers.Enqueue(newRequestLine);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new FormatException("Not a vaild request line");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Handle Proxy-x Headers
|
||||
|
||||
if (!line.StartsWith("Proxy-"))
|
||||
{
|
||||
_headers.Enqueue(line);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (line.StartsWith("Proxy-Connection: "))
|
||||
{
|
||||
_headers.Enqueue(line.Substring(6));
|
||||
}
|
||||
}
|
||||
|
||||
if (line.IsNullOrEmpty())
|
||||
{
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user