diff --git a/fhir-server/src/main/java/com/ibm/fhir/server/filter/rest/FHIRHttpServletRequestWrapper.java b/fhir-server/src/main/java/com/ibm/fhir/server/filter/rest/FHIRHttpServletRequestWrapper.java index 34766a10de7..21745bce614 100644 --- a/fhir-server/src/main/java/com/ibm/fhir/server/filter/rest/FHIRHttpServletRequestWrapper.java +++ b/fhir-server/src/main/java/com/ibm/fhir/server/filter/rest/FHIRHttpServletRequestWrapper.java @@ -1,33 +1,27 @@ /* - * (C) Copyright IBM Corp. 2016, 2020 + * (C) Copyright IBM Corp. 2016, 2021 * * SPDX-License-Identifier: Apache-2.0 */ package com.ibm.fhir.server.filter.rest; -import java.io.BufferedReader; -import java.io.IOException; +import static javax.ws.rs.core.HttpHeaders.ACCEPT; +import static javax.ws.rs.core.HttpHeaders.ACCEPT_CHARSET; + import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.security.Principal; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletInputStream; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpSession; -import javax.ws.rs.core.HttpHeaders; import org.owasp.encoder.Encode; @@ -43,12 +37,8 @@ public class FHIRHttpServletRequestWrapper extends HttpServletRequestWrapper { private static final Logger log = Logger.getLogger(FHIRHttpServletRequestWrapper.class.getName()); public static final String UTF8 = "utf-8"; - public static final String UTF16 = "utf-16"; public static final String DEFAULT_ACCEPT_HEADER_VALUE = FHIRMediaType.APPLICATION_FHIR_JSON; - public static final String HEADER_X_METHOD_OVERRIDE = "X-Method-Override"; public static final String CHARSET = "charset"; - public static final String ACCEPT = "Accept"; - public static final String ACCEPT_CHARSET = "Accept-Charset"; // The real HttpServletRequest instance that we'll delegate to. private HttpServletRequest delegate; @@ -153,8 +143,6 @@ private static void initHeaderNameMappings() { // header name, query parameter name headerNameMappings.put("accept", "_format"); - headerNameMappings.put("x-method-override", "x-method-override"); - headerNameMappings.put("x-http-method-override", "x-http-method-override"); } @@ -216,8 +204,8 @@ private void formParameters(HttpServletRequest req) { /** - * This function is called to modified the accept header to add the missing charset setting, - * the content of the updated accept header will be used in content-type header of the response by the javax + * This function is called to modify the accept header to add the missing charset setting. + * The content of the updated accept header will be used in content-type header of the response by the JAX-RS * framework. * This function fixes the missing charset errors which are caused by: * (1) charset is defined in "Accept-Charset" header instead of in "Accept" header. @@ -243,13 +231,9 @@ private String updateAcceptHeader(String s) { /** * This method allows us to support overriding of HTTP headers with query parameters. For example, if this * method is called for the "Accept" header, we'll allow the "_format" query parameter to act as an override for the - * HTTP header value. We support this behavior for several HTTP headers. They are inserted into the - * "headerNameMappings" map defined above. - * - * Also for selected HTTP headers, we'll support a default value in the event that no value is specified via the - * HTTP request header or via the query string. + * HTTP header value. * - * Finally, if headerName includes a ":" we interpret that as a request for the value of a specific part of a complex header. + *
If headerName includes a ":" we interpret that as a request for the value of a specific part of a complex header. * For example, given a header value like: *
* X-TEST: part1=a;part2=multipart;part3=value;
@@ -326,11 +310,11 @@ public String getHeader(String headerName) {
}
/**
- * For specific request headers specified as a query parameter (e.g. "accept/_format"), we'll attempt
+ * For specific request headers specified as a query parameter (e.g. "_format"), we'll attempt
* to map the input value (specified by the user in the URI string) to a more official value.
*
* @param headerName
- * the name of the request header that was specified as a query parameter
+ * the lower-case name of the request header that was specified as a query parameter
* @param value
* the value of the query parameter (header value)
* @return a possibly mapped value or the original value if no mapping exists
@@ -390,20 +374,21 @@ public Enumeration getHeaderNames() {
return null;
}
- // Copy all the header names into a Vector, then
- // add to it any headers that were specified via the query string.
+ // Copy all the header names into a Vector and track whether Accept is there or not
+ boolean foundAccept = false;
Vector v = new Vector();
while (e.hasMoreElements()) {
- v.add(e.nextElement());
+ String header = e.nextElement();
+ if (ACCEPT.equalsIgnoreCase(header)) {
+ foundAccept = true;
+ }
+ v.add(header);
}
// Make sure the ACCEPT header is in the returned list since we
// have a default value for that one.
- addHeaderNameIfNotPresent(v, HttpHeaders.ACCEPT);
-
- // Next, add names of headers that were specified via the query string.
- for (String s : headerQueryParameters.keySet()) {
- addHeaderNameIfNotPresent(v, s);
+ if (!foundAccept) {
+ v.add(ACCEPT);
}
if (log.isLoggable(Level.FINEST)) {
@@ -413,26 +398,9 @@ public Enumeration getHeaderNames() {
return v.elements();
}
- private void addHeaderNameIfNotPresent(Vector v, String value) {
- // Walk through the vecter 'v', looking for 'value'.
- boolean foundIt = false;
- for (int i = 0; i < v.size(); i++) {
- String element = v.get(i);
- if (value.equalsIgnoreCase(element)) {
- foundIt = true;
- break;
- }
- }
-
- // If we didn't find it, then add it to the vector.
- if (!foundIt) {
- v.add(value);
- }
- }
-
/**
* This method allows us to support the overriding of HTTP headers with query parameters. For example, if this
- * method is called for the "Accept" header, we'll allow the "accept" query parameter to act as an override for the
+ * method is called for the "Accept" header, we'll allow the "_format" query parameter to act as an override for the
* HTTP header value. We support this behavior for several HTTP headers. They are inserted into the
* "headerNameMappings" map defined above.
*
@@ -504,251 +472,6 @@ public Enumeration getHeaders(String headerName) {
return e;
}
- @SuppressWarnings("unused")
- private String displayHeaderValues(Enumeration headers) {
- StringBuffer sb = new StringBuffer();
- sb.append("[");
- while (headers.hasMoreElements()) {
- String s = headers.nextElement();
- sb.append("{");
- sb.append(s);
- sb.append("}");
- }
- sb.append("]");
- return sb.toString();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
- */
- @Override
- public Object getAttribute(String arg0) {
- return delegate.getAttribute(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getAttributeNames()
- */
- @Override
- public Enumeration getAttributeNames() {
- return delegate.getAttributeNames();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getAuthType()
- */
- @Override
- public String getAuthType() {
- return delegate.getAuthType();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getCharacterEncoding()
- */
- @Override
- public String getCharacterEncoding() {
- return delegate.getCharacterEncoding();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getContentLength()
- */
- @Override
- public int getContentLength() {
- return delegate.getContentLength();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getContentType()
- */
- @Override
- public String getContentType() {
- return delegate.getContentType();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getContextPath()
- */
- @Override
- public String getContextPath() {
- return delegate.getContextPath();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getCookies()
- */
- @Override
- public Cookie[] getCookies() {
- return delegate.getCookies();
- }
-
- /**
- * @param headerName
- * @return
- * @see javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
- * @throws IllegalArgumentException
- */
- @Override
- public long getDateHeader(String headerName) {
- return delegate.getDateHeader(headerName);
- }
-
- /**
- * @return
- * @throws IOException
- * @see javax.servlet.ServletRequest#getInputStream()
- */
- @Override
- public ServletInputStream getInputStream() throws IOException {
- return delegate.getInputStream();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
- */
- @Override
- public int getIntHeader(String arg0) {
- return delegate.getIntHeader(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getLocalAddr()
- */
- @Override
- public String getLocalAddr() {
- return delegate.getLocalAddr();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getLocalName()
- */
- @Override
- public String getLocalName() {
- return delegate.getLocalName();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getLocalPort()
- */
- @Override
- public int getLocalPort() {
- return delegate.getLocalPort();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getLocale()
- */
- @Override
- public Locale getLocale() {
- return delegate.getLocale();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getLocales()
- */
- @Override
- public Enumeration getLocales() {
- return delegate.getLocales();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getMethod()
- */
- @Override
- public String getMethod() {
- String override = this.getHeader(HEADER_X_METHOD_OVERRIDE);
- if (override != null) {
- override = override.trim();
- if (log.isLoggable(Level.FINER)) {
- log.finest("The HTTP method is overridden by the " + HEADER_X_METHOD_OVERRIDE + " header. The value is (" + override + ")");
- }
- return override;
- }
- return delegate.getMethod();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
- */
- @Override
- public String getParameter(String arg0) {
- return delegate.getParameter(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getParameterMap()
- */
- @Override
- public Map getParameterMap() {
- return delegate.getParameterMap();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getParameterNames()
- */
- @Override
- public Enumeration getParameterNames() {
- return delegate.getParameterNames();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
- */
- @Override
- public String[] getParameterValues(String arg0) {
- return delegate.getParameterValues(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getPathInfo()
- */
- @Override
- public String getPathInfo() {
- return delegate.getPathInfo();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
- */
- @Override
- public String getPathTranslated() {
- return delegate.getPathTranslated();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getProtocol()
- */
- @Override
- public String getProtocol() {
- return delegate.getProtocol();
- }
-
/**
* @return
* @see javax.servlet.http.HttpServletRequest#getQueryString()
@@ -761,249 +484,4 @@ public String getQueryString() {
}
return delegate.getQueryString();
}
-
- /**
- * @return
- * @throws IOException
- * @see javax.servlet.ServletRequest#getReader()
- */
- @Override
- public BufferedReader getReader() throws IOException {
- return delegate.getReader();
- }
-
- /**
- * @param arg0
- * @return
- * @deprecated
- * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
- */
- @Deprecated
- @Override
- public String getRealPath(String arg0) {
- return delegate.getRealPath(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getRemoteAddr()
- */
- @Override
- public String getRemoteAddr() {
- return delegate.getRemoteAddr();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getRemoteHost()
- */
- @Override
- public String getRemoteHost() {
- return delegate.getRemoteHost();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getRemotePort()
- */
- @Override
- public int getRemotePort() {
- return delegate.getRemotePort();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
- */
- @Override
- public String getRemoteUser() {
- return delegate.getRemoteUser();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
- */
- @Override
- public RequestDispatcher getRequestDispatcher(String arg0) {
- return delegate.getRequestDispatcher(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getRequestURI()
- */
- @Override
- public String getRequestURI() {
- return delegate.getRequestURI();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getRequestURL()
- */
- @Override
- public StringBuffer getRequestURL() {
- return delegate.getRequestURL();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
- */
- @Override
- public String getRequestedSessionId() {
- return delegate.getRequestedSessionId();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getScheme()
- */
- @Override
- public String getScheme() {
- return delegate.getScheme();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getServerName()
- */
- @Override
- public String getServerName() {
- return delegate.getServerName();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#getServerPort()
- */
- @Override
- public int getServerPort() {
- return delegate.getServerPort();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getServletPath()
- */
- @Override
- public String getServletPath() {
- return delegate.getServletPath();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getSession()
- */
- @Override
- public HttpSession getSession() {
- return delegate.getSession();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
- */
- @Override
- public HttpSession getSession(boolean arg0) {
- return delegate.getSession(arg0);
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
- */
- @Override
- public Principal getUserPrincipal() {
- return delegate.getUserPrincipal();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie()
- */
- @Override
- public boolean isRequestedSessionIdFromCookie() {
- return delegate.isRequestedSessionIdFromCookie();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL()
- */
- @Override
- public boolean isRequestedSessionIdFromURL() {
- return delegate.isRequestedSessionIdFromURL();
- }
-
- /**
- * @return
- * @deprecated
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl()
- */
- @Deprecated
- @Override
- public boolean isRequestedSessionIdFromUrl() {
- return delegate.isRequestedSessionIdFromUrl();
- }
-
- /**
- * @return
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
- */
- @Override
- public boolean isRequestedSessionIdValid() {
- return delegate.isRequestedSessionIdValid();
- }
-
- /**
- * @return
- * @see javax.servlet.ServletRequest#isSecure()
- */
- @Override
- public boolean isSecure() {
- return delegate.isSecure();
- }
-
- /**
- * @param arg0
- * @return
- * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String)
- */
- @Override
- public boolean isUserInRole(String arg0) {
- return delegate.isUserInRole(arg0);
- }
-
- /**
- * @param arg0
- * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
- */
- @Override
- public void removeAttribute(String arg0) {
- delegate.removeAttribute(arg0);
- }
-
- /**
- * @param arg0
- * @param arg1
- * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object)
- */
- @Override
- public void setAttribute(String arg0, Object arg1) {
- delegate.setAttribute(arg0, arg1);
- }
-
- /**
- * @param arg0
- * @throws UnsupportedEncodingException
- * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
- */
- @Override
- public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException {
- delegate.setCharacterEncoding(arg0);
- }
}
diff --git a/fhir-server/src/main/java/com/ibm/fhir/server/resources/Search.java b/fhir-server/src/main/java/com/ibm/fhir/server/resources/Search.java
index 880e937bb9d..b21c3538fd8 100644
--- a/fhir-server/src/main/java/com/ibm/fhir/server/resources/Search.java
+++ b/fhir-server/src/main/java/com/ibm/fhir/server/resources/Search.java
@@ -32,8 +32,6 @@
import com.ibm.fhir.server.util.RestAuditLogger;
@Path("/")
-@Consumes({ FHIRMediaType.APPLICATION_FHIR_JSON, MediaType.APPLICATION_JSON,
- FHIRMediaType.APPLICATION_FHIR_XML, MediaType.APPLICATION_XML })
@Produces({ FHIRMediaType.APPLICATION_FHIR_JSON, MediaType.APPLICATION_JSON,
FHIRMediaType.APPLICATION_FHIR_XML, MediaType.APPLICATION_XML })
@RolesAllowed("FHIRUsers")
@@ -142,7 +140,6 @@ private Response doSearchCompartment(String compartment, String compartmentId, S
}
@GET
- @Path("/")
public Response searchAllGet() {
return doSearchAll();
}