Commit 1207f21a authored by titanium007's avatar titanium007

issue #2 fix

Add Basic Authentication header if it does not exists in response
header. This is needed for prompting the user when all other
authentication method fails (like NTLM & Negotiate)
parent cd77ea43
......@@ -41,6 +41,7 @@ namespace Titanium.HTTPProxyServer
header = s;
value = response.Headers[s];
}
else
returnHeaders.Add(new Tuple<String, String>(s, response.Headers[s]));
}
......@@ -53,7 +54,11 @@ namespace Titanium.HTTPProxyServer
returnHeaders.Add(new Tuple<String, String>("Set-Cookie", cookie));
}
if (returnHeaders.Any(x => x.Item1.ToLower().Equals("www-authenticate")))
{
if (returnHeaders.Any(x => x.Item1.ToLower().Equals("www-authenticate") == false && x.Item2.ToLower().Equals("basic") == false))
returnHeaders.Add(new Tuple<String, String>("WWW-Authenticate", "Basic"));
}
return returnHeaders;
}
......@@ -73,7 +78,7 @@ namespace Titanium.HTTPProxyServer
myResponseWriter.WriteLine(String.Format("{0}: {1}", header.Item1, header.Item2));
}
}
}
myResponseWriter.WriteLine();
......@@ -109,7 +114,7 @@ namespace Titanium.HTTPProxyServer
while (!String.IsNullOrWhiteSpace(httpCmd))
{
String[] header = httpCmd.Split(colonSpaceSplit, 2, StringSplitOptions.None);
switch (header[0].ToLower())
{
......@@ -129,93 +134,93 @@ namespace Titanium.HTTPProxyServer
private static void ReadRequestHeaders(ref List<string> requestLines, HttpWebRequest webReq)
{
for(int i=1; i<requestLines.Count; i++)
for (int i = 1; i < requestLines.Count; i++)
{
String httpCmd = requestLines[i];
String[] header = httpCmd.Split(colonSpaceSplit, 2, StringSplitOptions.None);
if(!String.IsNullOrEmpty(header[0].Trim()))
switch (header[0].ToLower())
{
case "accept":
webReq.Accept = header[1];
break;
case "accept-encoding":
webReq.Headers.Add(header[0], "gzip,deflate,zlib");
break;
case "cookie":
webReq.Headers["Cookie"] = header[1];
break;
case "connection":
if (header[1].ToLower() == "keep-alive")
webReq.KeepAlive = true;
break;
case "content-length":
int contentLen;
int.TryParse(header[1], out contentLen);
if (contentLen != 0)
webReq.ContentLength = contentLen;
break;
case "content-type":
webReq.ContentType = header[1];
break;
case "expect":
if (header[1].ToLower() == "100-continue")
webReq.ServicePoint.Expect100Continue = true;
else
webReq.Expect = header[1];
break;
case "host":
webReq.Host = header[1];
break;
case "if-modified-since":
String[] sb = header[1].Trim().Split(semiSplit);
DateTime d;
if (DateTime.TryParse(sb[0], out d))
webReq.IfModifiedSince = d;
break;
case "proxy-connection":
break;
case "range":
var startEnd = header[1].Replace(Environment.NewLine, "").Remove(0, 6).Split('-');
if (startEnd.Length > 1) { if (!String.IsNullOrEmpty(startEnd[1])) webReq.AddRange(int.Parse(startEnd[0]), int.Parse(startEnd[1])); else webReq.AddRange(int.Parse(startEnd[0])); }
else
webReq.AddRange(int.Parse(startEnd[0]));
break;
case "referer":
webReq.Referer = header[1];
break;
case "user-agent":
webReq.UserAgent = header[1];
break;
case "transfer-encoding":
if (header[1].ToLower() == "chunked")
webReq.SendChunked = true;
else
webReq.SendChunked = false;
break;
case "upgrade":
if (header[1].ToLower() == "http/1.1")
webReq.Headers.Add(header[0], header[1]);
break;
default:
if(header.Length>0)
webReq.Headers.Add(header[0], header[1]);
else
webReq.Headers.Add(header[0], "");
break;
}
if (!String.IsNullOrEmpty(header[0].Trim()))
switch (header[0].ToLower())
{
case "accept":
webReq.Accept = header[1];
break;
case "accept-encoding":
webReq.Headers.Add(header[0], "gzip,deflate,zlib");
break;
case "cookie":
webReq.Headers["Cookie"] = header[1];
break;
case "connection":
if (header[1].ToLower() == "keep-alive")
webReq.KeepAlive = true;
break;
case "content-length":
int contentLen;
int.TryParse(header[1], out contentLen);
if (contentLen != 0)
webReq.ContentLength = contentLen;
break;
case "content-type":
webReq.ContentType = header[1];
break;
case "expect":
if (header[1].ToLower() == "100-continue")
webReq.ServicePoint.Expect100Continue = true;
else
webReq.Expect = header[1];
break;
case "host":
webReq.Host = header[1];
break;
case "if-modified-since":
String[] sb = header[1].Trim().Split(semiSplit);
DateTime d;
if (DateTime.TryParse(sb[0], out d))
webReq.IfModifiedSince = d;
break;
case "proxy-connection":
break;
case "range":
var startEnd = header[1].Replace(Environment.NewLine, "").Remove(0, 6).Split('-');
if (startEnd.Length > 1) { if (!String.IsNullOrEmpty(startEnd[1])) webReq.AddRange(int.Parse(startEnd[0]), int.Parse(startEnd[1])); else webReq.AddRange(int.Parse(startEnd[0])); }
else
webReq.AddRange(int.Parse(startEnd[0]));
break;
case "referer":
webReq.Referer = header[1];
break;
case "user-agent":
webReq.UserAgent = header[1];
break;
case "transfer-encoding":
if (header[1].ToLower() == "chunked")
webReq.SendChunked = true;
else
webReq.SendChunked = false;
break;
case "upgrade":
if (header[1].ToLower() == "http/1.1")
webReq.Headers.Add(header[0], header[1]);
break;
default:
if (header.Length > 0)
webReq.Headers.Add(header[0], header[1]);
else
webReq.Headers.Add(header[0], "");
break;
}
}
}
}
}
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