* Centralized way to create ResourceStoreRequests, since we have to fill in various things in Request context,
* like
* authenticated username, etc.
*/
protected ResourceStoreRequest getResourceStoreRequest(Request request, String resourceStorePath) {
ResourceStoreRequest result = new ResourceStoreRequest(resourceStorePath);
getLogger().trace("Created ResourceStore request for {}", result.getRequestPath());
// honor the local only and remote only
result.setRequestLocalOnly(isLocal(request, resourceStorePath));
result.setRequestRemoteOnly(isRemote(request, resourceStorePath));
result.setRequestAsExpired(asExpired(request, resourceStorePath));
result.setExternal(true);
// honor the describe, add timing
if (isDescribe(request)) {
result.getRequestContext().put(REQUEST_RECEIVED_KEY, System.currentTimeMillis());
}
// honor if-modified-since
if (request.getConditions().getModifiedSince() != null) {
result.setIfModifiedSince(request.getConditions().getModifiedSince().getTime());
}
// honor if-none-match
if (request.getConditions().getNoneMatch() != null && request.getConditions().getNoneMatch().size() > 0) {
final Tag tag = request.getConditions().getNoneMatch().get(0);
// NEXUS-5704: 500 Internal Server Error when "If-None-Match" in header
// Restlet 1.1 is very strict about properly formatted ETags (must be quoted)
// If unquoted, their presence is detected (IF above evals to true), but will
// actually return null as parsing the tag
if (tag != null && tag.getName() != null) {
result.setIfNoneMatch(tag.getName());
}
}
// stuff in the originating remote address
result.getRequestContext().put(AccessManager.REQUEST_REMOTE_ADDRESS, getValidRemoteIPAddress(request));
// stuff in the user id if we have it in request
Subject subject = securitySystem.getSubject();
if (subject != null && subject.getPrincipal() != null) {
result.getRequestContext().put(AccessManager.REQUEST_USER, subject.getPrincipal().toString());
}
result.getRequestContext().put(AccessManager.REQUEST_AGENT, request.getClientInfo().getAgent());
// this is HTTPS, get the cert and stuff it too for later
if (request.isConfidential()) {
result.getRequestContext().put(AccessManager.REQUEST_CONFIDENTIAL, Boolean.TRUE);
List<?> certs = (List<?>) request.getAttributes().get("org.restlet.https.clientCertificates");
if (certs != null) {
result.getRequestContext().put(AccessManager.REQUEST_CERTIFICATES, certs);
}
}
// put the incoming URLs
result.setRequestUrl(request.getOriginalRef().toString());
return result;
}