Test passes
This commit is contained in:
parent
29e7cdc476
commit
98c76a4d49
|
@ -8,6 +8,8 @@ import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import com.google.common.escape.Escaper;
|
import com.google.common.escape.Escaper;
|
||||||
import com.google.common.net.PercentEscaper;
|
import com.google.common.net.PercentEscaper;
|
||||||
|
import org.apache.http.NameValuePair;
|
||||||
|
import org.apache.http.client.utils.URLEncodedUtils;
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
@ -457,4 +459,23 @@ public class UrlUtil {
|
||||||
return theString;
|
return theString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<NameValuePair> translateMatchUrl(String theMatchUrl) {
|
||||||
|
List<NameValuePair> parameters;
|
||||||
|
String matchUrl = theMatchUrl;
|
||||||
|
int questionMarkIndex = matchUrl.indexOf('?');
|
||||||
|
if (questionMarkIndex != -1) {
|
||||||
|
matchUrl = matchUrl.substring(questionMarkIndex + 1);
|
||||||
|
}
|
||||||
|
matchUrl = matchUrl.replace("|", "%7C");
|
||||||
|
matchUrl = matchUrl.replace("=>=", "=%3E%3D");
|
||||||
|
matchUrl = matchUrl.replace("=<=", "=%3C%3D");
|
||||||
|
matchUrl = matchUrl.replace("=>", "=%3E");
|
||||||
|
matchUrl = matchUrl.replace("=<", "=%3C");
|
||||||
|
if (matchUrl.contains(" ")) {
|
||||||
|
throw new InvalidRequestException("Failed to parse match URL[" + theMatchUrl + "] - URL is invalid (must not contain spaces)");
|
||||||
|
}
|
||||||
|
|
||||||
|
parameters = URLEncodedUtils.parse((matchUrl), Constants.CHARSET_UTF8, '&');
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,13 +20,11 @@ public class ModifiableBundleEntry {
|
||||||
return myBundleEntryParts;
|
return myBundleEntryParts;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRequestUrl(FhirContext theFhirContext, String theRequestUrl) {
|
public void setRequestUrl(FhirContext theFhirContext, String theRequestUrl) {
|
||||||
myBundleEntryMutator.setRequestUrl(theFhirContext, theRequestUrl);
|
myBundleEntryMutator.setRequestUrl(theFhirContext, theRequestUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getRequestUrl() {
|
public String getRequestUrl() {
|
||||||
return myBundleEntryParts.getUrl();
|
return myBundleEntryParts.getUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||||
import ca.uhn.fhir.jpa.delete.DeleteConflictList;
|
import ca.uhn.fhir.jpa.delete.DeleteConflictList;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||||
import ca.uhn.fhir.jpa.model.entity.TagDefinition;
|
import ca.uhn.fhir.jpa.model.entity.TagDefinition;
|
||||||
import ca.uhn.fhir.jpa.provider.ServletSubRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletSubRequestDetails;
|
||||||
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
|
|
|
@ -30,7 +30,7 @@ import ca.uhn.fhir.jpa.delete.DeleteConflictList;
|
||||||
import ca.uhn.fhir.jpa.delete.DeleteConflictService;
|
import ca.uhn.fhir.jpa.delete.DeleteConflictService;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||||
import ca.uhn.fhir.jpa.model.search.StorageProcessingMessage;
|
import ca.uhn.fhir.jpa.model.search.StorageProcessingMessage;
|
||||||
import ca.uhn.fhir.jpa.provider.ServletSubRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletSubRequestDetails;
|
||||||
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
||||||
import ca.uhn.fhir.jpa.util.DeleteConflict;
|
import ca.uhn.fhir.jpa.util.DeleteConflict;
|
||||||
import ca.uhn.fhir.jpa.util.JpaInterceptorBroadcaster;
|
import ca.uhn.fhir.jpa.util.JpaInterceptorBroadcaster;
|
||||||
|
@ -49,11 +49,11 @@ import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.method.BaseMethodBinding;
|
import ca.uhn.fhir.rest.server.method.BaseMethodBinding;
|
||||||
import ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding;
|
import ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.util.ServletRequestUtil;
|
||||||
import ca.uhn.fhir.util.*;
|
import ca.uhn.fhir.util.*;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.google.common.collect.ArrayListMultimap;
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.apache.http.NameValuePair;
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.internal.SessionImpl;
|
import org.hibernate.internal.SessionImpl;
|
||||||
import org.hl7.fhir.dstu3.model.Bundle;
|
import org.hl7.fhir.dstu3.model.Bundle;
|
||||||
|
@ -402,37 +402,14 @@ public class TransactionProcessor<BUNDLE extends IBaseBundle, BUNDLEENTRY> {
|
||||||
Integer originalOrder = originalRequestOrder.get(nextReqEntry);
|
Integer originalOrder = originalRequestOrder.get(nextReqEntry);
|
||||||
BUNDLEENTRY nextRespEntry = myVersionAdapter.getEntries(response).get(originalOrder);
|
BUNDLEENTRY nextRespEntry = myVersionAdapter.getEntries(response).get(originalOrder);
|
||||||
|
|
||||||
ServletSubRequestDetails requestDetails = new ServletSubRequestDetails(theRequestDetails);
|
|
||||||
requestDetails.setServletRequest(theRequestDetails.getServletRequest());
|
|
||||||
requestDetails.setRequestType(RequestTypeEnum.GET);
|
|
||||||
requestDetails.setServer(theRequestDetails.getServer());
|
|
||||||
|
|
||||||
String url = extractTransactionUrlOrThrowException(nextReqEntry, "GET");
|
|
||||||
|
|
||||||
int qIndex = url.indexOf('?');
|
|
||||||
ArrayListMultimap<String, String> paramValues = ArrayListMultimap.create();
|
ArrayListMultimap<String, String> paramValues = ArrayListMultimap.create();
|
||||||
requestDetails.setParameters(new HashMap<>());
|
|
||||||
if (qIndex != -1) {
|
|
||||||
String params = url.substring(qIndex);
|
|
||||||
List<NameValuePair> parameters = myMatchUrlService.translateMatchUrl(params);
|
|
||||||
for (NameValuePair next : parameters) {
|
|
||||||
paramValues.put(next.getName(), next.getValue());
|
|
||||||
}
|
|
||||||
for (Map.Entry<String, Collection<String>> nextParamEntry : paramValues.asMap().entrySet()) {
|
|
||||||
String[] nextValue = nextParamEntry.getValue().toArray(new String[nextParamEntry.getValue().size()]);
|
|
||||||
requestDetails.addParameter(nextParamEntry.getKey(), nextValue);
|
|
||||||
}
|
|
||||||
url = url.substring(0, qIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (url.length() > 0 && url.charAt(0) == '/') {
|
String transactionUrl = extractTransactionUrlOrThrowException(nextReqEntry, "GET");
|
||||||
url = url.substring(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
requestDetails.setRequestPath(url);
|
ServletSubRequestDetails requestDetails = ServletRequestUtil.getServletSubRequestDetails(theRequestDetails, transactionUrl, paramValues);
|
||||||
requestDetails.setFhirServerBase(theRequestDetails.getFhirServerBase());
|
|
||||||
|
String url = requestDetails.getRequestPath();
|
||||||
|
|
||||||
theRequestDetails.getServer().populateRequestDetailsFromRequestPath(requestDetails, url);
|
|
||||||
BaseMethodBinding<?> method = theRequestDetails.getServer().determineResourceMethod(requestDetails, url);
|
BaseMethodBinding<?> method = theRequestDetails.getServer().determineResourceMethod(requestDetails, url);
|
||||||
if (method == null) {
|
if (method == null) {
|
||||||
throw new IllegalArgumentException("Unable to handle GET " + url);
|
throw new IllegalArgumentException("Unable to handle GET " + url);
|
||||||
|
@ -463,7 +440,7 @@ public class TransactionProcessor<BUNDLE extends IBaseBundle, BUNDLEENTRY> {
|
||||||
} catch (NotModifiedException e) {
|
} catch (NotModifiedException e) {
|
||||||
myVersionAdapter.setResponseStatus(nextRespEntry, toStatusString(Constants.STATUS_HTTP_304_NOT_MODIFIED));
|
myVersionAdapter.setResponseStatus(nextRespEntry, toStatusString(Constants.STATUS_HTTP_304_NOT_MODIFIED));
|
||||||
} catch (BaseServerResponseException e) {
|
} catch (BaseServerResponseException e) {
|
||||||
ourLog.info("Failure processing transaction GET {}: {}", url, e.toString());
|
ourLog.info("Failure processing transaction GET {}: {}", requestDetails.getRequestPath(), e.toString());
|
||||||
myVersionAdapter.setResponseStatus(nextRespEntry, toStatusString(e.getStatusCode()));
|
myVersionAdapter.setResponseStatus(nextRespEntry, toStatusString(e.getStatusCode()));
|
||||||
populateEntryWithOperationOutcome(e, nextRespEntry);
|
populateEntryWithOperationOutcome(e, nextRespEntry);
|
||||||
}
|
}
|
||||||
|
@ -486,6 +463,8 @@ public class TransactionProcessor<BUNDLE extends IBaseBundle, BUNDLEENTRY> {
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private boolean isValidVerb(String theVerb) {
|
private boolean isValidVerb(String theVerb) {
|
||||||
try {
|
try {
|
||||||
return org.hl7.fhir.r4.model.Bundle.HTTPVerb.fromCode(theVerb) != null;
|
return org.hl7.fhir.r4.model.Bundle.HTTPVerb.fromCode(theVerb) != null;
|
||||||
|
|
|
@ -22,12 +22,10 @@ package ca.uhn.fhir.jpa.subscription.dbcache;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.DaoRegistry;
|
import ca.uhn.fhir.jpa.dao.DaoRegistry;
|
||||||
import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
|
import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
|
||||||
import ca.uhn.fhir.jpa.provider.ServletSubRequestDetails;
|
|
||||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||||
import ca.uhn.fhir.jpa.subscription.SubscriptionActivatingInterceptor;
|
import ca.uhn.fhir.jpa.subscription.SubscriptionActivatingInterceptor;
|
||||||
import ca.uhn.fhir.jpa.subscription.module.cache.ISubscriptionProvider;
|
import ca.uhn.fhir.jpa.subscription.module.cache.ISubscriptionProvider;
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
|
@ -34,9 +34,9 @@ import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.util.CoverageIgnore;
|
import ca.uhn.fhir.util.CoverageIgnore;
|
||||||
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
import com.google.common.collect.ArrayListMultimap;
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import org.apache.http.NameValuePair;
|
import org.apache.http.NameValuePair;
|
||||||
import org.apache.http.client.utils.URLEncodedUtils;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@ -138,23 +138,7 @@ public class MatchUrlService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<NameValuePair> translateMatchUrl(String theMatchUrl) {
|
public List<NameValuePair> translateMatchUrl(String theMatchUrl) {
|
||||||
List<NameValuePair> parameters;
|
return UrlUtil.translateMatchUrl(theMatchUrl);
|
||||||
String matchUrl = theMatchUrl;
|
|
||||||
int questionMarkIndex = matchUrl.indexOf('?');
|
|
||||||
if (questionMarkIndex != -1) {
|
|
||||||
matchUrl = matchUrl.substring(questionMarkIndex + 1);
|
|
||||||
}
|
|
||||||
matchUrl = matchUrl.replace("|", "%7C");
|
|
||||||
matchUrl = matchUrl.replace("=>=", "=%3E%3D");
|
|
||||||
matchUrl = matchUrl.replace("=<=", "=%3C%3D");
|
|
||||||
matchUrl = matchUrl.replace("=>", "=%3E");
|
|
||||||
matchUrl = matchUrl.replace("=<", "=%3C");
|
|
||||||
if (matchUrl.contains(" ")) {
|
|
||||||
throw new InvalidRequestException("Failed to parse match URL[" + theMatchUrl + "] - URL is invalid (must not contain spaces)");
|
|
||||||
}
|
|
||||||
|
|
||||||
parameters = URLEncodedUtils.parse((matchUrl), Constants.CHARSET_UTF8, '&');
|
|
||||||
return parameters;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@CoverageIgnore
|
@CoverageIgnore
|
||||||
|
|
|
@ -31,6 +31,19 @@
|
||||||
<artifactId>javax.servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- FIXME KHS for NameValuePair grab apache httpcore instead-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.jena</groupId>
|
||||||
|
<artifactId>apache-jena-libs</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
<type>pom</type>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.github.jsonld-java</groupId>
|
||||||
|
<artifactId>jsonld-java</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Spring is added as an optional dependency just so that it
|
Spring is added as an optional dependency just so that it
|
||||||
|
|
|
@ -30,8 +30,14 @@ import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.ParameterUtil;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.AuthenticationException;
|
import ca.uhn.fhir.rest.server.exceptions.AuthenticationException;
|
||||||
import ca.uhn.fhir.util.bundle.BundleEntryParts;
|
import ca.uhn.fhir.rest.server.method.BaseMethodBinding;
|
||||||
|
import ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding;
|
||||||
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.servlet.ServletSubRequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.util.ServletRequestUtil;
|
||||||
import ca.uhn.fhir.util.bundle.BundleUtil;
|
import ca.uhn.fhir.util.bundle.BundleUtil;
|
||||||
|
import ca.uhn.fhir.util.bundle.ModifiableBundleEntry;
|
||||||
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import org.apache.commons.collections4.ListUtils;
|
import org.apache.commons.collections4.ListUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
|
@ -42,6 +48,7 @@ import org.slf4j.LoggerFactory;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interceptor can be used to automatically narrow the scope of searches in order to
|
* This interceptor can be used to automatically narrow the scope of searches in order to
|
||||||
|
@ -69,6 +76,7 @@ import java.util.*;
|
||||||
public class SearchNarrowingInterceptor {
|
public class SearchNarrowingInterceptor {
|
||||||
private static final Logger ourLog = LoggerFactory.getLogger(SearchNarrowingInterceptor.class);
|
private static final Logger ourLog = LoggerFactory.getLogger(SearchNarrowingInterceptor.class);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subclasses should override this method to supply the set of compartments that
|
* Subclasses should override this method to supply the set of compartments that
|
||||||
* the user making the request should actually have access to.
|
* the user making the request should actually have access to.
|
||||||
|
@ -177,21 +185,46 @@ public class SearchNarrowingInterceptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Hook(Pointcut.SERVER_INCOMING_REQUEST_PRE_HANDLED)
|
@Hook(Pointcut.SERVER_INCOMING_REQUEST_PRE_HANDLED)
|
||||||
public void incomingRequestPreHandled(RequestDetails theRequestDetails, HttpServletRequest theRequest, HttpServletResponse theResponse) throws AuthenticationException {
|
public void incomingRequestPreHandled(ServletRequestDetails theRequestDetails, HttpServletRequest theRequest, HttpServletResponse theResponse) throws AuthenticationException {
|
||||||
if (theRequestDetails.getRestOperationType() != RestOperationTypeEnum.TRANSACTION) {
|
if (theRequestDetails.getRestOperationType() != RestOperationTypeEnum.TRANSACTION) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
incomingRequestPostProcessedBundle(theRequestDetails, theRequest, theResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void incomingRequestPostProcessedBundle(RequestDetails theRequestDetails, HttpServletRequest theRequest, HttpServletResponse theResponse) {
|
|
||||||
IBaseBundle bundle = (IBaseBundle) theRequestDetails.getResource();
|
IBaseBundle bundle = (IBaseBundle) theRequestDetails.getResource();
|
||||||
FhirContext ctx = theRequestDetails.getFhirContext();
|
FhirContext ctx = theRequestDetails.getFhirContext();
|
||||||
List<BundleEntryParts> entries = BundleUtil.toListOfEntries(ctx, bundle);
|
BundleEntryUrlProcessor processor = new BundleEntryUrlProcessor(ctx, theRequestDetails, theRequest, theResponse);
|
||||||
for (BundleEntryParts entry : entries) {
|
BundleUtil.processEntries(ctx, bundle, processor);
|
||||||
bundle.setUserData("test", "bark");
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class BundleEntryUrlProcessor implements Consumer<ModifiableBundleEntry> {
|
||||||
|
private final FhirContext myFhirContext;
|
||||||
|
private final ServletRequestDetails myRequestDetails;
|
||||||
|
private final HttpServletRequest myRequest;
|
||||||
|
private final HttpServletResponse myResponse;
|
||||||
|
|
||||||
|
public BundleEntryUrlProcessor(FhirContext theFhirContext, ServletRequestDetails theRequestDetails, HttpServletRequest theRequest, HttpServletResponse theResponse) {
|
||||||
|
myFhirContext = theFhirContext;
|
||||||
|
myRequestDetails = theRequestDetails;
|
||||||
|
myRequest = theRequest;
|
||||||
|
myResponse = theResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(ModifiableBundleEntry theModifiableBundleEntry) {
|
||||||
|
ArrayListMultimap<String, String> paramValues = ArrayListMultimap.create();
|
||||||
|
|
||||||
|
String url = theModifiableBundleEntry.getRequestUrl();
|
||||||
|
|
||||||
|
ServletSubRequestDetails subServletRequestDetails = ServletRequestUtil.getServletSubRequestDetails(myRequestDetails, url, paramValues);
|
||||||
|
BaseMethodBinding<?> method = subServletRequestDetails.getServer().determineResourceMethod(subServletRequestDetails, url);
|
||||||
|
RestOperationTypeEnum restOperationType = method.getRestOperationType();
|
||||||
|
subServletRequestDetails.setRestOperationType(restOperationType);
|
||||||
|
|
||||||
|
incomingRequestPostProcessed(subServletRequestDetails, myRequest, myResponse);
|
||||||
|
|
||||||
|
theModifiableBundleEntry.setRequestUrl(myFhirContext, ServletRequestUtil.extractUrl(subServletRequestDetails));
|
||||||
}
|
}
|
||||||
theRequestDetails.setResource(bundle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processResourcesOrCompartments(RequestDetails theRequestDetails, RuntimeResourceDefinition theResDef, HashMap<String, List<String>> theParameterToOrValues, Collection<String> theResourcesOrCompartments, boolean theAreCompartments) {
|
private void processResourcesOrCompartments(RequestDetails theRequestDetails, RuntimeResourceDefinition theResDef, HashMap<String, List<String>> theParameterToOrValues, Collection<String> theResourcesOrCompartments, boolean theAreCompartments) {
|
||||||
|
@ -243,5 +276,4 @@ public class SearchNarrowingInterceptor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package ca.uhn.fhir.jpa.provider;
|
package ca.uhn.fhir.rest.server.servlet;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
|
@ -0,0 +1,64 @@
|
||||||
|
package ca.uhn.fhir.rest.server.util;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.servlet.ServletSubRequestDetails;
|
||||||
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
|
import org.apache.http.NameValuePair;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ServletRequestUtil {
|
||||||
|
public static ServletSubRequestDetails getServletSubRequestDetails(ServletRequestDetails theRequestDetails, String url, ArrayListMultimap<String, String> theParamValues) {
|
||||||
|
ServletSubRequestDetails requestDetails = new ServletSubRequestDetails(theRequestDetails);
|
||||||
|
requestDetails.setServletRequest(theRequestDetails.getServletRequest());
|
||||||
|
requestDetails.setRequestType(RequestTypeEnum.GET);
|
||||||
|
requestDetails.setServer(theRequestDetails.getServer());
|
||||||
|
|
||||||
|
int qIndex = url.indexOf('?');
|
||||||
|
requestDetails.setParameters(new HashMap<>());
|
||||||
|
if (qIndex != -1) {
|
||||||
|
String params = url.substring(qIndex);
|
||||||
|
List<NameValuePair> parameters = UrlUtil.translateMatchUrl(params);
|
||||||
|
for (NameValuePair next : parameters) {
|
||||||
|
theParamValues.put(next.getName(), next.getValue());
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, Collection<String>> nextParamEntry : theParamValues.asMap().entrySet()) {
|
||||||
|
String[] nextValue = nextParamEntry.getValue().toArray(new String[nextParamEntry.getValue().size()]);
|
||||||
|
requestDetails.addParameter(nextParamEntry.getKey(), nextValue);
|
||||||
|
}
|
||||||
|
url = url.substring(0, qIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url.length() > 0 && url.charAt(0) == '/') {
|
||||||
|
url = url.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestDetails.setRequestPath(url);
|
||||||
|
requestDetails.setFhirServerBase(theRequestDetails.getFhirServerBase());
|
||||||
|
|
||||||
|
theRequestDetails.getServer().populateRequestDetailsFromRequestPath(requestDetails, url);
|
||||||
|
return requestDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String extractUrl(ServletRequestDetails theRequestDetails) {
|
||||||
|
StringBuilder b = new StringBuilder();
|
||||||
|
for (Map.Entry<String, String[]> next : theRequestDetails.getParameters().entrySet()) {
|
||||||
|
for (String nextValue : next.getValue()) {
|
||||||
|
if (b.length() == 0) {
|
||||||
|
b.append('?');
|
||||||
|
} else {
|
||||||
|
b.append('&');
|
||||||
|
}
|
||||||
|
b.append(UrlUtil.escapeUrlParam(next.getKey()));
|
||||||
|
b.append('=');
|
||||||
|
b.append(UrlUtil.escapeUrlParam(nextValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return theRequestDetails.getRequestPath() + b.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ import ca.uhn.fhir.rest.server.FifoMemoryPagingProvider;
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
import ca.uhn.fhir.rest.server.RestfulServer;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
|
@ -30,6 +31,7 @@ import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -57,6 +59,8 @@ public class SearchNarrowingInterceptorTest {
|
||||||
private static Server ourServer;
|
private static Server ourServer;
|
||||||
private static IGenericClient ourClient;
|
private static IGenericClient ourClient;
|
||||||
private static AuthorizedList ourNextCompartmentList;
|
private static AuthorizedList ourNextCompartmentList;
|
||||||
|
private static Bundle.BundleEntryRequestComponent ourLastBundleRequest;
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
|
@ -114,7 +118,7 @@ public class SearchNarrowingInterceptorTest {
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
bundle.setType(Bundle.BundleType.TRANSACTION);
|
bundle.setType(Bundle.BundleType.TRANSACTION);
|
||||||
bundle.addEntry().getRequest().setMethod(Bundle.HTTPVerb.GET).setUrl("Observation");
|
bundle.addEntry().getRequest().setMethod(Bundle.HTTPVerb.GET).setUrl("Patient");
|
||||||
ourLog.info(ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle));
|
ourLog.info(ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle));
|
||||||
|
|
||||||
ourClient
|
ourClient
|
||||||
|
@ -122,16 +126,10 @@ public class SearchNarrowingInterceptorTest {
|
||||||
.withBundle(bundle)
|
.withBundle(bundle)
|
||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
assertEquals("Observation.search", ourLastHitMethod);
|
assertEquals("transaction", ourLastHitMethod);
|
||||||
assertNull(ourLastIdParam);
|
assertEquals("Patient?_id=" + URLEncoder.encode("Patient/123,Patient/456"), ourLastBundleRequest.getUrl());
|
||||||
assertNull(ourLastCodeParam);
|
|
||||||
assertNull(ourLastSubjectParam);
|
|
||||||
assertNull(ourLastPerformerParam);
|
|
||||||
assertThat(toStrings(ourLastPatientParam), Matchers.contains("Patient/123,Patient/456"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should not make any changes
|
* Should not make any changes
|
||||||
*/
|
*/
|
||||||
|
@ -305,6 +303,8 @@ public class SearchNarrowingInterceptorTest {
|
||||||
public static class DummySystemProvider {
|
public static class DummySystemProvider {
|
||||||
@Transaction
|
@Transaction
|
||||||
public Bundle transaction(@TransactionParam Bundle theInput) {
|
public Bundle transaction(@TransactionParam Bundle theInput) {
|
||||||
|
ourLastHitMethod = "transaction";
|
||||||
|
ourLastBundleRequest = theInput.getEntry().get(0).getRequest();
|
||||||
return theInput;
|
return theInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue