Skip to content

Commit 843422d

Browse files
author
Ruben Unteregger
committed
Add support for identical client request headers keys.
1 parent db82030 commit 843422d

File tree

10 files changed

+38
-29
lines changed

10 files changed

+38
-29
lines changed

HttpReverseProxy/HostMapping/Interface/OnPostClientHeadersRequest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ public PluginInstruction OnPostClientHeadersRequest(RequestObj requestObj)
2424
{
2525
if (requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Host"))
2626
{
27-
requestObj.ClientRequestObj.ClientRequestHeaders.Remove("Host");
28-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Host", Plugin.HostMapping.Config.Mappings[requestObj.ClientRequestObj.Host].Item2);
27+
requestObj.ClientRequestObj.ClientRequestHeaders["Host"].Clear();
28+
requestObj.ClientRequestObj.ClientRequestHeaders["Host"].Add(Plugin.HostMapping.Config.Mappings[requestObj.ClientRequestObj.Host].Item2);
2929

3030
requestObj.ClientRequestObj.Scheme = Plugin.HostMapping.Config.Mappings[requestObj.ClientRequestObj.Host].Item1;
3131
requestObj.ClientRequestObj.Host = Plugin.HostMapping.Config.Mappings[requestObj.ClientRequestObj.Host].Item2;

HttpReverseProxy/HostMapping/Interface/OnPostServerDataResponse.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void OnPostServerDataResponse(RequestObj requestObj, DataPacket dataPacke
3131
{
3232
throw new ProxyWarningException("The server response content type is invalid");
3333
}
34-
34+
3535
}
3636
}
3737
}

HttpReverseProxy/HttpReverseProxy/Http/RequestHandlerHttp.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,8 @@ private void EditClientRequestData(RequestObj requestObj, SniffedDataChunk sniff
381381
{
382382
foreach (string key in requestObj.ClientRequestObj.ClientRequestHeaders.Keys)
383383
{
384-
this.requestObj.HttpLogData += string.Format("..{0}: {1}", key, requestObj.ClientRequestObj.ClientRequestHeaders[key]);
384+
string logData = string.Join("..", requestObj.ClientRequestObj.ClientRequestHeaders[key]);
385+
this.requestObj.HttpLogData += string.Format("..{0}: {1}", key, logData);
385386
}
386387
}
387388
catch (Exception)

HttpReverseProxy/HttpReverseProxy/Https/RequestHandlerHttps.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,8 @@ private void EditClientRequestData(RequestObj requestObj, SniffedDataChunk sniff
312312
{
313313
foreach (string key in requestObj.ClientRequestObj.ClientRequestHeaders.Keys)
314314
{
315-
this.requestObj.HttpLogData += string.Format("..{0}: {1}", key, requestObj.ClientRequestObj.ClientRequestHeaders[key]);
315+
string logData = string.Join("..", requestObj.ClientRequestObj.ClientRequestHeaders[key]);
316+
this.requestObj.HttpLogData += string.Format("..{0}: {1}", key, logData);
316317
}
317318
}
318319
catch (Exception)

HttpReverseProxy/HttpReverseProxy/ToServer/TcpClientBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public void ForwardRequestC2S(string requestMethod, string path, string httpVers
120120
}
121121

122122

123-
public void ForwardHeadersC2S(Hashtable requestHeaders, byte[] clientNewlineBytes)
123+
public void ForwardHeadersC2S(Dictionary<string, List<string>> requestHeaders, byte[] clientNewlineBytes)
124124
{
125125
byte[] headerByteArray;
126126
string headerString;

HttpReverseProxy/HttpReverseProxyLib/DataTypes/Class/Client/ClientRequest.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace HttpReverseProxyLib.DataTypes.Class.Client
22
{
33
using System.Collections;
4+
using System.Collections.Generic;
45
using System.IO;
56

67

@@ -17,7 +18,7 @@ public class ClientRequest
1718
private DataContentTypeEncoding contentTypeEncoding;
1819

1920
private IncomingClientRequest clientWebRequestHandler;
20-
private Hashtable clientRequestHeaders;
21+
private Dictionary<string, List<string>> clientRequestHeaders;
2122
private MyBinaryReader clientBinaryReader;
2223
private BinaryWriter clientBinaryWriter;
2324

@@ -41,7 +42,7 @@ public class ClientRequest
4142

4243
public IncomingClientRequest ClientWebRequestHandler { get { return this.clientWebRequestHandler; } set { this.clientWebRequestHandler = value; } }
4344

44-
public Hashtable ClientRequestHeaders { get { return this.clientRequestHeaders; } set { this.clientRequestHeaders = value; } }
45+
public Dictionary<string, List<string>> ClientRequestHeaders { get { return this.clientRequestHeaders; } set { this.clientRequestHeaders = value; } }
4546

4647
public MyBinaryReader ClientBinaryReader { get { return this.clientBinaryReader; } set { this.clientBinaryReader = value; } }
4748

@@ -62,7 +63,7 @@ public ClientRequest(string defaultHost)
6263
this.defaultHost = defaultHost;
6364

6465
this.clientRequestContentLength = 0;
65-
this.clientRequestHeaders = new Hashtable();
66+
this.clientRequestHeaders = new Dictionary<string, List<string>>();
6667
this.contentTypeEncoding = new DataContentTypeEncoding();
6768
this.clientBinaryReader = null;
6869
this.clientBinaryWriter = null;

HttpReverseProxy/HttpReverseProxyLib/IncomingClientRequest.cs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using HttpReverseProxyLib.DataTypes.Enum;
66
using HttpReverseProxyLib.Exceptions;
77
using System;
8+
using System.Collections.Generic;
89
using System.Linq;
910
using System.Net;
1011
using System.Text;
@@ -58,7 +59,7 @@ public void ReceiveClientRequestHeaders(RequestObj requestObj)
5859
throw exception;
5960
}
6061

61-
requestObj.ClientRequestObj.Host = requestObj.ClientRequestObj.ClientRequestHeaders["Host"].ToString();
62+
requestObj.ClientRequestObj.Host = requestObj.ClientRequestObj.ClientRequestHeaders["Host"][0];
6263
requestObj.ClientRequestObj.Scheme = "http";
6364

6465
// Parse Client request content type
@@ -226,25 +227,30 @@ private void ParseClientRequestHeaders(RequestObj requestObj)
226227
httpHeaders[0] = httpHeaders[0].Trim();
227228
httpHeaders[1] = httpHeaders[1].Trim();
228229

230+
if (!requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey(httpHeaders[0]))
231+
{
232+
requestObj.ClientRequestObj.ClientRequestHeaders.Add(httpHeaders[0], new List<string>());
233+
}
234+
229235
switch (httpHeaders[0].ToLower())
230236
{
231237
case "host":
232-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Host", httpHeaders[1]);
238+
requestObj.ClientRequestObj.ClientRequestHeaders["Host"].Add(httpHeaders[1]);
233239
break;
234240
case "user-agent":
235-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("User-Agent", httpHeaders[1]);
241+
requestObj.ClientRequestObj.ClientRequestHeaders["User-Agent"].Add(httpHeaders[1]);
236242
break;
237243
case "accept":
238-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Accept", httpHeaders[1]);
244+
requestObj.ClientRequestObj.ClientRequestHeaders["Accept"].Add(httpHeaders[1]);
239245
break;
240246
case "referer":
241-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Referer", httpHeaders[1]);
247+
requestObj.ClientRequestObj.ClientRequestHeaders["Referer"].Add(httpHeaders[1]);
242248
break;
243249
case "cookie":
244-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Cookie", httpHeaders[1]);
250+
requestObj.ClientRequestObj.ClientRequestHeaders["Cookie"].Add(httpHeaders[1]);
245251
break;
246252
case "connection":
247-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Connection", httpHeaders[1]);
253+
requestObj.ClientRequestObj.ClientRequestHeaders["Connection"].Add(httpHeaders[1]);
248254
if (httpHeaders[1].ToLower().Trim() == "close")
249255
{
250256
requestObj.ClientRequestObj.IsClientKeepAlive = false;
@@ -265,24 +271,24 @@ private void ParseClientRequestHeaders(RequestObj requestObj)
265271
case "content-length":
266272
int.TryParse(httpHeaders[1], out contentLen);
267273
requestObj.ClientRequestObj.ClientRequestContentLength = contentLen;
268-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Content-Length", httpHeaders[1]);
274+
requestObj.ClientRequestObj.ClientRequestHeaders["Content-Length"].Add(httpHeaders[1]);
269275
break;
270276
case "content-type":
271-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("Content-Type", httpHeaders[1]);
277+
requestObj.ClientRequestObj.ClientRequestHeaders["Content-Type"].Add(httpHeaders[1]);
272278
break;
273279
case "if-modified-since":
274280
string[] sb = httpHeaders[1].Trim().Split(new char[] { ';' });
275281
DateTime d;
276282
if (DateTime.TryParse(sb[0], out d))
277283
{
278-
requestObj.ClientRequestObj.ClientRequestHeaders.Add("If-Modified-Since", httpHeaders[1]);
284+
requestObj.ClientRequestObj.ClientRequestHeaders["If-Modified-Since"].Add(httpHeaders[1]);
279285
}
280286

281287
break;
282288
default:
283289
try
284290
{
285-
requestObj.ClientRequestObj.ClientRequestHeaders.Add(httpHeaders[0], httpHeaders[1]);
291+
requestObj.ClientRequestObj.ClientRequestHeaders[httpHeaders[0]].Add( httpHeaders[1]);
286292
}
287293
catch (Exception ex)
288294
{
@@ -296,7 +302,7 @@ private void ParseClientRequestHeaders(RequestObj requestObj)
296302
}
297303

298304

299-
private DataContentTypeEncoding DetermineClientRequestContentTypeEncoding(RequestObj requestObj) //Hashtable headers)
305+
private DataContentTypeEncoding DetermineClientRequestContentTypeEncoding(RequestObj requestObj)
300306
{
301307
DataContentTypeEncoding contentTypeEncoding = new DataContentTypeEncoding();
302308

@@ -317,7 +323,7 @@ private DataContentTypeEncoding DetermineClientRequestContentTypeEncoding(Reques
317323

318324
// If there is no content type headerByteArray set the default values
319325
if (!requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Content-Type") ||
320-
string.IsNullOrEmpty(requestObj.ClientRequestObj.ClientRequestHeaders["Content-Type"].ToString()))
326+
string.IsNullOrEmpty(requestObj.ClientRequestObj.ClientRequestHeaders["Content-Type"][0]))
321327
{
322328
contentTypeEncoding.ContentType = "text/html";
323329
contentTypeEncoding.ContentCharSet = "UTF-8";
@@ -330,7 +336,7 @@ private DataContentTypeEncoding DetermineClientRequestContentTypeEncoding(Reques
330336
// Parse the server response content type
331337
try
332338
{
333-
string contentType = requestObj.ClientRequestObj.ClientRequestHeaders["Content-Type"].ToString();
339+
string contentType = requestObj.ClientRequestObj.ClientRequestHeaders["Content-Type"][0];
334340

335341
if (contentType.Contains(";"))
336342
{
@@ -390,7 +396,7 @@ private void DetermineClientRequestContentLength(RequestObj requestObj)
390396
{
391397
if (requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Content-Length"))
392398
{
393-
string contentLen = requestObj.ClientRequestObj.ClientRequestHeaders["Content-Length"].ToString();
399+
string contentLen = requestObj.ClientRequestObj.ClientRequestHeaders["Content-Length"][0];
394400
requestObj.ClientRequestObj.ClientRequestContentLength = int.Parse(contentLen);
395401
}
396402
else if (requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Transfer-Encoding"))
@@ -416,7 +422,7 @@ private DataTransmissionMode DetermineDataTransmissionModeC2S(RequestObj request
416422
// Transfer behavior is "Content-Length"
417423
if (requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Content-Length"))
418424
{
419-
string contentLen = requestObj.ClientRequestObj.ClientRequestHeaders["Content-Length"].ToString();
425+
string contentLen = requestObj.ClientRequestObj.ClientRequestHeaders["Content-Length"][0];
420426
requestObj.ClientRequestObj.ClientRequestContentLength = int.Parse(contentLen);
421427
Logging.Instance.LogMessage(requestObj.Id, requestObj.ProxyProtocol, Loglevel.DEBUG, "IncomingClientRequest.DetermineDataTransmissionModeC2S(): ContainsKey(Content-Length)");
422428

HttpReverseProxy/HttpReverseProxyLib/Interface/IOutgoingRequestClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public interface IOutgoingRequestClient
1919
// Client header transfer
2020
void ForwardRequestC2S(string requestMethod, string path, string httpVersion, byte[] newlineBytes);
2121

22-
void ForwardHeadersC2S(Hashtable requestHeaders, byte[] clientNewlineBytes);
22+
void ForwardHeadersC2S(Dictionary<string, List<string>> requestHeaders, byte[] clientNewlineBytes);
2323

2424
void ReadServerStatusLine(RequestObj requestObj);
2525

HttpReverseProxy/Inject/Interface/OnPostClientHeaderRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public PluginInstruction OnPostClientHeadersRequest(RequestObj requestObj)
3838
return instruction;
3939
}
4040

41-
string host = requestObj.ClientRequestObj.ClientRequestHeaders["Host"].ToString();
41+
string host = requestObj.ClientRequestObj.ClientRequestHeaders["Host"][0];
4242
string path = requestObj.ClientRequestObj.RequestLine.Path;
4343

4444
foreach (DataTypes.InjectConfigRecord tmpRecord in HttpReverseProxy.Plugin.Inject.Config.InjectRecords)

HttpReverseProxy/Weaken/Interface/OnPostClientHeaderRequest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public PluginInstruction OnPostClientHeadersRequest(RequestObj requestObj)
5252
try
5353
{
5454
if (requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Accept-Encoding") &&
55-
Regex.Match(requestObj.ClientRequestObj.ClientRequestHeaders["Accept-Encoding"].ToString(), @"(gzip|deflate|compress)", RegexOptions.IgnoreCase).Success)
55+
Regex.Match(requestObj.ClientRequestObj.ClientRequestHeaders["Accept-Encoding"][0], @"(gzip|deflate|compress)", RegexOptions.IgnoreCase).Success)
5656
{
5757
Logging.Instance.LogMessage(requestObj.Id, ProxyProtocol.Undefined, Loglevel.DEBUG, "Weaken.OnPostClientHeaderRequest(): Remove \"Accept -Encoding: gzip|deflate|compress\"");
5858
requestObj.ClientRequestObj.ClientRequestHeaders.Remove("Accept-Encoding");
@@ -69,7 +69,7 @@ public PluginInstruction OnPostClientHeadersRequest(RequestObj requestObj)
6969
try
7070
{
7171
if (requestObj.ClientRequestObj.ClientRequestHeaders.ContainsKey("Upgrade") &&
72-
Regex.Match(requestObj.ClientRequestObj.ClientRequestHeaders["Upgrade"].ToString(), "^TLS.*", RegexOptions.IgnoreCase).Success)
72+
Regex.Match(requestObj.ClientRequestObj.ClientRequestHeaders["Upgrade"][0], "^TLS.*", RegexOptions.IgnoreCase).Success)
7373
{
7474
Logging.Instance.LogMessage(requestObj.Id, ProxyProtocol.Undefined, Loglevel.DEBUG, "Weaken.OnPostClientHeaderRequest(): Remove \"Upgrade: TLS.*\"");
7575
requestObj.ClientRequestObj.ClientRequestHeaders.Remove("Upgrade");

0 commit comments

Comments
 (0)