Skip to content

Commit

Permalink
Fix for headers getting duplicated - xplicit#42
Browse files Browse the repository at this point in the history
  • Loading branch information
Jesse Pasichnyk committed May 25, 2016
1 parent 392064f commit c187658
Showing 1 changed file with 38 additions and 12 deletions.
50 changes: 38 additions & 12 deletions src/Mono.WebServer.HyperFastCgi/Request.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ public class Request
private int port = -1;
private string vhost = null;
//headers
private string[] knownHeaders;
private Dictionary<string,string> unknownHeadersDict = new Dictionary<string, string> ();
private string[] knownHeaders;
private Dictionary<string, string> unknownHeadersDict = new Dictionary<string, string> ();
private string[][] unknownHeaders;

public ushort RequestId {
Expand All @@ -66,8 +66,8 @@ public ushort RequestId {

public Request (ushort requestId)
{
this.requestId = requestId;
knownHeaders = new string[HttpWorkerRequest.RequestHeaderMaximum];
this.requestId = requestId;
knownHeaders = new string[HttpWorkerRequest.RequestHeaderMaximum];
}

public byte [] InputData {
Expand Down Expand Up @@ -168,27 +168,53 @@ private void ParseParameters (byte[] data, bool parseHeaders)
value = enc.GetString (data, offset, vlen);
offset += vlen;

parameter_table.Add (name, value);

if (parseHeaders) {
if (IsServerVariable(name))
{
if (parameter_table.ContainsKey(name))
throw new ArgumentException(string.Format("Duplicate ServerVariable detected: '{0}'", name));

parameter_table.Add(name, value);
}
else
{
AddOrConcatenateValues(parameter_table, name, value);
}

if (parseHeaders) {
string header = ReformatHttpHeader (name);

if (!String.IsNullOrEmpty (header)) {
int idx = HttpWorkerRequest.GetKnownRequestHeaderIndex (header);

if (idx != -1) {
knownHeaders [idx] = value;
} else {
unknownHeadersDict.Add (header, value);
knownHeaders[idx] = String.IsNullOrEmpty(knownHeaders[idx]) ? value : knownHeaders[idx] + ", " + value;
} else {
AddOrConcatenateValues(unknownHeadersDict, header, value);
}
}
}
}
}


private static void AddOrConcatenateValues<T>(IDictionary<T, string> dict, T key, string value)
{
//if duplicate values are passed, join them into single csv value
if (dict.ContainsKey(key)) {
dict[key] = dict[key] + ", " + value;
} else {
dict.Add(key, value);
}
}

private static bool IsServerVariable(string name)
{
return !name.StartsWith("HTTP_", StringComparison.Ordinal);
}

private static string ReformatHttpHeader (string name)
{
if (name.StartsWith ("HTTP_", StringComparison.Ordinal)) {
if (!IsServerVariable(name)) {
char[] header = new char[name.Length - 5];

// "HTTP_".Length
Expand Down

0 comments on commit c187658

Please sign in to comment.