public void Handle() { ILoggerFactoryAdapter loggerFactoryAdapter = LogManager.Adapter; if (loggerFactoryAdapter is IObjectCloudLoggingFactoryAdapter) ((IObjectCloudLoggingFactoryAdapter)loggerFactoryAdapter).RemoteEndPoint = RemoteEndPoint; log.Info("File Requested : " + _RequestedFile + "\n===================\n"); try { try { _Method = Enum<WebMethod>.Parse(Request.getMethod()); } catch { log.Warn(Request.getMethod() + " isn't supported"); _Method = WebMethod.other; } /* AuthType: is null Cookies: is null HeaderNames: org.eclipse.jetty.http.HttpFields$3@16e4abc Method: GET PathInfo: /abc PathTranslated: is null ContextPath: is null QueryString: a=b RemoteUser: is null UserPrincipal: is null RequestedSessionId: is null RequestURI: /abc RequestURL: http://localhost:1080/abc ServletPath: */ IWebResults webResults; try { _HttpVersion = null; string queryString = Request.getQueryString(); if (null != queryString) if (queryString.Length > 0) _GetParameters = new RequestParameters(queryString); else _GetParameters = new RequestParameters(); else _GetParameters = new RequestParameters(); StringBuilder headers = new StringBuilder("Headers:\n"); for (java.util.Enumeration headernameEnumerator = Request.getHeaderNames(); headernameEnumerator.hasMoreElements(); ) { string headerName = (string)headernameEnumerator.nextElement(); string headerValue = Request.getHeader(headerName); _Header[headerName.ToUpper()] = headerValue; headers.AppendLine(string.Format("\t{0}: {1}", headerName, headerValue)); log.Info(headers.ToString()); } ReadPropertiesFromHeader(); LoadSession(); javax.servlet.ServletInputStream inStream = Request.getInputStream(); List<byte[]> dataRecieved = new List<byte[]>(); byte[] buffer = new byte[0x10000]; int bytesRead; int totalBytesRead = 0; do { bytesRead = inStream.read(buffer, 0, buffer.Length); if (bytesRead > 0) { byte[] copy = new byte[bytesRead]; Array.Copy(buffer, copy, bytesRead); dataRecieved.Add(copy); totalBytesRead += bytesRead; } } while (bytesRead >= 0); byte[] payload = new byte[totalBytesRead]; int bytesCopied = 0; foreach (byte[] copy in dataRecieved) { Array.Copy(copy, 0, payload, bytesCopied, copy.Length); bytesCopied += copy.Length; } _Content = new WebConnectionContent.InMemory(payload); TryDecodePostParameters(); if (WebServer.FileHandlerFactoryLocator.HostnameAndPort.Equals(RequestedHost)) { // Generate the results for the client. The action taken can vary, depending on file name and arguments DateTime generateResultsStartTime = DateTime.UtcNow; webResults = GenerateResultsForClient(); if (log.IsDebugEnabled) log.Debug(string.Format("GenerateResultsForClient() handled in time: {0}", DateTime.UtcNow - generateResultsStartTime)); } else { // The user requested the wrong host; redirect string redirectUrl = "http://" + WebServer.FileHandlerFactoryLocator.HostnameAndPort + RequestedFile; if (GetParameters.Count > 0) redirectUrl += "&" + GetParameters.ToURLEncodedString(); webResults = WebResults.Redirect(redirectUrl); } } catch (Exception e) { log.Error("Exception occured while handling a web request", e); webResults = WebResults.FromString(Status._500_Internal_Server_Error, "An unhandled error occured"); } Response.setStatus((int)webResults.Status); Response.setContentLength(webResults.Body.Length); foreach (KeyValuePair<string, string> header in webResults.Headers) Response.setHeader(header.Key, header.Value); if (null != _Session) { // Make sure that the session cookie is sent... // It is set last to make sure that all changes to the session are persisted CookieToSet sessionCookie = new CookieToSet("SESSION"); sessionCookie.Path = "/"; sessionCookie.Value = _Session.SessionId.ToString(); if (_Session.KeepAlive) { TimeSpan maxAge = _Session.MaxAge; sessionCookie.Expires = DateTime.UtcNow + maxAge; sessionCookie.Value = sessionCookie.Value + ", " + maxAge.TotalDays.ToString(CultureInfo.InvariantCulture); } CookiesToSet.Add(sessionCookie); } foreach (CookieToSet cookie in CookiesToSet) { javax.servlet.http.Cookie jCookie = new javax.servlet.http.Cookie( HTTPStringFunctions.EncodeRequestParametersForBrowser(cookie.Name), HTTPStringFunctions.EncodeRequestParametersForBrowser(cookie.Value)); jCookie.setPath(cookie.Path); if (null != cookie.Expires) { TimeSpan maxAge = cookie.Expires.Value - DateTime.UtcNow; jCookie.setMaxAge(Convert.ToInt32(maxAge.TotalSeconds)); } jCookie.setSecure(cookie.Secure); Response.addCookie(jCookie); } Response.setHeader("Server", WebServer.ServerType); Response.getOutputStream().write(webResults.Body); } finally { if (loggerFactoryAdapter is IObjectCloudLoggingFactoryAdapter) { IObjectCloudLoggingFactoryAdapter loggerFactoryAdapterOC = (IObjectCloudLoggingFactoryAdapter)loggerFactoryAdapter; loggerFactoryAdapterOC.RemoteEndPoint = null; loggerFactoryAdapterOC.Session = null; } } }
/// <summary> /// Formats the cookies to send for the header of the response to the client /// </summary> /// <param name="cookiesToSend"></param> /// <param name="cookiesToSendExpiration"></param> /// <returns></returns> protected string FormatCookiesToSend() { if (null != _Session) { // Make sure that the session cookie is sent... // It is set last to make sure that all changes to the session are persisted CookieToSet sessionCookie = new CookieToSet("SESSION"); sessionCookie.Path = "/"; sessionCookie.Value = _Session.SessionId.ToString(); if (_Session.KeepAlive) { TimeSpan maxAge = _Session.MaxAge; sessionCookie.Expires = DateTime.UtcNow + maxAge; sessionCookie.Value = sessionCookie.Value + ", " + maxAge.TotalDays.ToString(CultureInfo.InvariantCulture); } CookiesToSet.Add(sessionCookie); } StringBuilder toReturn = new StringBuilder(); foreach (CookieToSet cookieToSet in CookiesToSet) { toReturn.AppendFormat( "Set-Cookie: {0}={1}; ", HTTPStringFunctions.EncodeRequestParametersForBrowser(cookieToSet.Name), HTTPStringFunctions.EncodeRequestParametersForBrowser(cookieToSet.Value)); if (null != cookieToSet.Expires) toReturn.AppendFormat( "expires={0} GMT; ", cookieToSet.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss")); if (cookieToSet.Secure) toReturn.Append("Secure; "); if (null != cookieToSet.Path) toReturn.AppendFormat("Path={0}; ", cookieToSet.Path); toReturn.Append("\r\n"); } return toReturn.ToString(); }
public override void SendResults(IWebResults webResults) { Response.KeepAlive = WebServer.KeepAlive; Response.StatusCode = (int)webResults.Status; foreach (KeyValuePair<string, string> header in webResults.Headers) Response.Headers[header.Key] = header.Value; if (null != _Session) { // Make sure that the session cookie is sent... // It is set last to make sure that all changes to the session are persisted CookieToSet sessionCookie = new CookieToSet("SESSION"); sessionCookie.Path = "/"; sessionCookie.Value = _Session.SessionId.ToString(); if (_Session.KeepAlive) { TimeSpan maxAge = _Session.MaxAge; sessionCookie.Expires = DateTime.UtcNow + maxAge; sessionCookie.Value = sessionCookie.Value + ", " + maxAge.TotalDays.ToString(CultureInfo.InvariantCulture); } CookiesToSet.Add(sessionCookie); } // Use the HttpListener version of this server is discouraged. It just doesn't set cookies in a reliable manner CookieCollection cookies = new CookieCollection(); foreach (CookieToSet cookie in CookiesToSet) { Cookie nCookie = new Cookie( HTTPStringFunctions.EncodeRequestParametersForBrowser(cookie.Name), HTTPStringFunctions.EncodeRequestParametersForBrowser(cookie.Value)); cookies.Add(nCookie); if (null != cookie.Expires) nCookie.Expires = cookie.Expires.Value; nCookie.Secure = cookie.Secure; nCookie.Path = cookie.Path; nCookie.Version = 2; } Response.Cookies = cookies; Response.Headers["Server"] = WebServer.ServerType; Response.ContentType = webResults.ContentType; Response.ContentLength64 = webResults.ResultsAsStream.Length; // TODO: Move these to some kind of a writer thread byte[] buffer = new byte[webResults.ResultsAsStream.Length]; webResults.ResultsAsStream.Read(buffer, 0, buffer.Length); Response.OutputStream.Write(buffer, 0, buffer.Length); Response.OutputStream.Flush(); Response.Close(); _Connected = false; }