|
|
@@ -15,6 +15,7 @@ namespace Shadowsocks.Controller |
|
|
|
{
|
|
|
|
private static int PORT = 8090;
|
|
|
|
private static string PAC_FILE = "pac.txt";
|
|
|
|
private static Configuration config;
|
|
|
|
|
|
|
|
Socket _listener;
|
|
|
|
FileSystemWatcher watcher;
|
|
|
@@ -25,6 +26,7 @@ namespace Shadowsocks.Controller |
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
config = configuration;
|
|
|
|
// Create a TCP/IP socket.
|
|
|
|
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
|
|
|
_listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
|
|
|
@@ -84,8 +86,14 @@ namespace Shadowsocks.Controller |
|
|
|
new AsyncCallback(AcceptCallback),
|
|
|
|
listener);
|
|
|
|
|
|
|
|
conn.BeginReceive(new byte[1024], 0, 1024, 0,
|
|
|
|
new AsyncCallback(ReceiveCallback), conn);
|
|
|
|
byte[] buf = new byte[2048];
|
|
|
|
object[] state = new object[] {
|
|
|
|
conn,
|
|
|
|
buf
|
|
|
|
};
|
|
|
|
|
|
|
|
conn.BeginReceive(buf, 0, 1024, 0,
|
|
|
|
new AsyncCallback(ReceiveCallback), state);
|
|
|
|
}
|
|
|
|
catch (ObjectDisposedException)
|
|
|
|
{
|
|
|
@@ -123,7 +131,10 @@ namespace Shadowsocks.Controller |
|
|
|
|
|
|
|
private void ReceiveCallback(IAsyncResult ar)
|
|
|
|
{
|
|
|
|
Socket conn = (Socket)ar.AsyncState;
|
|
|
|
object[] state = (object[])ar.AsyncState;
|
|
|
|
|
|
|
|
Socket conn = (Socket)state[0];
|
|
|
|
byte[] requestBuf = (byte[])state[1];
|
|
|
|
try
|
|
|
|
{
|
|
|
|
int bytesRead = conn.EndReceive(ar);
|
|
|
@@ -132,7 +143,7 @@ namespace Shadowsocks.Controller |
|
|
|
|
|
|
|
IPEndPoint localEndPoint = (IPEndPoint)conn.LocalEndPoint;
|
|
|
|
|
|
|
|
string proxy = "PROXY " + localEndPoint.Address + ":8123;";
|
|
|
|
string proxy = GetPACAddress(requestBuf, localEndPoint);
|
|
|
|
|
|
|
|
pac = pac.Replace("__PROXY__", proxy);
|
|
|
|
|
|
|
@@ -189,5 +200,24 @@ Connection: Close |
|
|
|
PACFileChanged(this, new EventArgs());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private string GetPACAddress(byte[] requestBuf, IPEndPoint localEndPoint)
|
|
|
|
{
|
|
|
|
string proxy = "PROXY " + localEndPoint.Address + ":8123;";
|
|
|
|
//try
|
|
|
|
//{
|
|
|
|
// string requestString = Encoding.UTF8.GetString(requestBuf);
|
|
|
|
// if (requestString.IndexOf("AppleWebKit") >= 0)
|
|
|
|
// {
|
|
|
|
// string address = "" + localEndPoint.Address + ":" + config.GetCurrentServer().local_port;
|
|
|
|
// proxy = "SOCKS5 " + address + "; SOCKS " + address + ";";
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
//catch (Exception e)
|
|
|
|
//{
|
|
|
|
// Console.WriteLine(e);
|
|
|
|
//}
|
|
|
|
return proxy;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|