mirror of https://github.com/2dust/v2rayN
parent
5a1e5707b8
commit
dd1a01556f
|
@ -2,6 +2,7 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
namespace v2rayN.HttpProxyHandler
|
||||||
|
@ -37,12 +38,42 @@ namespace v2rayN.HttpProxyHandler
|
||||||
{
|
{
|
||||||
if (listener != null)
|
if (listener != null)
|
||||||
{
|
{
|
||||||
TcpClient client = listener.EndAcceptTcpClient(ares);
|
TcpClient tcpClient = listener.EndAcceptTcpClient(ares);
|
||||||
listener.BeginAcceptTcpClient(callback, null);
|
listener.BeginAcceptTcpClient(callback, null);
|
||||||
|
|
||||||
if (client != null && _responderMethod != null)
|
if (tcpClient != null && _responderMethod != null)
|
||||||
{
|
{
|
||||||
_responderMethod(client);
|
string pac = _responderMethod(tcpClient);
|
||||||
|
|
||||||
|
NetworkStream netStream = tcpClient.GetStream();
|
||||||
|
if (netStream.CanRead)
|
||||||
|
{
|
||||||
|
// Reads NetworkStream into a byte buffer.
|
||||||
|
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
|
||||||
|
|
||||||
|
// Read can return anything from 0 to numBytesToRead.
|
||||||
|
// This method blocks until at least one byte is read.
|
||||||
|
netStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
|
||||||
|
|
||||||
|
// Returns the data received from the host to the console.
|
||||||
|
string returndata = Encoding.UTF8.GetString(bytes);
|
||||||
|
if (!string.IsNullOrEmpty(returndata)
|
||||||
|
&& returndata.IndexOf("/pac/") >= 0
|
||||||
|
&& netStream.CanWrite)
|
||||||
|
{
|
||||||
|
BinaryWriter writer = new BinaryWriter(netStream);
|
||||||
|
//writeSuccess(writer, pac);
|
||||||
|
|
||||||
|
Byte[] sendBytes = Encoding.UTF8.GetBytes(writeSuccess(pac));
|
||||||
|
writer.Write(sendBytes, 0, sendBytes.Length);
|
||||||
|
writer.Flush();
|
||||||
|
|
||||||
|
writer.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
netStream.Close();
|
||||||
|
tcpClient.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,5 +96,37 @@ namespace v2rayN.HttpProxyHandler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//private static void writeSuccess(BinaryWriter writer, string pac)
|
||||||
|
//{
|
||||||
|
// writer.Write("HTTP/1.0 200 OK");
|
||||||
|
// writer.Write(Environment.NewLine);
|
||||||
|
// writer.Write("Content-Type:application/x-ns-proxy-autoconfig; charset=UTF-8");
|
||||||
|
// writer.Write(Environment.NewLine);
|
||||||
|
// writer.Write("Content-Length: " + pac.Length);
|
||||||
|
// writer.Write(Environment.NewLine);
|
||||||
|
// writer.Write(Environment.NewLine);
|
||||||
|
// writer.Write(pac);
|
||||||
|
// writer.Flush();
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
private static string writeSuccess(string pac)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string content_type = "application/x-ns-proxy-autoconfig";
|
||||||
|
|
||||||
|
sb.Append("HTTP/1.0 200 OK");
|
||||||
|
sb.AppendLine();
|
||||||
|
sb.Append(String.Format("Content-Type:{0};charset=utf-8", content_type));
|
||||||
|
sb.AppendLine();
|
||||||
|
//sb.Append("Connection: close");
|
||||||
|
//sb.AppendLine();
|
||||||
|
sb.Append(pac);
|
||||||
|
sb.AppendLine();
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
|
||||||
{
|
|
||||||
public class HttpWebServerC
|
|
||||||
{
|
|
||||||
private int port;
|
|
||||||
private TcpListener listener;
|
|
||||||
private bool is_active = true;
|
|
||||||
private string pacRespone = string.Empty;
|
|
||||||
|
|
||||||
public HttpWebServerC(int port, string pacRespone)
|
|
||||||
{
|
|
||||||
this.port = port;
|
|
||||||
this.pacRespone = pacRespone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WorkThread()
|
|
||||||
{
|
|
||||||
is_active = true;
|
|
||||||
Listen();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Listen()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
listener = new TcpListener(new IPEndPoint(IPAddress.Any, port));
|
|
||||||
listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
|
|
||||||
listener.Start();
|
|
||||||
|
|
||||||
Utils.SaveLog("WebserverB running...");
|
|
||||||
|
|
||||||
while (is_active)
|
|
||||||
{
|
|
||||||
TcpClient client = listener.AcceptTcpClient();
|
|
||||||
//HttpWebProcessor processor = new HttpWebProcessor(client, pacRespone);
|
|
||||||
//Thread thread = new Thread(new ThreadStart(processor.process));
|
|
||||||
//thread.Start();
|
|
||||||
//Thread.Sleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
if (listener != null)
|
|
||||||
{
|
|
||||||
is_active = false;
|
|
||||||
listener.Stop();
|
|
||||||
listener = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -15,43 +15,26 @@ namespace v2rayN.HttpProxyHandler
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class PACServerHandle
|
class PACServerHandle
|
||||||
{
|
{
|
||||||
//private static Hashtable httpWebServer = new Hashtable();
|
|
||||||
//private static Hashtable pacList = new Hashtable();
|
|
||||||
|
|
||||||
//private static string pac = "";
|
|
||||||
private static int pacPort = 0;
|
private static int pacPort = 0;
|
||||||
private static HttpWebServerB server;
|
private static HttpWebServer server;
|
||||||
// private static HttpWebServerC server;
|
private static HttpWebServerB serverB;
|
||||||
//static Thread thread;
|
|
||||||
|
|
||||||
public static void Init(Config config)
|
public static void Init(Config config)
|
||||||
|
{
|
||||||
|
if (Utils.IsAdministrator())
|
||||||
{
|
{
|
||||||
InitServer("127.0.0.1");
|
InitServer("127.0.0.1");
|
||||||
//if (config.allowLANConn)
|
}
|
||||||
//{
|
else
|
||||||
// List<string> lstIPAddress = Utils.GetHostIPAddress();
|
{
|
||||||
// if (lstIPAddress.Count <= 0)
|
InitServerB("127.0.0.1");
|
||||||
// {
|
}
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// InitServer(lstIPAddress[0]);
|
|
||||||
// //foreach (string str in lstIPAddress)
|
|
||||||
// //{
|
|
||||||
// // InitServer(str);
|
|
||||||
// //}
|
|
||||||
//}
|
|
||||||
//else
|
|
||||||
//{
|
|
||||||
// InitServer("127.0.0.1");
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void InitServer(string address)
|
public static void InitServer(string address)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//pac = GetPacList(address);
|
|
||||||
|
|
||||||
if (pacPort != Global.pacPort)
|
if (pacPort != Global.pacPort)
|
||||||
{
|
{
|
||||||
if (server != null)
|
if (server != null)
|
||||||
|
@ -62,44 +45,66 @@ namespace v2rayN.HttpProxyHandler
|
||||||
|
|
||||||
if (server == null)
|
if (server == null)
|
||||||
{
|
{
|
||||||
server = new HttpWebServerB(Global.pacPort, SendResponse);
|
string prefixes = string.Format("http://{0}:{1}/pac/", "+", Global.pacPort);
|
||||||
//server = new HttpWebServerC(Global.pacPort, pac);
|
Utils.SaveLog("Webserver prefixes " + prefixes);
|
||||||
|
|
||||||
|
HttpWebServer ws = new HttpWebServer(SendResponse, prefixes);
|
||||||
|
ws.Run();
|
||||||
|
|
||||||
pacPort = Global.pacPort;
|
pacPort = Global.pacPort;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//thread = new Thread(server.WorkThread);
|
|
||||||
//thread.IsBackground = true;
|
|
||||||
//thread.Start();
|
|
||||||
Utils.SaveLog("Webserver at " + address);
|
Utils.SaveLog("Webserver at " + address);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog("Webserver InitServer " + ex.Message);
|
Utils.SaveLog("Webserver InitServer " + ex.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (!pacList.ContainsKey(address))
|
|
||||||
// {
|
|
||||||
// pacList.Add(address, GetPacList(address));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort);
|
|
||||||
// Utils.SaveLog("Webserver prefixes " + prefixes);
|
|
||||||
|
|
||||||
// HttpWebServer ws = new HttpWebServer(SendResponse, prefixes);
|
|
||||||
// ws.Run();
|
|
||||||
|
|
||||||
// if (!httpWebServer.ContainsKey(address) && ws != null)
|
|
||||||
// {
|
|
||||||
// httpWebServer.Add(address, ws);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//catch (Exception ex)
|
|
||||||
//{
|
|
||||||
// Utils.SaveLog("Webserver InitServer " + ex.Message);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void InitServerB(string address)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (pacPort != Global.pacPort)
|
||||||
|
{
|
||||||
|
if (serverB != null)
|
||||||
|
{
|
||||||
|
serverB.Stop();
|
||||||
|
serverB = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (serverB == null)
|
||||||
|
{
|
||||||
|
serverB = new HttpWebServerB(Global.pacPort, SendResponse);
|
||||||
|
pacPort = Global.pacPort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Utils.SaveLog("Webserver at " + address);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("Webserver InitServer " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string SendResponse(HttpListenerRequest request)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string address = request.LocalEndPoint.Address.ToString();
|
||||||
|
var pac = GetPacList(address);
|
||||||
|
return pac;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("Webserver SendResponse " + ex.Message);
|
||||||
|
return ex.Message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static string SendResponse(TcpClient tcpClient)
|
public static string SendResponse(TcpClient tcpClient)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -108,33 +113,9 @@ namespace v2rayN.HttpProxyHandler
|
||||||
var pac = GetPacList(address);
|
var pac = GetPacList(address);
|
||||||
|
|
||||||
Console.WriteLine("SendResponse addr " + address);
|
Console.WriteLine("SendResponse addr " + address);
|
||||||
Utils.SaveLog("SendResponse addr " + address);
|
//Utils.SaveLog("SendResponse addr " + address);
|
||||||
|
|
||||||
NetworkStream netStream = tcpClient.GetStream();
|
return pac;
|
||||||
if (netStream.CanRead)
|
|
||||||
{
|
|
||||||
// Reads NetworkStream into a byte buffer.
|
|
||||||
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
|
|
||||||
|
|
||||||
// Read can return anything from 0 to numBytesToRead.
|
|
||||||
// This method blocks until at least one byte is read.
|
|
||||||
netStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
|
|
||||||
|
|
||||||
// Returns the data received from the host to the console.
|
|
||||||
string returndata = Encoding.UTF8.GetString(bytes);
|
|
||||||
if (!string.IsNullOrEmpty(returndata)
|
|
||||||
&& returndata.IndexOf("/pac/") >= 0
|
|
||||||
&& netStream.CanWrite)
|
|
||||||
{
|
|
||||||
|
|
||||||
Byte[] sendBytes = Encoding.UTF8.GetBytes(writeSuccess(pac));
|
|
||||||
netStream.Write(sendBytes, 0, sendBytes.Length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
netStream.Close();
|
|
||||||
tcpClient.Close();
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -144,44 +125,6 @@ namespace v2rayN.HttpProxyHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static string writeSuccess(string pac)
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
string content_type = "application/x-ns-proxy-autoconfig";
|
|
||||||
|
|
||||||
sb.Append("HTTP/1.0 200 OK");
|
|
||||||
sb.AppendLine();
|
|
||||||
sb.Append(String.Format("Content-Type:{0};charset=utf-8", content_type));
|
|
||||||
sb.AppendLine();
|
|
||||||
sb.Append("Connection: close");
|
|
||||||
sb.AppendLine();
|
|
||||||
sb.Append(pac);
|
|
||||||
sb.AppendLine();
|
|
||||||
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
public static string SendResponse(HttpListenerRequest request)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string[] arrAddress = request.UserHostAddress.Split(':');
|
|
||||||
string address = "127.0.0.1";
|
|
||||||
if (arrAddress.Length > 0)
|
|
||||||
{
|
|
||||||
address = arrAddress[0];
|
|
||||||
}
|
|
||||||
return pacList[address].ToString();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog("Webserver SendResponse " + ex.Message);
|
|
||||||
return ex.Message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static void Stop()
|
public static void Stop()
|
||||||
{
|
{
|
||||||
//try
|
//try
|
||||||
|
|
|
@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("Microsoft")]
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
[assembly: AssemblyProduct("v2rayN")]
|
[assembly: AssemblyProduct("v2rayN")]
|
||||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2018")]
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2019")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
@ -33,4 +33,4 @@ using System.Runtime.InteropServices;
|
||||||
// 方法是按如下所示使用“*”:
|
// 方法是按如下所示使用“*”:
|
||||||
//[assembly: AssemblyVersion("1.0.*")]
|
//[assembly: AssemblyVersion("1.0.*")]
|
||||||
//[assembly: AssemblyVersion("1.0.0")]
|
//[assembly: AssemblyVersion("1.0.0")]
|
||||||
[assembly: AssemblyFileVersion("2.34")]
|
[assembly: AssemblyFileVersion("2.35")]
|
||||||
|
|
|
@ -17,6 +17,7 @@ using System.Drawing;
|
||||||
using ZXing;
|
using ZXing;
|
||||||
using ZXing.Common;
|
using ZXing.Common;
|
||||||
using ZXing.QrCode;
|
using ZXing.QrCode;
|
||||||
|
using System.Security.Principal;
|
||||||
|
|
||||||
namespace v2rayN
|
namespace v2rayN
|
||||||
{
|
{
|
||||||
|
@ -671,6 +672,25 @@ namespace v2rayN
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// IsAdministrator
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool IsAdministrator()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
WindowsIdentity current = WindowsIdentity.GetCurrent();
|
||||||
|
WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current);
|
||||||
|
//WindowsBuiltInRole可以枚举出很多权限,例如系统用户、User、Guest等等
|
||||||
|
return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TempPath
|
#region TempPath
|
||||||
|
|
|
@ -145,11 +145,11 @@
|
||||||
<Compile Include="Handler\V2rayUpdateHandle.cs" />
|
<Compile Include="Handler\V2rayUpdateHandle.cs" />
|
||||||
<Compile Include="HttpProxyHandler\HttpWebServer.cs" />
|
<Compile Include="HttpProxyHandler\HttpWebServer.cs" />
|
||||||
<Compile Include="HttpProxyHandler\HttpWebServerB.cs" />
|
<Compile Include="HttpProxyHandler\HttpWebServerB.cs" />
|
||||||
<Compile Include="HttpProxyHandler\HttpWebServerC.cs" />
|
|
||||||
<Compile Include="HttpProxyHandler\PACFileWatcherHandle.cs" />
|
<Compile Include="HttpProxyHandler\PACFileWatcherHandle.cs" />
|
||||||
<Compile Include="HttpProxyHandler\PrivoxyHandler.cs" />
|
<Compile Include="HttpProxyHandler\PrivoxyHandler.cs" />
|
||||||
<Compile Include="HttpProxyHandler\PACListHandle.cs" />
|
<Compile Include="HttpProxyHandler\PACListHandle.cs" />
|
||||||
<Compile Include="HttpProxyHandler\PACServerHandle.cs" />
|
<Compile Include="HttpProxyHandler\PACServerHandle.cs" />
|
||||||
|
<Compile Include="HttpProxyHandler\ProxySetting.cs" />
|
||||||
<Compile Include="HttpProxyHandler\SysProxyHandle.cs" />
|
<Compile Include="HttpProxyHandler\SysProxyHandle.cs" />
|
||||||
<Compile Include="HttpProxyHandler\HttpProxyHandle.cs" />
|
<Compile Include="HttpProxyHandler\HttpProxyHandle.cs" />
|
||||||
<Compile Include="HttpProxyHandler\WebClientEx.cs">
|
<Compile Include="HttpProxyHandler\WebClientEx.cs">
|
||||||
|
|
Loading…
Reference in New Issue