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}