-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix MicroserviceChangeTrigger to send servlet response to remote server.
- Loading branch information
Showing
8 changed files
with
308 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package cinnamon.servlet; | ||
|
||
import javax.servlet.ServletOutputStream; | ||
import javax.servlet.http.HttpServletResponse; | ||
import javax.servlet.http.HttpServletResponseWrapper; | ||
import java.io.IOException; | ||
import java.io.OutputStreamWriter; | ||
import java.io.PrintWriter; | ||
|
||
/** | ||
* Based on: http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server | ||
*/ | ||
public class HttpServletResponseCopier extends HttpServletResponseWrapper { | ||
|
||
private ServletOutputStream outputStream; | ||
private PrintWriter writer; | ||
private ServletOutputStreamCopier copier; | ||
|
||
public HttpServletResponseCopier(HttpServletResponse response) throws IOException { | ||
super(response); | ||
} | ||
|
||
@Override | ||
public ServletOutputStream getOutputStream() throws IOException { | ||
if (writer != null) { | ||
throw new IllegalStateException("getWriter() has already been called on this response."); | ||
} | ||
|
||
if (outputStream == null) { | ||
outputStream = getResponse().getOutputStream(); | ||
copier = new ServletOutputStreamCopier(outputStream); | ||
} | ||
|
||
return copier; | ||
} | ||
|
||
@Override | ||
public PrintWriter getWriter() throws IOException { | ||
if (outputStream != null) { | ||
throw new IllegalStateException("getOutputStream() has already been called on this response."); | ||
} | ||
|
||
if (writer == null) { | ||
copier = new ServletOutputStreamCopier(getResponse().getOutputStream()); | ||
writer = new PrintWriter(new OutputStreamWriter(copier, getResponse().getCharacterEncoding()), true); | ||
} | ||
|
||
return writer; | ||
} | ||
|
||
@Override | ||
public void flushBuffer() throws IOException { | ||
if (writer != null) { | ||
writer.flush(); | ||
} else if (outputStream != null) { | ||
copier.flush(); | ||
} | ||
} | ||
|
||
public byte[] getCopy() { | ||
if (copier != null) { | ||
return copier.getCopy(); | ||
} else { | ||
return new byte[0]; | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
package cinnamon.servlet; | ||
|
||
|
||
import cinnamon.global.ConfThreadLocal; | ||
import cinnamon.trigger.impl.MicroserviceChangeTrigger; | ||
import org.apache.http.HeaderElement; | ||
import org.apache.http.HttpResponse; | ||
import org.apache.http.client.HttpClient; | ||
import org.apache.http.client.methods.RequestBuilder; | ||
import org.apache.http.impl.client.HttpClientBuilder; | ||
import org.apache.http.util.EntityUtils; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
import javax.servlet.*; | ||
import javax.servlet.http.HttpServletRequest; | ||
import javax.servlet.http.HttpServletResponse; | ||
import java.io.ByteArrayOutputStream; | ||
import java.io.IOException; | ||
import java.util.Enumeration; | ||
import java.util.Map; | ||
|
||
/** | ||
* Based on: http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server | ||
*/ | ||
public class ResponseFilter implements Filter { | ||
|
||
Logger log = LoggerFactory.getLogger(ResponseFilter.class); | ||
|
||
|
||
@Override | ||
public void init(FilterConfig config) throws ServletException { | ||
// NOOP. | ||
} | ||
|
||
@Override | ||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { | ||
if (response.getCharacterEncoding() == null) { | ||
response.setCharacterEncoding("UTF-8"); // Or whatever default. UTF-8 is good for World Domination. | ||
} | ||
|
||
HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response); | ||
|
||
try { | ||
chain.doFilter(request, responseCopier); | ||
responseCopier.flushBuffer(); | ||
} finally { | ||
byte[] copy = responseCopier.getCopy(); | ||
log.debug("response.copy: " + new String(copy, "UTF-8")); | ||
|
||
HttpServletResponse httpServletResponse = ((HttpServletResponse) response); | ||
for (String url : httpServletResponse.getHeaders("microservice")) { | ||
// new MicroserviceChangeTrigger().executePostCommand() | ||
HttpClient httpClient = HttpClientBuilder.create().build(); | ||
RequestBuilder requestCopy = RequestBuilder.create("POST"); | ||
requestCopy.setUri(url); | ||
HttpServletRequest httpServletRequest = ((HttpServletRequest) request); | ||
Enumeration<String> headerNames = httpServletRequest.getHeaderNames(); | ||
while (headerNames.hasMoreElements()) { | ||
String headerName = headerNames.nextElement(); | ||
if (headerName.equals("microservice")) { | ||
continue; | ||
} | ||
requestCopy.setHeader(headerName, httpServletRequest.getHeader(headerName)); | ||
} | ||
for (Map.Entry<String, String[]> entry : httpServletRequest.getParameterMap().entrySet()) { | ||
for (String paramVal : entry.getValue()) { | ||
requestCopy.addParameter(entry.getKey(), paramVal); | ||
} | ||
} | ||
|
||
requestCopy.addParameter("cinnamonResponse", new String(copy, "UTF-8")); | ||
HttpResponse httpResponse = httpClient.execute(requestCopy.build()); | ||
log.debug("Microservice response status:" + httpResponse.getStatusLine()); | ||
log.debug("Microservice response content:" + EntityUtils.toString(httpResponse.getEntity())); | ||
} | ||
|
||
} | ||
} | ||
|
||
@Override | ||
public void destroy() { | ||
// NOOP. | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cinnamon.servlet; | ||
|
||
import javax.servlet.ServletOutputStream; | ||
import javax.servlet.WriteListener; | ||
import java.io.ByteArrayOutputStream; | ||
import java.io.IOException; | ||
import java.io.OutputStream; | ||
|
||
/** | ||
* Based on: http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server | ||
*/ | ||
public class ServletOutputStreamCopier extends ServletOutputStream { | ||
|
||
private OutputStream outputStream; | ||
private ByteArrayOutputStream copy; | ||
|
||
public ServletOutputStreamCopier(OutputStream outputStream) { | ||
this.outputStream = outputStream; | ||
this.copy = new ByteArrayOutputStream(4096); | ||
} | ||
|
||
@Override | ||
public void write(int b) throws IOException { | ||
outputStream.write(b); | ||
copy.write(b); | ||
} | ||
|
||
public byte[] getCopy() { | ||
return copy.toByteArray(); | ||
} | ||
|
||
@Override | ||
public boolean isReady() { | ||
return true; | ||
} | ||
|
||
@Override | ||
public void setWriteListener(WriteListener writeListener) { | ||
|
||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<web-app version="3.0" | ||
metadata-complete="true" | ||
xmlns="http://java.sun.com/xml/ns/javaee" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> | ||
|
||
<display-name>/@grails.project.key@</display-name> | ||
|
||
<context-param> | ||
<param-name>contextConfigLocation</param-name> | ||
<param-value>/WEB-INF/applicationContext.xml</param-value> | ||
</context-param> | ||
|
||
<context-param> | ||
<param-name>webAppRootKey</param-name> | ||
<param-value>@grails.project.key@</param-value> | ||
</context-param> | ||
|
||
|
||
|
||
<filter> | ||
<filter-name>charEncodingFilter</filter-name> | ||
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> | ||
<init-param> | ||
<param-name>targetBeanName</param-name> | ||
<param-value>characterEncodingFilter</param-value> | ||
</init-param> | ||
<init-param> | ||
<param-name>targetFilterLifecycle</param-name> | ||
<param-value>true</param-value> | ||
</init-param> | ||
</filter> | ||
|
||
<filter-mapping> | ||
<filter-name>charEncodingFilter</filter-name> | ||
<url-pattern>/*</url-pattern> | ||
</filter-mapping> | ||
|
||
<filter> | ||
<filter-name>responseFilter</filter-name> | ||
<filter-class>cinnamon.servlet.ResponseFilter</filter-class> | ||
</filter> | ||
<filter-mapping> | ||
<filter-name>responseFilter</filter-name> | ||
<url-pattern>/*</url-pattern> | ||
</filter-mapping> | ||
|
||
<listener> | ||
<listener-class>org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener</listener-class> | ||
</listener> | ||
|
||
<!-- Grails dispatcher servlet --> | ||
<servlet> | ||
<servlet-name>grails</servlet-name> | ||
<servlet-class>org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet</servlet-class> | ||
<init-param> | ||
<param-name>dispatchOptionsRequest</param-name> | ||
<param-value>true</param-value> | ||
</init-param> | ||
<load-on-startup>1</load-on-startup> | ||
<async-supported>true</async-supported> | ||
</servlet> | ||
|
||
<!-- The Groovy Server Pages servlet --> | ||
<servlet> | ||
<servlet-name>gsp</servlet-name> | ||
<servlet-class>org.codehaus.groovy.grails.web.pages.GroovyPagesServlet</servlet-class> | ||
</servlet> | ||
|
||
<servlet-mapping> | ||
<servlet-name>gsp</servlet-name> | ||
<url-pattern>*.gsp</url-pattern> | ||
</servlet-mapping> | ||
|
||
<session-config> | ||
<!-- 30 minutes --> | ||
<session-timeout>30</session-timeout> | ||
</session-config> | ||
|
||
<welcome-file-list> | ||
<!-- | ||
The order of the welcome pages is important. JBoss deployment will | ||
break if index.gsp is first in the list. | ||
--> | ||
<welcome-file>index.html</welcome-file> | ||
<welcome-file>index.jsp</welcome-file> | ||
<welcome-file>index.gsp</welcome-file> | ||
</welcome-file-list> | ||
|
||
|
||
|
||
</web-app> |