Commit bc76f768 authored by titanium007's avatar titanium007

Add validation for function calls

parent 0818cb20
...@@ -60,28 +60,28 @@ namespace Titanium.Web.Proxy.Test ...@@ -60,28 +60,28 @@ namespace Titanium.Web.Proxy.Test
Console.WriteLine(e.RequestURL); Console.WriteLine(e.RequestURL);
////modify request headers //modify request headers
//var requestHeaders = e.RequestHeaders; var requestHeaders = e.RequestHeaders;
//if ((e.RequestMethod.ToUpper() == "POST" || e.RequestMethod.ToUpper() == "PUT") && e.RequestContentLength > 0) if ((e.RequestMethod.ToUpper() == "POST" || e.RequestMethod.ToUpper() == "PUT") && e.RequestContentLength > 0)
//{ {
// //Get/Set request body bytes //Get/Set request body bytes
// byte[] bodyBytes = e.GetRequestBody(); byte[] bodyBytes = e.GetRequestBody();
// e.SetRequestBody(bodyBytes); e.SetRequestBody(bodyBytes);
// //Get/Set request body as string //Get/Set request body as string
// string bodyString = e.GetRequestBodyAsString(); string bodyString = e.GetRequestBodyAsString();
// e.SetRequestBodyString(bodyString); e.SetRequestBodyString(bodyString);
//} }
////To cancel a request with a custom HTML content //To cancel a request with a custom HTML content
////Filter URL //Filter URL
//if (e.RequestURL.Contains("google.com")) if (e.RequestURL.Contains("google.com"))
//{ {
// e.Ok("<!DOCTYPE html><html><body><h1>Website Blocked</h1><p>Blocked by titanium web proxy.</p></body></html>"); e.Ok("<!DOCTYPE html><html><body><h1>Website Blocked</h1><p>Blocked by titanium web proxy.</p></body></html>");
//} }
} }
...@@ -90,27 +90,28 @@ namespace Titanium.Web.Proxy.Test ...@@ -90,27 +90,28 @@ namespace Titanium.Web.Proxy.Test
public void OnResponse(object sender, SessionEventArgs e) public void OnResponse(object sender, SessionEventArgs e)
{ {
//modify response headers //modify response headers
//var responseHeaders = e.ResponseHeaders; var responseHeaders = e.ResponseHeaders;
//if (e.ResponseStatusCode == HttpStatusCode.OK)
//{ if (e.ResponseStatusCode == HttpStatusCode.OK)
// if (e.ResponseContentType.Trim().ToLower().Contains("text/html")) {
// { if (e.ResponseContentType.Trim().ToLower().Contains("text/html"))
// //Get/Set response body bytes {
// byte[] responseBodyBytes = e.GetResponseBody(); //Get/Set response body bytes
// e.SetResponseBody(responseBodyBytes); byte[] responseBodyBytes = e.GetResponseBody();
e.SetResponseBody(responseBodyBytes);
// //Get response body as string
// string responseBody = e.GetResponseBodyAsString(); //Get response body as string
string responseBody = e.GetResponseBodyAsString();
// //Modify e.ServerResponse
// Regex rex = new Regex("</body>", RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline); //Modify e.ServerResponse
// string modified = rex.Replace(responseBody, "<script type =\"text/javascript\">alert('Response was modified by this script!');</script></body>", 1); Regex rex = new Regex("</body>", RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline);
string modified = rex.Replace(responseBody, "<script type =\"text/javascript\">alert('Response was modified by this script!');</script></body>", 1);
// //Set modifed response Html Body
// e.SetResponseBodyString(modified); //Set modifed response Html Body
// } e.SetResponseBodyString(modified);
//} }
}
} }
......
...@@ -35,7 +35,10 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -35,7 +35,10 @@ namespace Titanium.Web.Proxy.EventArguments
internal string responseBodyString { get; set; } internal string responseBodyString { get; set; }
internal bool responseBodyRead { get; set; } internal bool responseBodyRead { get; set; }
internal bool RequestLocked { get; set; }
internal HttpWebRequest proxyRequest { get; set; } internal HttpWebRequest proxyRequest { get; set; }
internal bool ResponseLocked { get; set; }
internal HttpWebResponse serverResponse { get; set; } internal HttpWebResponse serverResponse { get; set; }
internal bool isHttps { get; set; } internal bool isHttps { get; set; }
...@@ -132,11 +135,15 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -132,11 +135,15 @@ namespace Titanium.Web.Proxy.EventArguments
public Encoding GetRequestBodyEncoding() public Encoding GetRequestBodyEncoding()
{ {
if (RequestLocked) throw new Exception("You cannot call this function after request is made to server.");
return requestEncoding; return requestEncoding;
} }
public byte[] GetRequestBody() public byte[] GetRequestBody()
{ {
if (RequestLocked) throw new Exception("You cannot call this function after request is made to server.");
if ((proxyRequest.Method.ToUpper() == "POST" || proxyRequest.Method.ToUpper() == "PUT") && RequestContentLength > 0) if ((proxyRequest.Method.ToUpper() == "POST" || proxyRequest.Method.ToUpper() == "PUT") && RequestContentLength > 0)
{ {
readRequestBody(); readRequestBody();
...@@ -150,6 +157,8 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -150,6 +157,8 @@ namespace Titanium.Web.Proxy.EventArguments
} }
public string GetRequestBodyAsString() public string GetRequestBodyAsString()
{ {
if (RequestLocked) throw new Exception("You cannot call this function after request is made to server.");
if ((proxyRequest.Method.ToUpper() == "POST" || proxyRequest.Method.ToUpper() == "PUT") && RequestContentLength > 0) if ((proxyRequest.Method.ToUpper() == "POST" || proxyRequest.Method.ToUpper() == "PUT") && RequestContentLength > 0)
{ {
readRequestBody(); readRequestBody();
...@@ -168,6 +177,8 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -168,6 +177,8 @@ namespace Titanium.Web.Proxy.EventArguments
public void SetRequestBody(byte[] body) public void SetRequestBody(byte[] body)
{ {
if (RequestLocked) throw new Exception("You cannot call this function after request is made to server.");
if (!requestBodyRead) if (!requestBodyRead)
{ {
readRequestBody(); readRequestBody();
...@@ -179,6 +190,8 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -179,6 +190,8 @@ namespace Titanium.Web.Proxy.EventArguments
public void SetRequestBodyString(string body) public void SetRequestBodyString(string body)
{ {
if (RequestLocked) throw new Exception("Youcannot call this function after request is made to server.");
if (!requestBodyRead) if (!requestBodyRead)
{ {
readRequestBody(); readRequestBody();
...@@ -190,17 +203,24 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -190,17 +203,24 @@ namespace Titanium.Web.Proxy.EventArguments
public Encoding GetResponseBodyEncoding() public Encoding GetResponseBodyEncoding()
{ {
if (!RequestLocked) throw new Exception("You cannot call this function before request is made to server.");
return responseEncoding; return responseEncoding;
} }
public byte[] GetResponseBody() public byte[] GetResponseBody()
{ {
if (!RequestLocked) throw new Exception("You cannot call this function before request is made to server.");
readResponseBody(); readResponseBody();
return responseBody; return responseBody;
} }
public string GetResponseBodyAsString() public string GetResponseBodyAsString()
{ {
if (!RequestLocked) throw new Exception("You cannot call this function before request is made to server.");
GetResponseBody(); GetResponseBody();
if (responseBodyString == null) if (responseBodyString == null)
{ {
responseBodyString = responseEncoding.GetString(responseBody); responseBodyString = responseEncoding.GetString(responseBody);
...@@ -209,6 +229,8 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -209,6 +229,8 @@ namespace Titanium.Web.Proxy.EventArguments
} }
public void SetResponseBody(byte[] body) public void SetResponseBody(byte[] body)
{ {
if (!RequestLocked) throw new Exception("You cannot call this function before request is made to server.");
if (responseBody == null) if (responseBody == null)
{ {
GetResponseBody(); GetResponseBody();
...@@ -220,6 +242,8 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -220,6 +242,8 @@ namespace Titanium.Web.Proxy.EventArguments
} }
public void SetResponseBodyString(string body) public void SetResponseBodyString(string body)
{ {
if (!RequestLocked) throw new Exception("You cannot call this function before request is made to server.");
if (responseBody == null) if (responseBody == null)
{ {
GetResponseBody(); GetResponseBody();
...@@ -232,6 +256,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -232,6 +256,7 @@ namespace Titanium.Web.Proxy.EventArguments
public void Ok(string html) public void Ok(string html)
{ {
if (RequestLocked) throw new Exception("You cannot call this function after request is made to server.");
if (html == null) if (html == null)
html = string.Empty; html = string.Empty;
......
...@@ -60,7 +60,7 @@ namespace Titanium.Web.Proxy ...@@ -60,7 +60,7 @@ namespace Titanium.Web.Proxy
httpRemoteUri = new Uri("https://" + httpCmdSplit[1]); httpRemoteUri = new Uri("https://" + httpCmdSplit[1]);
clientStreamReader.ReadAllLines(); clientStreamReader.ReadAllLines();
WriteConnectedResponse(clientStreamWriter, httpVersion); WriteConnectResponse(clientStreamWriter, httpVersion);
var certificate = ProxyServer.CertManager.CreateCertificate(httpRemoteUri.Host); var certificate = ProxyServer.CertManager.CreateCertificate(httpRemoteUri.Host);
...@@ -94,7 +94,7 @@ namespace Titanium.Web.Proxy ...@@ -94,7 +94,7 @@ namespace Titanium.Web.Proxy
else if (httpVerb.ToUpper() == "CONNECT") else if (httpVerb.ToUpper() == "CONNECT")
{ {
clientStreamReader.ReadAllLines(); clientStreamReader.ReadAllLines();
WriteConnectedResponse(clientStreamWriter, httpVersion); WriteConnectResponse(clientStreamWriter, httpVersion);
TcpHelper.SendRaw(clientStreamReader.BaseStream, null, null, httpRemoteUri.Host, httpRemoteUri.Port, false); TcpHelper.SendRaw(clientStreamReader.BaseStream, null, null, httpRemoteUri.Host, httpRemoteUri.Port, false);
Dispose(client, clientStream, clientStreamReader, clientStreamWriter, null); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, null);
return; return;
...@@ -112,14 +112,7 @@ namespace Titanium.Web.Proxy ...@@ -112,14 +112,7 @@ namespace Titanium.Web.Proxy
} }
private static void WriteConnectedResponse(StreamWriter clientStreamWriter, string httpVersion)
{
clientStreamWriter.WriteLine(httpVersion + " 200 Connection established");
clientStreamWriter.WriteLine(String.Format("Timestamp: {0}", DateTime.Now.ToString()));
clientStreamWriter.WriteLine(String.Format("connection:close"));
clientStreamWriter.WriteLine();
clientStreamWriter.Flush();
}
private static void HandleHttpSessionRequest(TcpClient client, string httpCmd, Stream clientStream, CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, string secureTunnelHostName) private static void HandleHttpSessionRequest(TcpClient client, string httpCmd, Stream clientStream, CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, string secureTunnelHostName)
{ {
...@@ -202,15 +195,17 @@ namespace Titanium.Web.Proxy ...@@ -202,15 +195,17 @@ namespace Titanium.Web.Proxy
args.requestIsAlive = args.proxyRequest.KeepAlive; args.requestIsAlive = args.proxyRequest.KeepAlive;
args.proxyRequest.ConnectionGroupName = args.requestHostname; args.proxyRequest.ConnectionGroupName = args.requestHostname;
args.proxyRequest.AllowWriteStreamBuffering = true; args.proxyRequest.AllowWriteStreamBuffering = true;
//If requested interception //If requested interception
if (BeforeRequest != null) if (BeforeRequest != null)
{ {
args.requestEncoding = args.proxyRequest.GetEncoding(); args.requestEncoding = args.proxyRequest.GetEncoding();
BeforeRequest(null, args); BeforeRequest(null, args);
} }
args.RequestLocked = true;
if (args.cancelRequest) if (args.cancelRequest)
{ {
Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args);
...@@ -257,6 +252,15 @@ namespace Titanium.Web.Proxy ...@@ -257,6 +252,15 @@ namespace Titanium.Web.Proxy
} }
private static void WriteConnectResponse(StreamWriter clientStreamWriter, string httpVersion)
{
clientStreamWriter.WriteLine(httpVersion + " 200 Connection established");
clientStreamWriter.WriteLine(String.Format("Timestamp: {0}", DateTime.Now.ToString()));
clientStreamWriter.WriteLine(String.Format("connection:close"));
clientStreamWriter.WriteLine();
clientStreamWriter.Flush();
}
private static void SetRequestHeaders(List<HttpHeader> requestHeaders, HttpWebRequest webRequest) private static void SetRequestHeaders(List<HttpHeader> requestHeaders, HttpWebRequest webRequest)
{ {
......
...@@ -40,13 +40,16 @@ namespace Titanium.Web.Proxy ...@@ -40,13 +40,16 @@ namespace Titanium.Web.Proxy
{ {
args.ResponseHeaders = ReadResponseHeaders(args.serverResponse); args.ResponseHeaders = ReadResponseHeaders(args.serverResponse);
args.responseStream = args.serverResponse.GetResponseStream(); args.responseStream = args.serverResponse.GetResponseStream();
if (BeforeResponse != null) if (BeforeResponse != null)
{ {
args.responseEncoding = args.serverResponse.GetEncoding(); args.responseEncoding = args.serverResponse.GetEncoding();
BeforeResponse(null, args); BeforeResponse(null, args);
} }
args.ResponseLocked = true;
if (args.responseBodyRead) if (args.responseBodyRead)
{ {
bool isChunked = args.ResponseHeaders.Any(x => x.Name.ToLower() == "transfer-encoding") == false ? false : args.ResponseHeaders.First(x => x.Name.ToLower() == "transfer-encoding").Value.ToLower() == "chunked" ? true : false; bool isChunked = args.ResponseHeaders.Any(x => x.Name.ToLower() == "transfer-encoding") == false ? false : args.ResponseHeaders.First(x => x.Name.ToLower() == "transfer-encoding").Value.ToLower() == "chunked" ? true : false;
......
...@@ -90,7 +90,7 @@ ...@@ -90,7 +90,7 @@
<Compile Include="Helpers\NetFramework.cs" /> <Compile Include="Helpers\NetFramework.cs" />
<Compile Include="Helpers\Compression.cs" /> <Compile Include="Helpers\Compression.cs" />
<Compile Include="ProxyServer.cs" /> <Compile Include="ProxyServer.cs" />
<Compile Include="EventArgs\SessionEventArgs.cs" /> <Compile Include="EventArguments\SessionEventArgs.cs" />
<Compile Include="Helpers\Tcp.cs" /> <Compile Include="Helpers\Tcp.cs" />
<Compile Include="Extensions\StreamExtensions.cs" /> <Compile Include="Extensions\StreamExtensions.cs" />
</ItemGroup> </ItemGroup>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment