Commit aabea620 authored by justcoding121's avatar justcoding121

Merge pull request #46 from justcoding121/release

Release
parents 637707ca 39bdfe5d
......@@ -27,7 +27,6 @@ Install by nuget:
After installing nuget package mark following files to be copied to app directory
* makecert.exe
* Titanium_Proxy_Test_Root.cer
Setup HTTP proxy:
......
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using Titanium.Web.Proxy.Helpers;
namespace Titanium.Web.Proxy.EventArguments
{
/// <summary>
/// This class wraps Tcp connection to Server
/// </summary>
public class ProxyClient
{
/// <summary>
/// TcpClient used to communicate with server
/// </summary>
internal TcpClient TcpClient { get; set; }
/// <summary>
/// holds the stream to server
/// </summary>
internal Stream ClientStream { get; set; }
/// <summary>
/// Used to read line by line from server
/// </summary>
internal CustomBinaryReader ClientStreamReader { get; set; }
/// <summary>
/// used to write line by line to server
/// </summary>
internal StreamWriter ClientStreamWriter { get; set; }
}
}
......@@ -2,6 +2,9 @@
namespace Titanium.Web.Proxy.Exceptions
{
/// <summary>
/// An expception thrown when body is unexpectedly empty
/// </summary>
public class BodyNotFoundException : Exception
{
public BodyNotFoundException(string message)
......
......@@ -4,14 +4,20 @@ using Titanium.Web.Proxy.Network;
namespace Titanium.Web.Proxy.Extensions
{
/// <summary>
/// Extensions on HttpWebSession object
/// </summary>
public static class HttpWebRequestExtensions
{
//Get encoding of the HTTP request
public static Encoding GetEncoding(this HttpWebSession request)
{
try
{
//return default if not specified
if (request.Request.ContentType == null) return Encoding.GetEncoding("ISO-8859-1");
//extract the encoding by finding the charset
var contentTypes = request.Request.ContentType.Split(';');
foreach (var contentType in contentTypes)
{
......@@ -24,9 +30,11 @@ namespace Titanium.Web.Proxy.Extensions
}
catch
{
//parsing errors
// ignored
}
//return default if not specified
return Encoding.GetEncoding("ISO-8859-1");
}
}
......
......@@ -4,10 +4,16 @@ using Ionic.Zlib;
namespace Titanium.Web.Proxy.Helpers
{
/// <summary>
/// A helper to handle compression/decompression (gzip, zlib & deflate)
/// </summary>
public class CompressionHelper
{
private const int BufferSize = 8192;
/// <summary>
/// compress the given bytes using zlib compression
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static byte[] CompressZlib(byte[] bytes)
{
......@@ -22,6 +28,11 @@ namespace Titanium.Web.Proxy.Helpers
}
}
/// <summary>
/// compress the given bytes using deflate compression
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static byte[] CompressDeflate(byte[] bytes)
{
......@@ -36,6 +47,11 @@ namespace Titanium.Web.Proxy.Helpers
}
}
/// <summary>
/// compress the given bytes using gzip compression
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static byte[] CompressGzip(byte[] bytes)
{
......@@ -50,12 +66,17 @@ namespace Titanium.Web.Proxy.Helpers
}
}
/// <summary>
/// decompression the gzip compressed byte array
/// </summary>
/// <param name="gzip"></param>
/// <returns></returns>
//identify why passing stream instead of bytes returns empty result
public static byte[] DecompressGzip(byte[] gzip)
{
using (var decompressor = new System.IO.Compression.GZipStream(new MemoryStream(gzip), System.IO.Compression.CompressionMode.Decompress))
{
var buffer = new byte[BufferSize];
var buffer = new byte[ProxyServer.BUFFER_SIZE];
using (var output = new MemoryStream())
{
......@@ -69,11 +90,16 @@ namespace Titanium.Web.Proxy.Helpers
}
}
/// <summary>
/// decompress the deflate byte stream
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static byte[] DecompressDeflate(Stream input)
{
using (var decompressor = new DeflateStream(input, CompressionMode.Decompress))
{
var buffer = new byte[BufferSize];
var buffer = new byte[ProxyServer.BUFFER_SIZE];
using (var output = new MemoryStream())
{
......@@ -87,11 +113,16 @@ namespace Titanium.Web.Proxy.Helpers
}
}
/// <summary>
/// decompress the zlib byte stream
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static byte[] DecompressZlib(Stream input)
{
using (var decompressor = new ZlibStream(input, CompressionMode.Decompress))
{
var buffer = new byte[BufferSize];
var buffer = new byte[ProxyServer.BUFFER_SIZE];
using (var output = new MemoryStream())
{
......
......@@ -5,6 +5,11 @@ using System.Text;
namespace Titanium.Web.Proxy.Helpers
{
/// <summary>
/// A custom binary reader that would allo us to read string line by line
/// using the specified encoding
/// as well as to read bytes as required
/// </summary>
public class CustomBinaryReader : BinaryReader
{
internal CustomBinaryReader(Stream stream, Encoding encoding)
......@@ -12,6 +17,10 @@ namespace Titanium.Web.Proxy.Helpers
{
}
/// <summary>
/// Read a line from the byte stream
/// </summary>
/// <returns></returns>
internal string ReadLine()
{
var readBuffer = new StringBuilder();
......@@ -43,6 +52,10 @@ namespace Titanium.Web.Proxy.Helpers
}
}
/// <summary>
/// Read until the last new line
/// </summary>
/// <returns></returns>
internal List<string> ReadAllLines()
{
string tmpLine;
......
......@@ -3,6 +3,9 @@ using System.IO;
namespace Titanium.Web.Proxy.Helpers
{
/// <summary>
/// A helper class to set proxy settings for firefox
/// </summary>
public class FireFoxHelper
{
public static void AddFirefox()
......
......@@ -2,6 +2,9 @@
namespace Titanium.Web.Proxy.Models
{
/// <summary>
/// Http Header object used by proxy
/// </summary>
public class HttpHeader
{
public HttpHeader(string name, string value)
......@@ -15,6 +18,10 @@ namespace Titanium.Web.Proxy.Models
public string Name { get; set; }
public string Value { get; set; }
/// <summary>
/// Returns header as a valid header string
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format("{0}: {1}", Name, Value);
......
......@@ -21,7 +21,7 @@ namespace Titanium.Web.Proxy
/// </summary>
public partial class ProxyServer
{
private static readonly int BUFFER_SIZE = 8192;
private static readonly char[] SemiSplit = { ';' };
private static readonly string[] ColonSpaceSplit = { ": " };
......@@ -34,17 +34,16 @@ namespace Titanium.Web.Proxy
private static readonly byte[] ChunkEnd =
Encoding.ASCII.GetBytes(0.ToString("x2") + Environment.NewLine + Environment.NewLine);
public static readonly int BUFFER_SIZE = 8192;
#if NET45
internal static SslProtocols SupportedProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Ssl3;
#else
public static SslProtocols SupportedProtocols = SslProtocols.Tls | SslProtocols.Ssl3;
internal static SslProtocols SupportedProtocols = SslProtocols.Tls | SslProtocols.Ssl3;
#endif
static ProxyServer()
{
CertManager = new CertificateManager("Titanium",
"Titanium Root Certificate Authority");
ProxyEndPoints = new List<ProxyEndPoint>();
Initialize();
......@@ -55,6 +54,7 @@ namespace Titanium.Web.Proxy
private static bool certTrusted { get; set; }
private static bool proxyRunning { get; set; }
public static string RootCertificateIssuerName { get; set; }
public static string RootCertificateName { get; set; }
public static event EventHandler<SessionEventArgs> BeforeRequest;
......@@ -123,7 +123,6 @@ namespace Titanium.Web.Proxy
//clear any settings previously added
ProxyEndPoints.OfType<ExplicitProxyEndPoint>().ToList().ForEach(x => x.IsSystemHttpsProxy = false);
RootCertificateName = RootCertificateName ?? "Titanium_Proxy_Test_Root";
//If certificate was trusted by the machine
if (certTrusted)
......@@ -156,6 +155,12 @@ namespace Titanium.Web.Proxy
if (proxyRunning)
throw new Exception("Proxy is already running.");
RootCertificateName = RootCertificateName ?? "Titanium Root Certificate Authority";
RootCertificateIssuerName = RootCertificateIssuerName ?? "Titanium";
CertManager = new CertificateManager(RootCertificateIssuerName,
RootCertificateName);
EnableSsl = ProxyEndPoints.Any(x => x.EnableSsl);
if (EnableSsl)
......
......@@ -239,8 +239,6 @@ namespace Titanium.Web.Proxy
args.Client.ClientStreamWriter = clientStreamWriter;
args.ProxySession.Request.Hostname = args.ProxySession.Request.RequestUri.Host;
args.ProxySession.Request.Url = args.ProxySession.Request.RequestUri.OriginalString;
args.Client.ClientPort = ((IPEndPoint)client.Client.RemoteEndPoint).Port;
args.Client.ClientIpAddress = ((IPEndPoint)client.Client.RemoteEndPoint).Address;
//If requested interception
......
......@@ -80,6 +80,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="EventArguments\ProxyClient.cs" />
<Compile Include="Exceptions\BodyNotFoundException.cs" />
<Compile Include="Extensions\HttpWebResponseExtensions.cs" />
<Compile Include="Extensions\HttpWebRequestExtensions.cs" />
......@@ -105,9 +106,6 @@
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Titanium_Proxy_Test_Root.cer">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<None Include="makecert.exe">
......
......@@ -21,6 +21,5 @@
<file src="bin\$configuration$\Titanium.Web.Proxy.dll" target="lib\net40" />
<file src="bin\$configuration$-Net45\Titanium.Web.Proxy.dll" target="lib\net45" />
<file src="bin\$configuration$\makecert.exe" target="content" />
<file src="bin\$configuration$\Titanium_Proxy_Test_Root.cer" target="content" />
</files>
</package>
\ No newline at end of file
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