Commit dfe252ca authored by justcoding121's avatar justcoding121 Committed by justcoding121

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