Skip to content

Commit

Permalink
proxy parameters with multiple values
Browse files Browse the repository at this point in the history
  • Loading branch information
ssalinas committed Jul 11, 2017
1 parent aaf846f commit b456f55
Showing 1 changed file with 48 additions and 32 deletions.
@@ -1,7 +1,7 @@
package com.hubspot.singularity.proxy; package com.hubspot.singularity.proxy;


import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
Expand Down Expand Up @@ -70,8 +70,8 @@ public <T> Response getMergedListResult(HttpServletRequest request) {
} }


public <T> Response getMergedListResult(HttpServletRequest request, T body) { public <T> Response getMergedListResult(HttpServletRequest request, T body) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


// TODO - parallelize // TODO - parallelize
List<Object> combined = Lists.newArrayList(); List<Object> combined = Lists.newArrayList();
Expand Down Expand Up @@ -111,8 +111,8 @@ public Response routeByRequestId(HttpServletRequest request, String requestId) {
} }


public <T> Response routeByRequestId(HttpServletRequest request, String requestId, T body) { public <T> Response routeByRequestId(HttpServletRequest request, String requestId, T body) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = getDataCenterForRequest(requestId); DataCenter dataCenter = getDataCenterForRequest(requestId);


Expand All @@ -123,8 +123,8 @@ public <T> Response routeByRequestId(HttpServletRequest request, String requestI
* Route a request to a particular dataCenter using the request group Id to locate the correct Singularity cluster * Route a request to a particular dataCenter using the request group Id to locate the correct Singularity cluster
*/ */
Response routeByRequestGroupId(HttpServletRequest request, String requestGroupId) { Response routeByRequestGroupId(HttpServletRequest request, String requestGroupId) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = getDataCenterForRequestGroup(requestGroupId); DataCenter dataCenter = getDataCenterForRequestGroup(requestGroupId);


Expand All @@ -135,17 +135,17 @@ Response routeByRequestGroupId(HttpServletRequest request, String requestGroupId
* Route a request to a particular dataCenter using the slaveId/hostname to locate the correct Singularity cluster * Route a request to a particular dataCenter using the slaveId/hostname to locate the correct Singularity cluster
*/ */
Response routeBySlaveId(HttpServletRequest request, String slaveId) { Response routeBySlaveId(HttpServletRequest request, String slaveId) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = getDataCenterForSlaveId(slaveId); DataCenter dataCenter = getDataCenterForSlaveId(slaveId);


return toResponse(proxyAndGetResponse(dataCenter, request, null, headers, params)); return toResponse(proxyAndGetResponse(dataCenter, request, null, headers, params));
} }


Response routeByHostname(HttpServletRequest request, String hostname) { Response routeByHostname(HttpServletRequest request, String hostname) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = getDataCenterForSlaveHostname(hostname); DataCenter dataCenter = getDataCenterForSlaveHostname(hostname);


Expand All @@ -156,8 +156,8 @@ Response routeByHostname(HttpServletRequest request, String hostname) {
* Route a request to a particular dataCenter using the rack ID to locate the correct Singularity cluster * Route a request to a particular dataCenter using the rack ID to locate the correct Singularity cluster
*/ */
Response routeByRackId(HttpServletRequest request, String rackId) { Response routeByRackId(HttpServletRequest request, String rackId) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = getDataCenterForRackId(rackId); DataCenter dataCenter = getDataCenterForRackId(rackId);


Expand All @@ -168,8 +168,8 @@ Response routeByRackId(HttpServletRequest request, String rackId) {
* Route a request to a particular dataCenter by name, failing if it is not present * Route a request to a particular dataCenter by name, failing if it is not present
*/ */
<T> Response routeByDataCenter(HttpServletRequest request, String dataCenterName, T body) { <T> Response routeByDataCenter(HttpServletRequest request, String dataCenterName, T body) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = getDataCenter(dataCenterName); DataCenter dataCenter = getDataCenter(dataCenterName);


Expand All @@ -184,8 +184,8 @@ Response routeToDefaultDataCenter(HttpServletRequest request) {
} }


<T> Response routeToDefaultDataCenter(HttpServletRequest request, T body) { <T> Response routeToDefaultDataCenter(HttpServletRequest request, T body) {
Map<String, String> headers = getHeaders(request); List<Param> headers = getHeaders(request);
Map<String, String> params = getParams(request); List<Param> params = getParams(request);


DataCenter dataCenter = configuration.getDataCenters().get(0); DataCenter dataCenter = configuration.getDataCenters().get(0);


Expand Down Expand Up @@ -226,7 +226,7 @@ private DataCenter getDataCenter(String name) {
/* /*
* Generic methods for proxying requests * Generic methods for proxying requests
*/ */
private <T> HttpResponse proxyAndGetResponse(DataCenter dc, HttpServletRequest request, T body, Map<String, String> headers, Map<String, String> params) { private <T> HttpResponse proxyAndGetResponse(DataCenter dc, HttpServletRequest request, T body, List<Param> headers, List<Param> params) {
String fullPath = request.getContextPath() + request.getPathInfo(); String fullPath = request.getContextPath() + request.getPathInfo();
String url = String.format("%s://%s%s", dc.getScheme(), getHost(dc), fullPath.replace(contextPath, dc.getContextPath())); String url = String.format("%s://%s%s", dc.getScheme(), getHost(dc), fullPath.replace(contextPath, dc.getContextPath()));


Expand All @@ -243,8 +243,8 @@ private <T> HttpResponse proxyAndGetResponse(DataCenter dc, HttpServletRequest r
LOG.error("Could not write body from object {}", body); LOG.error("Could not write body from object {}", body);
throw new WebApplicationException(jpe, 500); throw new WebApplicationException(jpe, 500);
} }
headers.forEach(requestBuilder::addHeader); headers.forEach((h) -> requestBuilder.addHeader(h.getKey(), h.getValue()));
params.forEach((k, v) -> requestBuilder.setQueryParam(k).to(v)); params.forEach((h) -> requestBuilder.setQueryParam(h.getKey()).to(h.getValue()));


try { try {
return httpClient.execute(requestBuilder.build()).get(); return httpClient.execute(requestBuilder.build()).get();
Expand All @@ -253,7 +253,7 @@ private <T> HttpResponse proxyAndGetResponse(DataCenter dc, HttpServletRequest r
} }
} }


private <T, Q> T proxyAndGetResponseAs(DataCenter dc, HttpServletRequest request, Q body, TypeReference<T> clazz, Map<String, String> headers, Map<String, String> params) { private <T, Q> T proxyAndGetResponseAs(DataCenter dc, HttpServletRequest request, Q body, TypeReference<T> clazz, List<Param> headers, List<Param> params) {
HttpResponse response = proxyAndGetResponse(dc, request, body, headers, params); HttpResponse response = proxyAndGetResponse(dc, request, body, headers, params);
if (response.getStatusCode() > 399) { if (response.getStatusCode() > 399) {
throw new WebApplicationException(response.getAsString(), response.getStatusCode()); throw new WebApplicationException(response.getAsString(), response.getStatusCode());
Expand All @@ -269,29 +269,27 @@ private <T, Q> T proxyAndGetResponseAs(DataCenter dc, HttpServletRequest request
} }
} }


private Map<String, String> getHeaders(HttpServletRequest request) { private List<Param> getHeaders(HttpServletRequest request) {
Map<String, String> headers = new HashMap<>(); List<Param> headers = new ArrayList<>();
Enumeration<String> headerNames = request.getHeaderNames(); Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) { if (headerNames != null) {
while (headerNames.hasMoreElements()) { while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement(); String headerName = headerNames.nextElement();
headers.put(headerName, request.getHeader(headerName)); headers.add(new Param(headerName, request.getHeader(headerName)));
} }
} }
LOG.trace("Found headers: {}", headers); LOG.trace("Found headers: {}", headers);
return headers; return headers;
} }


private Map<String, String> getParams(HttpServletRequest request) { private List<Param> getParams(HttpServletRequest request) {
Map<String, String> params = new HashMap<>(); List<Param> params = new ArrayList<>();
Enumeration<String> parameterNames = request.getParameterNames(); for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
if (parameterNames != null) { for (String value : entry.getValue()) {
while (parameterNames.hasMoreElements()) { params.add(new Param(entry.getKey(), value));
String parameterName = parameterNames.nextElement();
params.put(parameterName, request.getParameter(parameterName));
} }
} }
LOG.trace("Found query params: {}", params); LOG.trace("Found params {}", params);
return params; return params;
} }


Expand All @@ -301,4 +299,22 @@ private Response toResponse(HttpResponse original) {
original.getHeaders().forEach((h) -> builder.header(h.getName(), h.getValue())); original.getHeaders().forEach((h) -> builder.header(h.getName(), h.getValue()));
return builder.build(); return builder.build();
} }

private class Param {
private final String key;
private final String value;

Param(String key, String value) {
this.key = key;
this.value = value;
}

String getKey() {
return key;
}

String getValue() {
return value;
}
}
} }

0 comments on commit b456f55

Please sign in to comment.