Commit 0e5b0299 authored by Honfika's avatar Honfika

Upgrade to Websocket fix

parent 0dd28233
......@@ -81,6 +81,10 @@ namespace Titanium.Web.Proxy.Examples.Wpf
SessionListItem item;
if (sessionDictionary.TryGetValue(e, out item))
{
item.Response.ResponseStatusCode = e.WebSession.Response.ResponseStatusCode;
item.Response.ResponseStatusDescription = e.WebSession.Response.ResponseStatusDescription;
item.Response.HttpVersion = e.WebSession.Response.HttpVersion;
item.Response.ResponseHeaders.AddHeaders(e.WebSession.Response.ResponseHeaders);
item.Update();
}
});
......
......@@ -6,9 +6,7 @@ using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Titanium.Web.Proxy.Extensions;
using Titanium.Web.Proxy.Models;
using Titanium.Web.Proxy.Network.Tcp;
using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Helpers
{
......@@ -115,43 +113,13 @@ namespace Titanium.Web.Proxy.Helpers
/// relays the input clientStream to the server at the specified host name and port with the given httpCmd and headers as prefix
/// Usefull for websocket requests
/// </summary>
/// <param name="httpCmd"></param>
/// <param name="requestHeaders"></param>
/// <param name="clientStream"></param>
/// <param name="connection"></param>
/// <param name="onDataSend"></param>
/// <param name="onDataReceive"></param>
/// <returns></returns>
internal static async Task SendRaw(string httpCmd, IEnumerable<HttpHeader> requestHeaders, Stream clientStream, TcpConnection connection, Action<byte[], int, int> onDataSend, Action<byte[], int, int> onDataReceive)
internal static async Task SendRaw(Stream clientStream, TcpConnection connection, Action<byte[], int, int> onDataSend, Action<byte[], int, int> onDataReceive)
{
//prepare the prefix content
if (httpCmd != null || requestHeaders != null)
{
using (var ms = new MemoryStream())
using (var writer = new StreamWriter(ms, Encoding.ASCII) { NewLine = ProxyConstants.NewLine })
{
if (httpCmd != null)
{
writer.WriteLine(httpCmd);
}
if (requestHeaders != null)
{
foreach (string header in requestHeaders.Select(t => t.ToString()))
{
writer.WriteLine(header);
}
}
writer.WriteLine();
writer.Flush();
var data = ms.ToArray();
await clientStream.WriteAsync(data, 0, data.Length);
onDataSend?.Invoke(data, 0, data.Length);
}
}
var tunnelStream = connection.Stream;
//Now async relay all server=>client & client=>server data
......
......@@ -6,6 +6,7 @@ using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Titanium.Web.Proxy.EventArguments;
......@@ -178,7 +179,7 @@ namespace Titanium.Web.Proxy
//create new connection
using (var connection = await GetServerConnection(connectArgs))
{
await TcpHelper.SendRaw(null, null, clientStream, connection,
await TcpHelper.SendRaw(clientStream, connection,
(buffer, offset, count) => { connectArgs.OnDataSent(buffer, offset, count); }, (buffer, offset, count) => { connectArgs.OnDataReceived(buffer, offset, count); });
Interlocked.Decrement(ref serverConnectionCount);
}
......@@ -375,7 +376,36 @@ namespace Titanium.Web.Proxy
//if upgrading to websocket then relay the requet without reading the contents
if (args.WebSession.Request.UpgradeToWebSocket)
{
await TcpHelper.SendRaw(httpCmd, args.WebSession.Request.RequestHeaders, clientStream, connection,
//prepare the prefix content
var requestHeaders = args.WebSession.Request.RequestHeaders;
using (var ms = new MemoryStream())
using (var writer = new StreamWriter(ms, Encoding.ASCII) { NewLine = ProxyConstants.NewLine })
{
writer.WriteLine(httpCmd);
if (requestHeaders != null)
{
foreach (string header in requestHeaders.Select(t => t.ToString()))
{
writer.WriteLine(header);
}
}
writer.WriteLine();
writer.Flush();
var data = ms.ToArray();
await connection.Stream.WriteAsync(data, 0, data.Length);
}
string httpStatus = await connection.StreamReader.ReadLineAsync();
//todo: parse status
await HeaderParser.ReadHeaders(connection.StreamReader, args.WebSession.Response.ResponseHeaders);
await clientStreamWriter.WriteLineAsync(httpStatus);
await WriteResponseHeaders(clientStreamWriter, args.WebSession.Response);
await TcpHelper.SendRaw(clientStream, connection,
(buffer, offset, count) => { args.OnDataSent(buffer, offset, count); }, (buffer, offset, count) => { args.OnDataReceived(buffer, offset, count); });
args.Dispose();
......
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