Skip to content
This repository was archived by the owner on Jul 9, 2023. It is now read-only.

Commit b584af9

Browse files
authored
Merge pull request #679 from justcoding121/master
beta
2 parents 8fa9ebd + fdfaf87 commit b584af9

32 files changed

+408
-305
lines changed

examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public ProxyTestController()
4242
proxyServer.ForwardToUpstreamGateway = true;
4343
proxyServer.CertificateManager.SaveFakeCertificates = true;
4444

45+
// this is just to show the functionality, provided implementations use junk value
46+
//proxyServer.GetCustomUpStreamProxyFunc = onGetCustomUpStreamProxyFunc;
47+
//proxyServer.CustomUpStreamProxyFailureFunc = onCustomUpStreamProxyFailureFunc;
48+
4549
// optionally set the Certificate Engine
4650
// Under Mono or Non-Windows runtimes only BouncyCastle will be supported
4751
//proxyServer.CertificateManager.CertificateEngine = Network.CertificateEngine.BouncyCastle;
@@ -116,6 +120,18 @@ public void Stop()
116120
//proxyServer.CertificateManager.RemoveTrustedRootCertificates();
117121
}
118122

123+
private async Task<IExternalProxy> onGetCustomUpStreamProxyFunc(SessionEventArgsBase arg)
124+
{
125+
// this is just to show the functionality, provided values are junk
126+
return new ExternalProxy() { BypassLocalhost = false, HostName = "127.0.0.9", Port = 9090, Password = "fake", UserName = "fake", UseDefaultCredentials = false };
127+
}
128+
129+
private async Task<IExternalProxy> onCustomUpStreamProxyFailureFunc(SessionEventArgsBase arg)
130+
{
131+
// this is just to show the functionality, provided values are junk
132+
return new ExternalProxy() { BypassLocalhost = false, HostName = "127.0.0.10", Port = 9191, Password = "fake2", UserName = "fake2", UseDefaultCredentials = false };
133+
}
134+
119135
private async Task onBeforeTunnelConnectRequest(object sender, TunnelConnectSessionEventArgs e)
120136
{
121137
string hostname = e.HttpClient.Request.RequestUri.Host;

examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
<GridViewColumn Header="SentBytes" DisplayMemberBinding="{Binding SentDataCount}" />
3333
<GridViewColumn Header="ReceivedBytes" DisplayMemberBinding="{Binding ReceivedDataCount}" />
3434
<GridViewColumn Header="ClientEndPoint" DisplayMemberBinding="{Binding ClientEndPoint}" />
35+
<GridViewColumn Header="ClientConnectionId" DisplayMemberBinding="{Binding ClientConnectionId}" />
36+
<GridViewColumn Header="ServerConnectionId" DisplayMemberBinding="{Binding ServerConnectionId}" />
3537
</GridView>
3638
</ListView.View>
3739
</ListView>

examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml.cs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,15 @@ await Dispatcher.InvokeAsync(() =>
146146
{
147147
if (sessionDictionary.TryGetValue(e.HttpClient, out var item))
148148
{
149-
item.Update();
149+
item.Update(e);
150150
}
151151
});
152152
}
153153

