Skip to content

Commit

Permalink
up pac server
Browse files Browse the repository at this point in the history
  • Loading branch information
2dust committed Aug 21, 2019
1 parent 5a1e570 commit dd1a015
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 184 deletions.
69 changes: 66 additions & 3 deletions v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs
Expand Up @@ -2,6 +2,7 @@
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace v2rayN.HttpProxyHandler
Expand Down Expand Up @@ -37,12 +38,42 @@ public HttpWebServerB(int port, Func<TcpClient, string> method)
{
if (listener != null)
{
TcpClient client = listener.EndAcceptTcpClient(ares);
TcpClient tcpClient = listener.EndAcceptTcpClient(ares);
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();
}
}
}
Expand All @@ -64,6 +95,38 @@ public void Stop()
listener = null;
}
}


//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();
}

}
}
63 changes: 0 additions & 63 deletions v2rayN/v2rayN/HttpProxyHandler/HttpWebServerC.cs

This file was deleted.

173 changes: 58 additions & 115 deletions v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs
Expand Up @@ -15,43 +15,26 @@ namespace v2rayN.HttpProxyHandler
/// </summary>
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 HttpWebServerB server;
// private static HttpWebServerC server;
//static Thread thread;
private static HttpWebServer server;
private static HttpWebServerB serverB;

public static void Init(Config config)
{
InitServer("127.0.0.1");
//if (config.allowLANConn)
//{
// List<string> lstIPAddress = Utils.GetHostIPAddress();
// if (lstIPAddress.Count <= 0)
// {
// return;
// }
// InitServer(lstIPAddress[0]);
// //foreach (string str in lstIPAddress)
// //{
// // InitServer(str);
// //}
//}
//else
//{
// InitServer("127.0.0.1");
//}
if (Utils.IsAdministrator())
{
InitServer("127.0.0.1");
}
else
{
InitServerB("127.0.0.1");
}
}

public static void InitServer(string address)
{
try
{
//pac = GetPacList(address);

if (pacPort != Global.pacPort)
{
if (server != null)
Expand All @@ -62,43 +45,65 @@ public static void InitServer(string address)

if (server == null)
{
server = new HttpWebServerB(Global.pacPort, SendResponse);
//server = new HttpWebServerC(Global.pacPort, pac);
string prefixes = string.Format("http://{0}:{1}/pac/", "+", Global.pacPort);
Utils.SaveLog("Webserver prefixes " + prefixes);

HttpWebServer ws = new HttpWebServer(SendResponse, prefixes);
ws.Run();

pacPort = Global.pacPort;
}
}

//thread = new Thread(server.WorkThread);
//thread.IsBackground = true;
//thread.Start();
Utils.SaveLog("Webserver at " + address);
}
catch (Exception ex)
{
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);
public static void InitServerB(string address)
{
try
{
if (pacPort != Global.pacPort)
{
if (serverB != null)
{
serverB.Stop();
serverB = null;
}

// HttpWebServer ws = new HttpWebServer(SendResponse, prefixes);
// ws.Run();
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);
}
}

// if (!httpWebServer.ContainsKey(address) && ws != null)
// {
// httpWebServer.Add(address, ws);
// }
//}
//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)
{
Expand All @@ -108,33 +113,9 @@ public static string SendResponse(TcpClient tcpClient)
var pac = GetPacList(address);

Console.WriteLine("SendResponse addr " + address);
Utils.SaveLog("SendResponse addr " + address);

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)
{

Byte[] sendBytes = Encoding.UTF8.GetBytes(writeSuccess(pac));
netStream.Write(sendBytes, 0, sendBytes.Length);
}
}

netStream.Close();
tcpClient.Close();
return "";
//Utils.SaveLog("SendResponse addr " + address);

return pac;
}
catch (Exception ex)
{
Expand All @@ -144,44 +125,6 @@ public static string SendResponse(TcpClient tcpClient)
}


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()
{
//try
Expand Down
4 changes: 2 additions & 2 deletions v2rayN/v2rayN/Properties/AssemblyInfo.cs
Expand Up @@ -10,7 +10,7 @@
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("v2rayN")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2018")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

Expand All @@ -33,4 +33,4 @@
// 方法是按如下所示使用“*”:
//[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyVersion("1.0.0")]
[assembly: AssemblyFileVersion("2.34")]
[assembly: AssemblyFileVersion("2.35")]

0 comments on commit dd1a015

Please sign in to comment.