package org.jboss.pitbull.servlet.internal; import org.jboss.pitbull.Connection; import org.jboss.pitbull.OrderedHeaders; import org.jboss.pitbull.RequestHeader; import org.jboss.pitbull.internal.NotImplementedYetException; import org.jboss.pitbull.internal.util.ContentType; import org.jboss.pitbull.internal.util.DateUtil; import org.jboss.pitbull.servlet.DeploymentServletContext; import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.http.Part; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.security.Principal; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class HttpServletRequestImpl implements HttpServletRequest { protected Connection connection; protected InputStream underlyingInputStream; protected String authType; protected RequestHeader headerBlob; protected Map<String, Object> attributes = new HashMap<String, Object>(); protected OrderedHeaders headers; protected Cookie[] cookies; protected ServletInputStream servletInputStream; protected BufferedReader reader; protected Date dateHeader; protected String contentType; protected String characterEncoding; protected String requestURL; protected String requestURI; protected String queryString; protected Map<String, String[]> parameters; protected DeploymentServletContext context; public static final String DEFAULT_CHARACTER_ENCODING = "ISO-8859-1"; private static final Cookie[] emptyCookies = new Cookie[0]; public void setContext(DeploymentServletContext context) { this.context = context; } public void setConnection(Connection connection) { this.connection = connection; } public void setIs(InputStream is) { this.underlyingInputStream = is; } public void setHeaderBlob(RequestHeader headerBlob) { this.headerBlob = headerBlob; } protected OrderedHeaders getHeaders() { if (headers == null) { headers = headerBlob.getHeaders(); } return headers; } @Override public String getAuthType() { return authType; } @Override public Cookie[] getCookies() { if (cookies != null) return cookies; List<String> cookieHeaders = getHeaders().getHeaderValues("Cookie"); if (cookieHeaders == null) { cookies = emptyCookies; return cookies; } List<Cookie> cookieList = new ArrayList<Cookie>(); for (String cookieHeader : cookieHeaders) { Set<Cookie> cooks = CookieDecoder.decode(cookieHeader); cookieList.addAll(cooks); } cookies = cookieList.toArray(new Cookie[cookieList.size()]); return cookies; } @Override public long getDateHeader(String name) { if (dateHeader == null) { String val = getHeaders().getFirstHeader("Date"); if (val != null) { dateHeader = DateUtil.parseDate(val); } } if (dateHeader == null) return -1; else return dateHeader.getTime(); } @Override public String getHeader(String name) { return getHeaders().getFirstHeader(name); } @Override public Enumeration<String> getHeaders(String name) { final Iterator<String> it = getHeaders().getHeaderValues(name).iterator(); return new Enumeration<String>() { @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public String nextElement() { return it.next(); } }; } @Override public Enumeration<String> getHeaderNames() { final Iterator<String> it = getHeaders().getHeaderNames().iterator(); return new Enumeration<String>() { @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public String nextElement() { return it.next(); } }; } @Override public int getIntHeader(String name) { String val = getHeaders().getFirstHeader(name); if (val == null) return -1; return Integer.parseInt(val); } @Override public String getMethod() { return headerBlob.getMethod(); } @Override public String getPathInfo() { throw new NotImplementedYetException(); } @Override public String getPathTranslated() { throw new NotImplementedYetException(); } @Override public String getContextPath() { return context.getContextPath(); } @Override public String getQueryString() { if (queryString != null) return queryString; String uri = headerBlob.getUri(); int idx = uri.indexOf('?'); if (idx >= 0) { queryString = uri.substring(idx + 1); } return queryString; } @Override public String getRemoteUser() { throw new NotImplementedYetException(); } @Override public boolean isUserInRole(String role) { return false; } @Override public Principal getUserPrincipal() { throw new NotImplementedYetException(); } @Override public String getRequestedSessionId() { throw new NotImplementedYetException(); } @Override public String getRequestURI() { if (requestURI != null) return requestURI; String uri = headerBlob.getUri(); int idx = uri.indexOf('?'); if (idx >= 0) { uri = uri.substring(0, idx); } requestURI = uri; return requestURI; } @Override public StringBuffer getRequestURL() { // todo support for RequestDispatcher if (requestURL != null) return new StringBuffer(requestURL); StringBuilder builder = new StringBuilder(); if (connection.isSecure()) builder.append("https://"); else builder.append("http://"); String host = getHeaders().getFirstHeader("Host"); if (host == null) { host = connection.getLocalAddress().getHostName(); } builder.append(host); if (host.indexOf(':') < 0) { int local = connection.getLocalAddress().getPort(); if (connection.isSecure() && local != 443) { builder.append(":").append(local); } else if (!connection.isSecure() && local != 80) { builder.append(":").append(local); } } builder.append(getRequestURI()); requestURL = builder.toString(); return new StringBuffer(requestURL); } @Override public String getServletPath() { throw new NotImplementedYetException(); } @Override public HttpSession getSession(boolean create) { throw new NotImplementedYetException(); } @Override public HttpSession getSession() { throw new NotImplementedYetException(); } @Override public boolean isRequestedSessionIdValid() { throw new NotImplementedYetException(); } @Override public boolean isRequestedSessionIdFromCookie() { throw new NotImplementedYetException(); } @Override public boolean isRequestedSessionIdFromURL() { throw new NotImplementedYetException(); } @Override public boolean isRequestedSessionIdFromUrl() { throw new NotImplementedYetException(); } @Override public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { throw new NotImplementedYetException(); } @Override public void login(String username, String password) throws ServletException { throw new NotImplementedYetException(); } @Override public void logout() throws ServletException { throw new NotImplementedYetException(); } @Override public Collection<Part> getParts() throws IOException, ServletException { throw new NotImplementedYetException(); } @Override public Part getPart(String name) throws IOException, ServletException { throw new NotImplementedYetException(); } @Override public Object getAttribute(String name) { return attributes.get(name); } @Override public Enumeration<String> getAttributeNames() { final Iterator<String> it = attributes.keySet().iterator(); return new Enumeration<String>() { @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public String nextElement() { return it.next(); } }; } protected String getCharacterEncodingOrDefault() { String enc = getCharacterEncoding(); if (enc == null) enc = DEFAULT_CHARACTER_ENCODING; return enc; } @Override public String getCharacterEncoding() { if (characterEncoding == null) { characterEncoding = ContentType.getCharsetFromContentType(getContentType()); } return characterEncoding; } @Override public void setCharacterEncoding(String env) throws UnsupportedEncodingException { characterEncoding = env; } @Override public int getContentLength() { String len = getHeader("Content-Length"); if (len == null) return -1; return Integer.parseInt(len); } @Override public String getContentType() { if (contentType == null) { contentType = getHeader("Content-Type"); } return contentType; } @Override public ServletInputStream getInputStream() throws IOException { if (reader != null) throw new IllegalStateException("BufferedReader already being used by HttpServletRequest"); if (servletInputStream == null) { servletInputStream = new ServletInputStreamImpl(underlyingInputStream); } return servletInputStream; } @Override public String getParameter(String name) { String[] values = getParameterMap().get(name); if (values == null || values.length == 0) return null; return values[0]; } @Override public Enumeration<String> getParameterNames() { final Iterator<String> it = getParameterMap().keySet().iterator(); return new Enumeration<String>() { @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public String nextElement() { return it.next(); } }; } @Override public String[] getParameterValues(String name) { return getParameterMap().get(name); } @Override public Map<String, String[]> getParameterMap() { if (parameters == null) { try { parameters = ParameterParser.parseParameters(getQueryString(), underlyingInputStream); } catch (IOException e) { throw new RuntimeException(e); } } return parameters; } @Override public String getProtocol() { throw new NotImplementedYetException(); } @Override public String getScheme() { throw new NotImplementedYetException(); } @Override public String getServerName() { throw new NotImplementedYetException(); } @Override public int getServerPort() { throw new NotImplementedYetException(); } @Override public BufferedReader getReader() throws IOException { if (servletInputStream != null) throw new IllegalStateException("ServletInputStream already being used by HttpServletRequest"); if (reader == null) { reader = new BufferedReader(new InputStreamReader(underlyingInputStream, getCharacterEncodingOrDefault())); } return reader; } @Override public String getRemoteAddr() { throw new NotImplementedYetException(); } @Override public String getRemoteHost() { throw new NotImplementedYetException(); } @Override public void setAttribute(String name, Object o) { attributes.put(name, o); } @Override public void removeAttribute(String name) { attributes.remove(name); } @Override public Locale getLocale() { throw new NotImplementedYetException(); } @Override public Enumeration<Locale> getLocales() { throw new NotImplementedYetException(); } @Override public boolean isSecure() { throw new NotImplementedYetException(); } @Override public RequestDispatcher getRequestDispatcher(String path) { throw new NotImplementedYetException(); } @Override public String getRealPath(String path) { throw new NotImplementedYetException(); } @Override public int getRemotePort() { throw new NotImplementedYetException(); } @Override public String getLocalName() { throw new NotImplementedYetException(); } @Override public String getLocalAddr() { throw new NotImplementedYetException(); } @Override public int getLocalPort() { throw new NotImplementedYetException(); } @Override public ServletContext getServletContext() { throw new NotImplementedYetException(); } @Override public AsyncContext startAsync() throws IllegalStateException { throw new NotImplementedYetException(); } @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { throw new NotImplementedYetException(); } @Override public boolean isAsyncStarted() { throw new NotImplementedYetException(); } @Override public boolean isAsyncSupported() { throw new NotImplementedYetException(); } @Override public AsyncContext getAsyncContext() { throw new NotImplementedYetException(); } @Override public DispatcherType getDispatcherType() { throw new NotImplementedYetException(); } }