001package com.esri.arcgis.enterprise.interceptor.server; 002 003import com.esri.arcgis.enterprise.interceptor.IInterceptorResponse; 004import jakarta.servlet.ServletOutputStream; 005import jakarta.servlet.http.HttpServletResponse; 006 007import java.io.IOException; 008import java.io.PrintWriter; 009import java.lang.invoke.MethodHandle; 010import java.lang.invoke.MethodHandles; 011import java.lang.invoke.MethodType; 012import java.util.Collection; 013 014public class ServerServicesInterceptorResponseWrapper implements IInterceptorResponse { 015 private static final String APP_INTERCEPTOR_RESPONSE = "InterceptorResponse"; 016 private IInterceptorResponse interceptorResponse; 017 private HttpServletResponse httpServletResponse; 018 019 public ServerServicesInterceptorResponseWrapper(IInterceptorResponse interceptorResponse) { 020 this.interceptorResponse = interceptorResponse; 021 this.setHttpServletResponse(); 022 } 023 024 private void setHttpServletResponse() { 025 try { 026 IInterceptorResponse response = getAppInterceptorResponse(); 027 if (response != null) { 028 // Extract 029 while (!response.getClass().getSimpleName().equals(APP_INTERCEPTOR_RESPONSE)) { 030 ServerServicesInterceptorResponseWrapper wrapper = (ServerServicesInterceptorResponseWrapper) response; 031 response = wrapper.getAppInterceptorResponse(); 032 } 033 MethodHandles.Lookup lookup = MethodHandles.lookup(); 034 MethodType methodType = MethodType.methodType(HttpServletResponse.class); 035 MethodHandle methodHandle = lookup.findVirtual(response.getClass(), "getHttpServletResponse", methodType); 036 this.httpServletResponse = (HttpServletResponse) methodHandle.invoke(response); 037 } 038 } catch (Throwable e) { 039 throw new RuntimeException(e); 040 } 041 } 042 043 @Override 044 public void sendError(int sc, String msg) throws IOException { 045 httpServletResponse.sendError(sc, msg); 046 } 047 048 @Override 049 public void sendError(int sc) throws IOException { 050 httpServletResponse.sendError(sc); 051 } 052 053 @Override 054 public void setHeader(String name, String value) { 055 httpServletResponse.setHeader(name, value); 056 } 057 058 @Override 059 public void addHeader(String name, String value) { 060 httpServletResponse.addHeader(name, value); 061 } 062 063 @Override 064 public void setStatus(int sc) { 065 httpServletResponse.setStatus(sc); 066 } 067 068 @Override 069 public String getHeader(String name) { 070 return httpServletResponse.getHeader(name); 071 } 072 073 @Override 074 public Collection<String> getHeaders(String name) { 075 return httpServletResponse.getHeaders(name); 076 } 077 078 @Override 079 public Collection<String> getHeaderNames() { 080 return httpServletResponse.getHeaderNames(); 081 } 082 083 @Override 084 public ServletOutputStream getOutputStream() throws IOException { 085 return httpServletResponse.getOutputStream(); 086 } 087 088 @Override 089 public PrintWriter getWriter() throws IOException { 090 return httpServletResponse.getWriter(); 091 } 092 093 @Override 094 public void flushBuffer() throws IOException { 095 httpServletResponse.flushBuffer(); 096 } 097 098 @Override 099 public void reset() { 100 httpServletResponse.reset(); 101 } 102 103 @Override 104 public void setCharacterEncoding(String var1) { 105 httpServletResponse.setCharacterEncoding(var1); 106 } 107 108 @Override 109 public String getCharacterEncoding() { 110 return httpServletResponse.getCharacterEncoding(); 111 } 112 113 @Override 114 public boolean isCommitted() { 115 return httpServletResponse.isCommitted(); 116 } 117 118 @Override 119 public String getContentType() { 120 return httpServletResponse.getContentType(); 121 } 122 123 public IInterceptorResponse getAppInterceptorResponse() { 124 return interceptorResponse; 125 } 126 127}