ln.http/HttpRequest.cs

179 lines
5.3 KiB
C#

using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using ln.http.exceptions;
using ln.http.resources.session;
namespace ln.http
{
public class HttpRequest
{
Dictionary<String, String> requestHeaders;
Dictionary<String, String> requestCookies;
public IPEndPoint RemoteEndpoint { get; private set; }
public IPEndPoint LocalEndpoint { get; private set; }
public Uri BaseURI { get; set; }
public Uri URI { get; private set; }
public String Method { get; private set; }
public String RequestURL { get; private set; }
public String Protocol { get; private set; }
public String Hostname { get; private set; }
public int Port { get; private set; }
public QueryStringParameters Query { get; private set; }
public Session Session { get; private set; }
public HttpRequest(HttpReader httpReader,IPEndPoint localEndpoint)
{
LocalEndpoint = localEndpoint;
RemoteEndpoint = httpReader.RemoteEndpoint;
Method = httpReader.Method;
Protocol = httpReader.Protocol;
RequestURL = httpReader.URL;
requestHeaders = new Dictionary<string, string>(httpReader.Headers);
requestCookies = new Dictionary<string, string>();
Setup();
}
private void Setup()
{
SetupResourceURI();
SetupCookies();
}
/*
* SetupResourceURI()
*
* Setup the following fields:
*
* - Hostname
* - Port
* - BaseURI
* - URI
* - Query
*
*/
private void SetupResourceURI()
{
String host = GetRequestHeader("HOST");
String[] hostTokens = host.Split(':');
Hostname = hostTokens[0];
Port = (hostTokens.Length > 1) ? int.Parse(hostTokens[1]) : LocalEndpoint.Port;
BaseURI = new UriBuilder("http", Hostname, Port).Uri;
URI = new Uri(BaseURI, RequestURL);
Query = new QueryStringParameters(URI.Query);
}
private void SetupCookies()
{
string cookies = GetRequestHeader("COOKIE");
foreach (String cookie in cookies.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
{
string[] c = cookie.Split(new char[] { '=' }, 2);
string cn, cv;
cn = c[0].Trim();
if (c.Length > 1)
cv = c[1].Trim();
else
cv = "";
if (!this.requestCookies.ContainsKey(cn))
this.requestCookies.Add(cn, cv);
}
}
public void ApplySession(SessionCache sessionCache)
{
Session session = sessionCache.ApplySession(this);
Session = session;
if (Session == null)
{
requestHeaders.Add("X-LNH-Session-Failed", "true");
Session = new Session();
}
}
public HttpUser CurrentUser => Session.CurrentUser;
public override string ToString()
{
//return string.Format("[HttpRequest: RemoteEndpoint={0}, Hostname={1} Port={2} URI={4}, Method={4}, RequestURL={5}, Protocol={6} Query={7}]", RemoteEndpoint, URI, Method, RequestURL, Protocol, Hostname, Port,Query);
return base.ToString();
}
public String GetRequestHeader(String name)
{
return GetRequestHeader(name, "");
}
public String GetRequestHeader(String name, String def)
{
name = name.ToUpper();
if (requestHeaders.ContainsKey(name))
return requestHeaders[name];
return def;
}
public String[] RequestHeaderNames => requestHeaders.Keys.ToArray();
public String[] CookieNames => requestCookies.Keys.ToArray();
public bool ContainsCookie(String name)
{
return this.requestCookies.ContainsKey(name);
}
public String GetCookie(String name)
{
return requestCookies[name];
}
public HttpResponse Redirect(string location,int status = 301)
{
HttpResponse httpResponse = new HttpResponse(this);
httpResponse.AddHeader("location", location);
httpResponse.StatusCode = status;
httpResponse.AddHeader("content-type", "text/plain");
httpResponse.ContentWriter.WriteLine("Redirect: {0}", location);
return httpResponse;
}
//private void SendResponse()
//{
// using (StreamWriter writer = new StreamWriter(this.stream))
// {
// ResponseStream.Position = 0;
// SetResponseHeader("Content-Length", responseStream.Length.ToString());
// writer.WriteLine("{0} {1} {2}", Protocol, StatusCode, HttpStatusCodes.GetStatusMessage(StatusCode));
// foreach (String rhName in responseHeaders.Keys){
// writer.WriteLine("{0}: {1}", rhName, responseHeaders[rhName]);
// }
// writer.WriteLine();
// writer.Flush();
// responseStream.CopyTo(this.stream);
// }
//}
}
}