154154
private async Task ProxyServer_BeforeRequest(object sender, SessionEventArgs e)
155155
{
156+
//if (e.HttpClient.Request.HttpVersion.Major != 2) return;
157+
156158
SessionListItem item = null;
157159
await Dispatcher.InvokeAsync(() => { item = addSession(e); });
158160

@@ -175,7 +177,7 @@ await Dispatcher.InvokeAsync(() =>
175177
{
176178
if (sessionDictionary.TryGetValue(e.HttpClient, out item))
177179
{
178-
item.Update();
180+
item.Update(e);
179181
}
180182
});
181183

@@ -190,7 +192,7 @@ await Dispatcher.InvokeAsync(() =>
190192
e.HttpClient.Response.KeepBody = true;
191193
await e.GetResponseBody();
192194

193-
await Dispatcher.InvokeAsync(() => { item.Update(); });
195+
await Dispatcher.InvokeAsync(() => { item.Update(e); });
194196
if (item == SelectedSession)
195197
{
196198
await Dispatcher.InvokeAsync(selectedSessionChanged);
@@ -225,6 +227,8 @@ private SessionListItem createSessionListItem(SessionEventArgsBase e)
225227
var item = new SessionListItem
226228
{
227229
Number = lastSessionNumber,
230+
ClientConnectionId = e.ClientConnectionId,
231+
ServerConnectionId = e.ServerConnectionId,
228232
HttpClient = e.HttpClient,
229233
ClientEndPoint = e.ClientEndPoint,
230234
IsTunnelConnect = isTunnelConnect
@@ -236,14 +240,16 @@ private SessionListItem createSessionListItem(SessionEventArgsBase e)
236240
var session = (SessionEventArgsBase)sender;
237241
if (sessionDictionary.TryGetValue(session.HttpClient, out var li))
238242
{
239-
var tunnelType = session.HttpClient.ConnectRequest?.TunnelType ?? TunnelType.Unknown;
243+
var connectRequest = session.HttpClient.ConnectRequest;
244+
var tunnelType = connectRequest?.TunnelType ?? TunnelType.Unknown;
240245
if (tunnelType != TunnelType.Unknown)
241246
{
242247
li.Protocol = TunnelTypeToString(tunnelType);
243248
}
244249

245250
li.ReceivedDataCount += args.Count;
246251

252+
//if (tunnelType == TunnelType.Http2)
247253
AppendTransferLog(session.GetHashCode() + (isTunnelConnect ? "_tunnel" : "") + "_received",
248254
args.Buffer, args.Offset, args.Count);
249255
}
@@ -254,15 +260,17 @@ private SessionListItem createSessionListItem(SessionEventArgsBase e)
254260
var session = (SessionEventArgsBase)sender;
255261
if (sessionDictionary.TryGetValue(session.HttpClient, out var li))
256262
{
257-
var tunnelType = session.HttpClient.ConnectRequest?.TunnelType ?? TunnelType.Unknown;
263+
var connectRequest = session.HttpClient.ConnectRequest;
264+
var tunnelType = connectRequest?.TunnelType ?? TunnelType.Unknown;
258265
if (tunnelType != TunnelType.Unknown)
259266
{
260267
li.Protocol = TunnelTypeToString(tunnelType);
261268
}
262269

263270
li.SentDataCount += args.Count;
264271

265-
AppendTransferLog(session.GetHashCode() + (isTunnelConnect ? "_tunnel" : "") + "_sent",
272+
//if (tunnelType == TunnelType.Http2)
273+
AppendTransferLog( session.GetHashCode() + (isTunnelConnect ? "_tunnel" : "") + "_sent",
266274
args.Buffer, args.Offset, args.Count);
267275
}
268276
};
@@ -272,18 +280,22 @@ private SessionListItem createSessionListItem(SessionEventArgsBase e)
272280
te.DecryptedDataReceived += (sender, args) =>
273281
{
274282
var session = (SessionEventArgsBase)sender;
283+
//var tunnelType = session.HttpClient.ConnectRequest?.TunnelType ?? TunnelType.Unknown;
284+
//if (tunnelType == TunnelType.Http2)
275285
AppendTransferLog(session.GetHashCode() + "_decrypted_received", args.Buffer, args.Offset,
276286
args.Count);
277287
};
278288

279289
te.DecryptedDataSent += (sender, args) =>
280290
{
281291
var session = (SessionEventArgsBase)sender;
292+
//var tunnelType = session.HttpClient.ConnectRequest?.TunnelType ?? TunnelType.Unknown;
293+
//if (tunnelType == TunnelType.Http2)
282294
AppendTransferLog(session.GetHashCode() + "_decrypted_sent", args.Buffer, args.Offset, args.Count);
283295
};
284296
}
285297

286-
item.Update();
298+
item.Update(e);
287299
return item;
288300
}
289301

@@ -362,9 +374,15 @@ private void selectedSessionChanged()
362374

363375
//string hexStr = string.Join(" ", data.Select(x => x.ToString("X2")));
364376
var sb = new StringBuilder();
377+
sb.AppendLine("URI: " + request.RequestUri);
365378
sb.Append(request.HeaderText);
366379
sb.Append(request.Encoding.GetString(data));
367-
sb.Append(truncated ? Environment.NewLine + $"Data is truncated after {truncateLimit} bytes" : null);
380+
if (truncated)
381+
{
382+
sb.AppendLine();
383+
sb.Append($"Data is truncated after {truncateLimit} bytes");
384+
}
385+
368386
sb.Append((request as ConnectRequest)?.ClientHelloInfo);
369387
TextBoxRequest.Text = sb.ToString();
370388

@@ -381,7 +399,12 @@ private void selectedSessionChanged()
381399
sb = new StringBuilder();
382400
sb.Append(response.HeaderText);
383401
sb.Append(response.Encoding.GetString(data));
384-
sb.Append(truncated ? Environment.NewLine + $"Data is truncated after {truncateLimit} bytes" : null);
402+
if (truncated)
403+
{
404+
sb.AppendLine();
405+
sb.Append($"Data is truncated after {truncateLimit} bytes");
406+
}
407+
385408
sb.Append((response as ConnectResponse)?.ServerHelloInfo);
386409
if (SelectedSession.Exception != null)
387410
{

examples/Titanium.Web.Proxy.Examples.Wpf/SessionListItem.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.ComponentModel;
33
using System.Net;
44
using System.Runtime.CompilerServices;
5+
using Titanium.Web.Proxy.EventArguments;
56
using Titanium.Web.Proxy.Examples.Wpf.Annotations;
67
using Titanium.Web.Proxy.Http;
78

@@ -18,9 +19,23 @@ public class SessionListItem : INotifyPropertyChanged
1819
private long sentDataCount;
1920
private string statusCode;
2021
private string url;
22+
private Guid clientConnectionId;
23+
private Guid serverConnectionId;
2124

2225
public int Number { get; set; }
2326

27+
public Guid ClientConnectionId
28+
{
29+
get => clientConnectionId;
30+
set => SetField(ref clientConnectionId, value);
31+
}
32+
33+
public Guid ServerConnectionId
34+
{
35+
get => serverConnectionId;
36+
set => SetField(ref serverConnectionId, value);
37+
}
38+
2439
public HttpWebClient HttpClient { get; set; }
2540

2641
public IPEndPoint ClientEndPoint { get; set; }
@@ -123,13 +138,15 @@ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName
123138
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
124139
}
125140

126-
public void Update()
141+
public void Update(SessionEventArgsBase args)
127142
{
128143
var request = HttpClient.Request;
129144
var response = HttpClient.Response;
130145
int statusCode = response?.StatusCode ?? 0;
131146
StatusCode = statusCode == 0 ? "-" : statusCode.ToString();
132147
Protocol = request.RequestUri.Scheme;
148+
ClientConnectionId = args.ClientConnectionId;
149+
ServerConnectionId = args.ServerConnectionId;
133150

134151
if (IsTunnelConnect)
135152
{

src/Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs

Lines changed: 10 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ public bool ReRequest
6565
/// </summary>
6666
public event EventHandler<MultipartRequestPartSentEventArgs>? MultipartRequestPartSent;
6767

68-
private HttpStream getStream(bool isRequest)
69-
{
70-
return isRequest ? (HttpStream)ClientStream : HttpClient.Connection.Stream;
71-
}
72-
7368
/// <summary>
7469
/// Read request body content as bytes[] for current session
7570
/// </summary>
@@ -194,15 +189,15 @@ private async Task readResponseBodyAsync(CancellationToken cancellationToken)
194189
private async Task<byte[]> readBodyAsync(bool isRequest, CancellationToken cancellationToken)
195190
{
196191
using var bodyStream = new MemoryStream();
197-
using var http = new HttpStream(bodyStream, BufferPool);
192+
using var writer = new HttpStream(bodyStream, BufferPool);
198193

199194
if (isRequest)
200195
{
201-
await CopyRequestBodyAsync(http, TransformationMode.Uncompress, cancellationToken);
196+
await CopyRequestBodyAsync(writer, TransformationMode.Uncompress, cancellationToken);
202197
}
203198
else
204199
{
205-
await CopyResponseBodyAsync(http, TransformationMode.Uncompress, cancellationToken);
200+
await copyResponseBodyAsync(writer, TransformationMode.Uncompress, cancellationToken);
206201
}
207202

208203
return bodyStream.ToArray();
@@ -223,9 +218,9 @@ internal async Task SyphonOutBodyAsync(bool isRequest, CancellationToken cancell
223218
return;
224219
}
225220

226-
using var bodyStream = new MemoryStream();
227-
using var http = new HttpStream(bodyStream, BufferPool);
228-
await copyBodyAsync(isRequest, true, http, TransformationMode.None, null, cancellationToken);
221+
var reader = isRequest ? (HttpStream)ClientStream : HttpClient.Connection.Stream;
222+
223+
await reader.CopyBodyAsync(requestResponse, true, new NullWriter(), TransformationMode.None, null, cancellationToken);
229224
}
230225

231226
/// <summary>
@@ -235,13 +230,13 @@ internal async Task SyphonOutBodyAsync(bool isRequest, CancellationToken cancell
235230
internal async Task CopyRequestBodyAsync(IHttpStreamWriter writer, TransformationMode transformation, CancellationToken cancellationToken)
236231
{
237232
var request = HttpClient.Request;
233+
var reader = ClientStream;
238234

239235
long contentLength = request.ContentLength;
240236

241237
// send the request body bytes to server
242238
if (contentLength > 0 && hasMulipartEventSubscribers && request.IsMultipartFormData)
243239
{
244-
var reader = getStream(true);
245240
var boundary = HttpHelper.GetBoundaryFromContentType(request.ContentType);
246241

247242
using (var copyStream = new CopyStream(reader, writer, BufferPool))
@@ -267,54 +262,13 @@ internal async Task CopyRequestBodyAsync(IHttpStreamWriter writer, Transformatio
267262
}
268263
else
269264
{
270-
await copyBodyAsync(true, false, writer, transformation, OnDataSent, cancellationToken);
265+
await reader.CopyBodyAsync(request, false, writer, transformation, OnDataSent, cancellationToken);
271266
}
272267
}
273268

274-
internal async Task CopyResponseBodyAsync(IHttpStreamWriter writer, TransformationMode transformation, CancellationToken cancellationToken)
275-
{
276-
await copyBodyAsync(false, false, writer, transformation, OnDataReceived, cancellationToken);
277-
}
278-
279-
private async Task copyBodyAsync(bool isRequest, bool useOriginalHeaderValues, IHttpStreamWriter writer, TransformationMode transformation, Action<byte[], int, int>? onCopy, CancellationToken cancellationToken)
269+
private async Task copyResponseBodyAsync(IHttpStreamWriter writer, TransformationMode transformation, CancellationToken cancellationToken)
280270
{
281-
var stream = getStream(isRequest);
282-
283-
var requestResponse = isRequest ? (RequestResponseBase)HttpClient.Request : HttpClient.Response;
284-
285-
bool isChunked = useOriginalHeaderValues? requestResponse.OriginalIsChunked : requestResponse.IsChunked;
286-
long contentLength = useOriginalHeaderValues ? requestResponse.OriginalContentLength : requestResponse.ContentLength;
287-
288-
if (transformation == TransformationMode.None)
289-
{
290-
await writer.CopyBodyAsync(stream, isChunked, contentLength, onCopy, cancellationToken);
291-
return;
292-
}
293-
294-
LimitedStream limitedStream;
295-
Stream? decompressStream = null;
296-
297-
string? contentEncoding = useOriginalHeaderValues ? requestResponse.OriginalContentEncoding : requestResponse.ContentEncoding;
298-
299-
Stream s = limitedStream = new LimitedStream(stream, BufferPool, isChunked, contentLength);
300-
301-
if (transformation == TransformationMode.Uncompress && contentEncoding != null)
302-
{
303-
s = decompressStream = DecompressionFactory.Create(CompressionUtil.CompressionNameToEnum(contentEncoding), s);
304-
}
305-
306-
try
307-
{
308-
var http = new HttpStream(s, BufferPool, true);
309-
await writer.CopyBodyAsync(http, false, -1, onCopy, cancellationToken);
310-
}
311-
finally
312-
{
313-
decompressStream?.Dispose();
314-
315-
await limitedStream.Finish();
316-
limitedStream.Dispose();
317-
}
271+
await HttpClient.Connection.Stream.CopyBodyAsync(HttpClient.Response, false, writer, transformation, OnDataReceived, cancellationToken);
318272
}
319273

320274
/// <summary>
@@ -638,7 +592,6 @@ public void Respond(Response response, bool closeServerConnection = false)
638592
HttpClient.Response = response;
639593
HttpClient.Response.Locked = true;
640594
}
641-
642595
}
643596

644597
/// <summary>

src/Titanium.Web.Proxy/EventArguments/SessionEventArgsBase.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ public abstract class SessionEventArgsBase : EventArgs, IDisposable
3333

3434
internal HttpClientStream ClientStream { get; }
3535

36+
public Guid ClientConnectionId => ClientConnection.Id;
37+
38+
public Guid ServerConnectionId => HttpClient.HasConnection ? ServerConnection.Id : Guid.Empty;
39+
3640
protected readonly IBufferPool BufferPool;
3741
protected readonly ExceptionHandler ExceptionFunc;
3842
private bool enableWinAuth;

0 commit comments

Comments
 (0)