Skip to content

Commit

Permalink
Stage1
Browse files Browse the repository at this point in the history
  • Loading branch information
kingster committed Aug 9, 2024
1 parent 346e261 commit 22e48de
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.flipkart.gjex.examples.helloworld.filter;

import com.flipkart.gjex.core.filter.RequestParams;
import com.flipkart.gjex.core.filter.http.HttpFilter;

import javax.inject.Named;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Named("CustomHeaderHttpFilter")
public class CustomHeaderHttpFilter extends HttpFilter {

@Override
public void doProcessRequest(ServletRequest servletRequest, RequestParams<Map<String, String>> requestParams) {
super.doProcessRequest(servletRequest, requestParams);
}

@Override
public void doProcessResponseHeaders(Map<String, String> responseHeaders) {
super.doProcessResponseHeaders(responseHeaders);
}

@Override
public void doProcessResponse(ServletResponse response) {
super.doProcessResponse(response);
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.addHeader("x-custom-header", "custom-header-value");
}

@Override
public void doHandleException(Exception e) {
super.doHandleException(e);
}

@Override
public HttpFilter getInstance() {
return new CustomHeaderHttpFilter();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
package com.flipkart.gjex.examples.helloworld.guice;

import com.flipkart.gjex.core.filter.grpc.GrpcFilter;
import com.flipkart.gjex.core.filter.http.HttpFilterParams;
import com.flipkart.gjex.core.filter.http.JavaxFilterParams;
import com.flipkart.gjex.core.tracing.TracingSampler;
import com.flipkart.gjex.examples.helloworld.filter.AuthFilter;
import com.flipkart.gjex.examples.helloworld.filter.CustomHeaderHttpFilter;
import com.flipkart.gjex.examples.helloworld.filter.LoggingFilter;
import com.flipkart.gjex.examples.helloworld.service.GreeterService;
import com.flipkart.gjex.examples.helloworld.tracing.AllWhitelistTracingSampler;
Expand Down Expand Up @@ -54,7 +56,8 @@ protected void configure() {
// bind(AccessLogGrpcFilter.class).to(AccessLogTestFilter.class);
bind(TracingSampler.class).to(AllWhitelistTracingSampler.class);
bind(ResourceConfig.class).annotatedWith(Names.named("HelloWorldResourceConfig")).to(HelloWorldResourceConfig.class);
bind(JavaxFilterParams.class).annotatedWith(Names.named("ExampleJavaxFilter"))
.toInstance(JavaxFilterParams.builder().filter(new ExampleJavaxFilter()).pathSpec("/*").build());
bind(JavaxFilterParams.class).annotatedWith(Names.named("ExampleJavaxFilter")).toInstance(JavaxFilterParams.builder().filter(new ExampleJavaxFilter()).pathSpec("/*").build());
bind(HttpFilterParams.class).annotatedWith(Names.named("CustomHeaderHttpFilter")).toInstance(HttpFilterParams.builder().filter(new CustomHeaderHttpFilter()).pathSpec("/*").build());

}
}
1 change: 1 addition & 0 deletions guice/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ dependencies {
implementation 'org.eclipse.jetty:jetty-webapp:9.4.22.v20191022'
implementation 'io.opentracing.brave:brave-opentracing:0.31.3'
implementation 'io.zipkin.reporter2:zipkin-sender-okhttp3:2.7.7'
implementation 'commons-io:commons-io:2.16.1'

implementation 'io.prometheus:prometheus-metrics-exporter-servlet-javax:1.2.0'

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.flipkart.gjex.http.interceptor;

import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

public class FilterServletResponseWrapper extends HttpServletResponseWrapper {

ServletOutputStreamWrapper stream = new ServletOutputStreamWrapper();

/**
* Constructs a request object wrapping the given request.
*
* @param request
* @throws IllegalArgumentException if the request is null
*/
public FilterServletResponseWrapper(HttpServletResponse request) {
super(request);
}

public ServletOutputStream getOutputStream() throws IOException
{
return stream;
}

public PrintWriter getWriter() throws IOException
{
return new PrintWriter(stream);
}

public byte[] getWrapperBytes()
{
return stream.getBytes();
}


static class ServletOutputStreamWrapper extends ServletOutputStream {

private final ByteArrayOutputStream out = new ByteArrayOutputStream();

public void write(int b) throws IOException {
out.write(b);
}

public byte[] getBytes() {
return out.toByteArray();
}

@Override
public boolean isReady() {
return true;
}

@Override
public void setWriteListener(WriteListener writeListener) {
try {
writeListener.onWritePossible();
} catch (IOException e) {
throw new RuntimeException(e);
}
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,27 @@
import com.flipkart.gjex.core.filter.http.HttpFilter;
import com.flipkart.gjex.core.filter.http.HttpFilterParams;
import org.eclipse.jetty.http.pathmap.ServletPathSpec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Named;
import javax.inject.Singleton;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Singleton
@Named("HttpFilterInterceptor")
public class HttpFilterInterceptor implements javax.servlet.Filter {

private static final Logger logger = LoggerFactory.getLogger(HttpFilterInterceptor.class);

private static class ServletPathFiltersHolder {
ServletPathSpec spec;
HttpFilter filter;
Expand Down Expand Up @@ -62,32 +65,42 @@ public void init(FilterConfig filterConfig) throws ServletException {}
public final void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

List<HttpFilter> filters = new ArrayList<>();
RequestParams.RequestParamsBuilder<Map<String,String>> requestParamsBuilder = RequestParams.builder();
try {
if (request instanceof HttpServletRequest){
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
filters = getMatchingFilters(httpServletRequest.getRequestURI());

Map<String, String> headers = Collections.list(httpServletRequest.getHeaderNames())
.stream().collect(Collectors.toMap(h -> h, httpServletRequest::getHeader));
requestParamsBuilder.metadata(headers);
requestParamsBuilder.clientIp(getClientIp(request));
requestParamsBuilder.method(httpServletRequest.getMethod());
requestParamsBuilder.resourcePath(getFullURL(httpServletRequest));
}

if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;

List<HttpFilter> filters = getMatchingFilters(httpServletRequest.getRequestURI());
Map<String, String> headers = Collections.list(httpServletRequest.getHeaderNames())
.stream().collect(Collectors.toMap(h -> h, httpServletRequest::getHeader));
requestParamsBuilder.metadata(headers);
requestParamsBuilder.clientIp(getClientIp(request));
requestParamsBuilder.method(httpServletRequest.getMethod());
requestParamsBuilder.resourcePath(getFullURL(httpServletRequest));

RequestParams<Map<String, String>> requestParams = requestParamsBuilder.build();
filters.forEach(filter -> filter.doProcessRequest(request, requestParams));
chain.doFilter(request, response);
} finally {
if (response instanceof HttpServletResponse) {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
Map<String, String> headers = httpServletResponse.getHeaderNames()
FilterServletResponseWrapper responseWrapper = new FilterServletResponseWrapper(httpServletResponse);

try {
filters.forEach(filter -> filter.doProcessRequest(request, requestParams));
chain.doFilter(request, responseWrapper);
Map<String, String> responseHeaders = responseWrapper.getHeaderNames()
.stream().collect(Collectors.toMap(h -> h, httpServletResponse::getHeader));
filters.forEach(filter -> filter.doProcessResponseHeaders(headers));
filters.forEach(filter -> filter.doProcessResponseHeaders(responseHeaders));

} finally {
filters.forEach(filter -> filter.doProcessResponse(responseWrapper));
response.getOutputStream().write(responseWrapper.getWrapperBytes());
}
filters.forEach(filter -> filter.doProcessResponse(response));

} else {
// For Unsupported request types, pass the request and response as is
chain.doFilter(request, response);
logger.warn("Unsupported request type {}, pass the request and response as is.", request.getClass());
}


}

/**
Expand Down

0 comments on commit 22e48de

Please sign in to comment.