001package com.esri.arcgis.enterprise.interceptor.server;
002
003import com.esri.arcgis.enterprise.interceptor.IInterceptorRequest;
004import jakarta.servlet.ServletException;
005import jakarta.servlet.ServletInputStream;
006import jakarta.servlet.http.HttpServletRequest;
007import jakarta.servlet.http.Part;
008
009import java.io.BufferedReader;
010import java.io.IOException;
011import java.lang.invoke.MethodHandle;
012import java.lang.invoke.MethodHandles;
013import java.lang.invoke.MethodType;
014import java.util.Collection;
015import java.util.Enumeration;
016import java.util.Map;
017
018public class ServerServicesInterceptorRequestWrapper implements IInterceptorRequest {
019
020    private static final String APP_INTERCEPTOR_REQUEST = "InterceptorRequest";
021    private IInterceptorRequest interceptorRequest;
022
023    private HttpServletRequest httpServletRequest;
024
025    public ServerServicesInterceptorRequestWrapper(IInterceptorRequest interceptorRequest) {
026        this.interceptorRequest = interceptorRequest;
027        setHttpServletRequest();
028    }
029
030    public String getHeader(String name) {
031        return httpServletRequest.getHeader(name);
032    }
033
034    public Enumeration<String> getHeaders(String name) {
035        return httpServletRequest.getHeaders(name);
036    }
037
038    public String getMethod() {
039        return httpServletRequest.getMethod();
040    }
041
042    public Collection<Part> getParts() throws IOException, ServletException {
043        return httpServletRequest.getParts();
044    }
045
046    public Part getPart(String name) throws IOException, ServletException {
047        return httpServletRequest.getPart(name);
048    }
049
050    public String getRequestURI() {
051        return httpServletRequest.getRequestURI();
052    }
053
054    public ServletInputStream getInputStream() throws IOException {
055        return httpServletRequest.getInputStream();
056    }
057
058    @Override
059    public BufferedReader getReader() throws IOException {
060        return this.httpServletRequest.getReader();
061    }
062
063
064    @Override
065    public Map<String, String[]> getParameterMap() {
066        return httpServletRequest.getParameterMap();
067    }
068
069    @Override
070    public String getParameter(String name) {
071        return httpServletRequest.getParameter(name);
072    }
073
074    @Override
075    public String[] getParameterValues(String name) {
076        return httpServletRequest.getParameterValues(name);
077    }
078
079    @Override
080    public Enumeration<String> getParameterNames() {
081        return httpServletRequest.getParameterNames();
082    }
083
084    @Override
085    public String getCharacterEncoding() {
086        return this.httpServletRequest.getCharacterEncoding();
087    }
088
089    @Override
090    public int getContentLength() {
091        return this.httpServletRequest.getContentLength();
092    }
093
094    @Override
095    public long getContentLengthLong() {
096        return this.httpServletRequest.getContentLengthLong();
097    }
098
099    @Override
100    public String getContentType() {
101        return this.httpServletRequest.getContentType();
102    }
103
104    public IInterceptorRequest getAppInterceptorRequest() {
105        return interceptorRequest;
106    }
107
108    private void setHttpServletRequest() {
109        try {
110            IInterceptorRequest request = getAppInterceptorRequest();
111            if (request != null) {
112                // Extract
113                while (!request.getClass().getSimpleName().equals(APP_INTERCEPTOR_REQUEST)) {
114                    ServerServicesInterceptorRequestWrapper wrapper = (ServerServicesInterceptorRequestWrapper) request;
115                    request = wrapper.getAppInterceptorRequest();
116                }
117                MethodHandles.Lookup lookup = MethodHandles.lookup();
118                MethodType methodType = MethodType.methodType(HttpServletRequest.class);
119                MethodHandle methodHandle = lookup.findVirtual(request.getClass(), "getHttpServletRequest", methodType);
120                this.httpServletRequest = (HttpServletRequest) methodHandle.invoke(request);
121            }
122        } catch (Throwable e) {
123            throw new RuntimeException(e);
124        }
125    }
126}