blob: 50ef164c202f34ce6d36279b03cb5bf2d260254a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.wicket.protocol.ws.api;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import jakarta.servlet.AsyncContext;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import jakarta.servlet.http.HttpUpgradeHandler;
import jakarta.servlet.http.Part;
/**
* A copy of the http servlet request used to create the WebSocket.
* Copy its details because they are discarded at the end of the request (even if we
* use AsyncContext from Servlet 3 spec). This copy is used later for following requests
* through the WebSocket connection to construct WebSocketRequest.
*
* @since 6.0
*/
public class ServletRequestCopy implements HttpServletRequest
{
private final String contextPath;
private final String servletPath;
private final String pathInfo;
private final String requestUri;
private final HttpSessionCopy httpSession;
private final StringBuffer requestURL;
private final Map<String, Object> attributes = new HashMap<>();
private final Map<String, Enumeration<String>> headers = new HashMap<>();
private final Map<String, String[]> parameters = new HashMap<>();
private final String method;
private final String serverName;
private final int serverPort;
private final String protocol;
private final String scheme;
private final String contentType;
private final Locale locale;
private final Enumeration<Locale> locales;
private final boolean isSecure;
private final String remoteUser;
private final String remoteAddr;
private final String remoteHost;
private final int remotePort;
private final String localAddr;
private final String localName;
private final int localPort;
private final String pathTranslated;
private final String requestedSessionId;
private final Principal principal;
private String characterEncoding;
public ServletRequestCopy(HttpServletRequest request) {
this.servletPath = request.getServletPath();
this.contextPath = request.getContextPath();
this.pathInfo = request.getPathInfo();
this.requestUri = request.getRequestURI();
this.requestURL = request.getRequestURL();
this.method = request.getMethod();
this.serverName = request.getServerName();
this.serverPort = request.getServerPort();
this.protocol = request.getProtocol();
this.scheme = request.getScheme();
this.characterEncoding = request.getCharacterEncoding();
this.contentType = request.getContentType();
this.locale = request.getLocale();
this.locales = request.getLocales();
this.isSecure = request.isSecure();
this.remoteUser = request.getRemoteUser();
this.remoteAddr = request.getRemoteAddr();
this.remoteHost = request.getRemoteHost();
this.remotePort = request.getRemotePort();
this.localAddr = request.getLocalAddr();
this.localName = request.getLocalName();
this.localPort = request.getLocalPort();
this.pathTranslated = request.getPathTranslated();
this.requestedSessionId = request.getRequestedSessionId();
this.principal = request.getUserPrincipal();
HttpSession session = request.getSession(true);
httpSession = new HttpSessionCopy(session);
String s;
Enumeration<String> e = request.getHeaderNames();
while (e != null && e.hasMoreElements()) {
s = e.nextElement();
Enumeration<String> headerValues = request.getHeaders(s);
this.headers.put(s, headerValues);
}
e = request.getAttributeNames();
while (e != null && e.hasMoreElements()) {
s = e.nextElement();
attributes.put(s, request.getAttribute(s));
}
e = request.getParameterNames();
while (e != null && e.hasMoreElements()) {
s = e.nextElement();
parameters.put(s, request.getParameterValues(s));
}
}
@Override
public String getServerName() {
return serverName;
}
@Override
public int getServerPort() {
return serverPort;
}
@Override
public BufferedReader getReader() throws IOException
{
return null;
}
@Override
public String getRemoteAddr()
{
return remoteAddr;
}
@Override
public String getRemoteHost()
{
return remoteHost;
}
@Override
public HttpSession getSession(boolean create) {
return httpSession;
}
@Override
public String getMethod() {
return method;
}
@Override
public String getAuthType()
{
return null;
}
@Override
public Cookie[] getCookies()
{
return new Cookie[0];
}
@Override
public long getDateHeader(String name)
{
return 0;
}
@Override
public String getHeader(String name)
{
Enumeration<String> values = headers.get(name);
if (values != null && values.hasMoreElements())
{
return values.nextElement();
}
return null;
}
@Override
public Enumeration<String> getHeaders(final String name)
{
return headers.get(name);
}
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(parameters.keySet());
}
@Override
public String getParameter(String name) {
return parameters.get(name) != null ? parameters.get(name)[0] : null;
}
@Override
public String[] getParameterValues(final String name) {
return parameters.get(name);
}
@Override
public Map getParameterMap()
{
return parameters;
}
@Override
public String getProtocol()
{
String _protocol = "ws";
if ("https".equalsIgnoreCase(protocol))
{
_protocol = "wss";
}
return _protocol;
}
@Override
public String getScheme()
{
String _scheme = "ws";
if ("https".equalsIgnoreCase(scheme))
{
_scheme = "wss";
}
return _scheme;
}
@Override
public Enumeration<String> getHeaderNames() {
return Collections.enumeration(headers.keySet());
}
@Override
public int getIntHeader(String name)
{
Enumeration<String> values = headers.get(name);
int result = -1;
if (values.hasMoreElements())
{
String value = values.nextElement();
result = Integer.parseInt(value, 10);
}
return result;
}
@Override
public Object getAttribute(String name) {
return attributes.get(name);
}
@Override
public Enumeration<String> getAttributeNames() {
return Collections.enumeration(attributes.keySet());
}
@Override
public String getCharacterEncoding()
{
return characterEncoding;
}
@Override
public void setCharacterEncoding(String characterEncoding) throws UnsupportedEncodingException
{
this.characterEncoding = characterEncoding;
}
@Override
public int getContentLength()
{
return 0;
}
@Override
public long getContentLengthLong()
{
return 0;
}
@Override
public String getContentType()
{
return contentType;
}
@Override
public ServletInputStream getInputStream() throws IOException
{
return null;
}
@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()
{
return locale;
}
@Override
public Enumeration getLocales()
{
return locales;
}
@Override
public boolean isSecure()
{
return isSecure;
}
@Override
public RequestDispatcher getRequestDispatcher(String path)
{
return null;
}
@Override
public String getRealPath(String path)
{
return null;
}
@Override
public int getRemotePort()
{
return remotePort;
}
@Override
public String getLocalName()
{
return localName;
}
@Override
public String getLocalAddr()
{
return localAddr;
}
@Override
public int getLocalPort()
{
return localPort;
}
@Override
public ServletContext getServletContext()
{
return null;
}
@Override
public AsyncContext startAsync() throws IllegalStateException
{
return null;
}
@Override
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException
{
return null;
}
@Override
public boolean isAsyncStarted()
{
return false;
}
@Override
public boolean isAsyncSupported()
{
return false;
}
@Override
public AsyncContext getAsyncContext()
{
return null;
}
@Override
public DispatcherType getDispatcherType()
{
return null;
}
@Override
public String getContextPath() {
return contextPath;
}
@Override
public String getQueryString()
{
return null;
}
@Override
public String getRemoteUser()
{
return remoteUser;
}
@Override
public boolean isUserInRole(String role)
{
return false;
}
@Override
public Principal getUserPrincipal()
{
return principal;
}
@Override
public String getRequestedSessionId()
{
return requestedSessionId;
}
@Override
public String getServletPath() {
return servletPath;
}
@Override
public String getPathInfo() {
return pathInfo;
}
@Override
public String getPathTranslated()
{
return pathTranslated;
}
@Override
public String getRequestURI() {
return requestUri;
}
@Override
public HttpSession getSession() {
return httpSession;
}
@Override
public String changeSessionId()
{
return null;
}
@Override
public boolean isRequestedSessionIdValid()
{
return false;
}
@Override
public boolean isRequestedSessionIdFromCookie()
{
return false;
}
@Override
public boolean isRequestedSessionIdFromURL()
{
return false;
}
@Override
public boolean isRequestedSessionIdFromUrl()
{
return false;
}
@Override
public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
{
return false;
}
@Override
public void login(String username, String password) throws ServletException
{
}
@Override
public void logout() throws ServletException
{
}
@Override
public Collection<Part> getParts() throws IOException, ServletException
{
return Collections.emptyList();
}
@Override
public Part getPart(String name) throws IOException, ServletException
{
return null;
}
@Override
public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException
{
return null;
}
@Override
public StringBuffer getRequestURL() {
return requestURL;
}
}