Support to Content-Disposition as query parameter

Added to Storage Resolvers link support to content-disposition as input
query parameter.
This commit is contained in:
Francesco Mangiacrapa 2019-10-02 12:43:35 +02:00
parent ac85f3dd92
commit d1d093cdd4
8 changed files with 165 additions and 76 deletions

View File

@ -7,30 +7,35 @@ package org.gcube.datatransfer.resolver;
* The Class ConstantsResolver.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
* Oct 19, 2018
* Oct 19, 2018
*/
public class ConstantsResolver {
public static final String CONTENT_DISPOSITION = "Content-Disposition";
public static enum CONTENT_DISPOSITION_VALUE {inline, attachment};
public static enum CONTENT_DISPOSITION_VALUE {
inline, attachment
};
public static final String CONTENT_LENGTH = "Content-Length";
public static final String CONTENT_TYPE= "Content-Type";
public static final String QUERY_PARAM_CONTENTDISPOSITION = "content-disposition";
public static final String CONTENT_TYPE = "Content-Type";
public static final String DEFAULT_CONTENTTYPE_UNKNOWN_UNKNOWN = "unknown/unknown";
public static final String DEFAULT_FILENAME_FROM_STORAGE_MANAGER = "fromStorageManager";
public static final String HPC = "hproxycheck"; //for hproxycheck
public static final String HPC = "hproxycheck"; // for hproxycheck
public static final String QUERY_PARAM_CONTENTDISPOSITION = "content-disposition";
public static final String QUERY_PARAM_VALIDATION = "validation";
public static final String QUERY_PARAM_CONTENT_TYPE = "contentType";
public static final String QUERY_PARAM_FILE_NAME = "fileName";
public static final String[] resourcesHardCoded = {"ctlg"};
//The default resource candidate to manage the input requests not matching any resolver services
public static final String defaultServiceToRedirect= "storage";
public static final String[] resourcesHardCoded = { "ctlg" };
// The default resource candidate to manage the input requests not matching any
// resolver services
public static final String defaultServiceToRedirect = "storage";
public static final String SCOPE_SEPARATOR = "/";
}

View File

@ -74,6 +74,7 @@ public class RequestHandler implements ContainerRequestFilter, ContainerResponse
log.debug("The resources are: {}", listOfPath);
String path = reqContext.getUriInfo().getPath();
log.debug("The path is: {}", path);
//HOW TO READ THE QUERY STRING
/*MultivaluedMap<String, String> queryParameters = reqContext.getUriInfo().getQueryParameters();
@ -86,10 +87,7 @@ public class RequestHandler implements ContainerRequestFilter, ContainerResponse
}
log.debug("The query string is: {}", queryString);
*/
log.debug("The path is: {}", path);
if(path==null || path.isEmpty()) {
log.debug("The path is null or empty, redirecting to /index");
URI newRequestURI = reqContext.getUriInfo().getBaseUriBuilder().path("/index").build();

View File

@ -13,7 +13,9 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.ConstantsResolver.CONTENT_DISPOSITION_VALUE;
import org.gcube.datatransfer.resolver.services.error.ExceptionManager;
import org.gcube.datatransfer.resolver.util.ValidateContentDisposition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -53,7 +55,9 @@ public class SMPIDResolver {
@QueryParam(SMP_ID) @Nullable String smpId,
@QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName,
@QueryParam(ConstantsResolver.QUERY_PARAM_CONTENT_TYPE) String contentType,
@QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) Boolean validation) throws WebApplicationException{
@QueryParam(ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION) String contentDisposition,
@QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) boolean validation) throws WebApplicationException{
logger.info(this.getClass().getSimpleName()+" GET starts...");
try{
@ -62,8 +66,14 @@ public class SMPIDResolver {
logger.error(SMP_ID+" not found");
throw ExceptionManager.badRequestException(req, "Missing mandatory parameter "+SMP_ID, SMPIDResolver.class, helpURI);
}
//Checking the optional parameter "Content-Disposition"
CONTENT_DISPOSITION_VALUE dispositionValue = CONTENT_DISPOSITION_VALUE.attachment;
//Validating the Content-Disposition value
dispositionValue = ValidateContentDisposition.validValue(req, this.getClass(), helpURI, contentDisposition);
return StorageIDResolver.resolveStorageId(req, smpId, fileName, contentType, validation);
return StorageIDResolver.resolveStorageId(req, smpId, fileName, contentType, dispositionValue, validation);
}catch (Exception e) {

View File

@ -13,7 +13,9 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.ConstantsResolver.CONTENT_DISPOSITION_VALUE;
import org.gcube.datatransfer.resolver.services.error.ExceptionManager;
import org.gcube.datatransfer.resolver.util.ValidateContentDisposition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -54,7 +56,8 @@ public class SMPResolver {
String smpURI,
@QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName,
@QueryParam(ConstantsResolver.QUERY_PARAM_CONTENT_TYPE) String contentType,
@QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) Boolean validation) throws WebApplicationException{
@QueryParam(ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION) String contentDisposition,
@QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) boolean validation) throws WebApplicationException{
logger.info(this.getClass().getSimpleName()+" GET starts...");
@ -64,8 +67,13 @@ public class SMPResolver {
logger.error(SMP_URI+" not found");
throw ExceptionManager.badRequestException(req, "Missing mandatory parameter "+SMP_URI, SMPResolver.class, helpURI);
}
//Checking the optional parameter "Content-Disposition"
CONTENT_DISPOSITION_VALUE dispositionValue = CONTENT_DISPOSITION_VALUE.attachment;
//Validating the Content-Disposition value
dispositionValue = ValidateContentDisposition.validValue(req, this.getClass(), helpURI, contentDisposition);
return StorageIDResolver.resolveStorageId(req, smpURI, fileName, contentType, validation);
return StorageIDResolver.resolveStorageId(req, smpURI, fileName, contentType, dispositionValue, validation);
}catch (Exception e) {

View File

@ -6,6 +6,7 @@ import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
@ -17,7 +18,8 @@ import org.gcube.common.storagehub.client.proxies.ItemManagerClient;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.ConstantsResolver.CONTENT_DISPOSITION_VALUE;
import org.gcube.datatransfer.resolver.services.error.ExceptionManager;
import org.gcube.datatransfer.resolver.util.StorageHubMetadataResponseBuilder;
import org.gcube.datatransfer.resolver.shub.StorageHubMetadataResponseBuilder;
import org.gcube.datatransfer.resolver.util.ValidateContentDisposition;
import org.gcube.smartgears.utils.InnerMethodName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -101,7 +103,7 @@ public class StorageHubResolver {
*/
@GET
@Path("/{id}")
public Response download(@Context HttpServletRequest req) {
public Response download(@Context HttpServletRequest req, @QueryParam(ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION) String contentDisposition) {
logger.info(this.getClass().getSimpleName()+" GET download called");
try{
@ -114,20 +116,9 @@ public class StorageHubResolver {
}
//Checking the optional parameter "Content-Disposition"
String contDisp = req.getParameter(ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION);
CONTENT_DISPOSITION_VALUE dispValue = CONTENT_DISPOSITION_VALUE.attachment;
CONTENT_DISPOSITION_VALUE dispositionValue = CONTENT_DISPOSITION_VALUE.attachment;
//Validating the Content-Disposition value
if(contDisp!=null && !contDisp.isEmpty()) {
try {
//It must have a value of: "inline" or "attachement"
dispValue = ConstantsResolver.CONTENT_DISPOSITION_VALUE.valueOf(contDisp);
}catch (Exception e) {
String allowedValues = String.format("{%s,%s}", CONTENT_DISPOSITION_VALUE.inline,CONTENT_DISPOSITION_VALUE.attachment);
String msg = String.format("Wrong parameter: '%s=%s'. Valid '%s' values are: %s",ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION,contDisp,ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION,allowedValues);
logger.error(msg);
throw ExceptionManager.wrongParameterException(req, msg, StorageHubResolver.class, help);
}
}
dispositionValue = ValidateContentDisposition.validValue(req, this.getClass(), help, contentDisposition);
try{
@ -135,7 +126,7 @@ public class StorageHubResolver {
StreamDescriptor descriptor = client.resolvePublicLink(id);
ResponseBuilder response = Response.ok(descriptor.getStream());
response = new StorageHubMetadataResponseBuilder(req, response).fillMetadata(descriptor, id, dispValue);
response = new StorageHubMetadataResponseBuilder(req, response).fillMetadata(descriptor, id, dispositionValue);
return response.build();
}catch(Exception e){

View File

@ -23,10 +23,12 @@ import org.gcube.contentmanager.storageclient.wrapper.AccessType;
import org.gcube.contentmanager.storageclient.wrapper.MemoryType;
import org.gcube.contentmanager.storageclient.wrapper.StorageClient;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.ConstantsResolver.CONTENT_DISPOSITION_VALUE;
import org.gcube.datatransfer.resolver.services.error.ExceptionManager;
import org.gcube.datatransfer.resolver.storage.StorageClientInstance;
import org.gcube.datatransfer.resolver.storage.StorageMetadataFile;
import org.gcube.datatransfer.resolver.util.SingleFileStreamingOutput;
import org.gcube.datatransfer.resolver.util.ValidateContentDisposition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -47,7 +49,7 @@ public class StorageIDResolver {
protected static final String STORAGEID_RESOLVER = "storageid-resolver";
private static final String STORAGE_ID = "storage-id";
private static final Logger logger = LoggerFactory.getLogger(StorageIDResolver.class);
private static final Logger LOG = LoggerFactory.getLogger(StorageIDResolver.class);
private static String help = "https://wiki.gcube-system.org/gcube/URI_Resolver#STORAGE-ID_Resolver";
@ -69,16 +71,22 @@ public class StorageIDResolver {
@PathParam(STORAGE_ID) String storageId,
@QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName,
@QueryParam(ConstantsResolver.QUERY_PARAM_CONTENT_TYPE) String contentType,
@QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) Boolean validation) throws WebApplicationException {
@QueryParam(ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION) String contentDisposition,
@QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) boolean validation) throws WebApplicationException {
logger.info(this.getClass().getSimpleName()+" GET starts...");
LOG.info(this.getClass().getSimpleName()+" GET starts...");
//Checking the optional parameter "Content-Disposition"
CONTENT_DISPOSITION_VALUE dispositionValue = CONTENT_DISPOSITION_VALUE.attachment;
//Validating the Content-Disposition value
dispositionValue = ValidateContentDisposition.validValue(req, this.getClass(), help, contentDisposition);
try{
if(storageId==null || storageId.isEmpty()){
logger.error(STORAGE_ID+" not found");
LOG.error(STORAGE_ID+" not found");
throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter "+STORAGE_ID, StorageIDResolver.class, help);
}
return resolveStorageId(req, storageId, fileName, contentType, validation);
return resolveStorageId(req, storageId, fileName, contentType, dispositionValue, validation);
}catch (Exception e) {
if(!(e instanceof WebApplicationException)){
@ -89,7 +97,7 @@ public class StorageIDResolver {
throw ExceptionManager.internalErrorException(req, error, this.getClass(), help);
}
//ALREADY MANAGED AS WebApplicationException
logger.error("Exception:", e);
LOG.error("Exception:", e);
throw (WebApplicationException) e;
}
}
@ -106,13 +114,13 @@ public class StorageIDResolver {
* @return the response
* @throws Exception the exception
*/
protected static Response resolveStorageId(HttpServletRequest httpRequest, String storageId, String fileName, String contentType, Boolean validation) throws Exception{
protected static Response resolveStorageId(HttpServletRequest httpRequest, String storageId, String fileName, String contentType, CONTENT_DISPOSITION_VALUE contentDisposition, boolean validation) throws Exception{
logger.info("storage-id: "+storageId+", fileName: "+fileName+", contentType: "+contentType+", validation: "+validation);
LOG.info("storage-id: "+storageId+", fileName: "+fileName+", contentType: "+contentType+", validation: "+validation);
//Checking mandatory parameter storageId
if (storageId == null || storageId.isEmpty()) {
logger.error("storageId not found");
LOG.error("storageId not found");
throw ExceptionManager.badRequestException(httpRequest, "Missing mandatory path parameter "+STORAGE_ID, StorageIDResolver.class, help);
}
@ -120,18 +128,18 @@ public class StorageIDResolver {
String toSEID = null;
IClient iClient = null;
storageId = scInstance.getStorageId(); //IT SHOULD BE CHANGED es. removing the suffix '-VLT'
logger.info("I'm using the storageId {}",storageId);
LOG.info("I'm using the storageId {}",storageId);
try{
iClient = scInstance.getStorageClient().getClient();
toSEID = iClient.getId(storageId); //to Storage Encrypted ID
logger.info("Decoded ID"+" = "+ toSEID);
LOG.info("Decoded ID"+" = "+ toSEID);
}catch(Exception e){
logger.error("Storage Client Exception when getting file from storage: ", e);
LOG.error("Storage Client Exception when getting file from storage: ", e);
throw ExceptionManager.notFoundException(httpRequest, "Storage Client Exception when getting file from storage with id: "+storageId, StorageIDResolver.class, help);
}
if(toSEID==null || toSEID.isEmpty()){
logger.error("Decrypted id for storageId: "+storageId +" is null or empty!");
LOG.error("Decrypted id for storageId: "+storageId +" is null or empty!");
throw ExceptionManager.notFoundException(httpRequest, "Error on decrypting the "+STORAGE_ID+ " '"+storageId+"'. Is it a valid id?", StorageIDResolver.class, help);
}
@ -140,27 +148,32 @@ public class StorageIDResolver {
//READING THE METADATA OF FILE FROM STORAGE
StorageMetadataFile metaFile = getStorageMetadataFile(iClient,toSEID);
logger.debug("MetaFile retrieved from storage? "+ (metaFile!=null));
LOG.debug("MetaFile retrieved from storage? "+ (metaFile!=null));
if(metaFile!=null) {
//Reading the fileName from Storage Metadata only if the passed fileName is null
if(fileName==null || fileName.isEmpty())
if(fileName==null || fileName.isEmpty()) {
fileName= metaFile.getName();
LOG.debug("Read filename {} from {}", fileName, StorageMetadataFile.class.getSimpleName());
}
//Reading the contentType from Storage Metadata only if the passed contentType is null
if(contentType==null || contentType.isEmpty())
if(contentType==null || contentType.isEmpty()) {
contentType = metaFile.getMimeType();
LOG.debug("Read contentType {} from {}", contentType, StorageMetadataFile.class.getSimpleName());
}
//Reading the content size
size = metaFile.getSize();
LOG.debug("Read size {} from {}", size, StorageMetadataFile.class.getSimpleName());
}
//CHECKING TO DEFAULT METADATA
fileName = fileName==null || fileName.isEmpty()?ConstantsResolver.DEFAULT_FILENAME_FROM_STORAGE_MANAGER:fileName;
logger.info("filename retrieved is {}",fileName);
LOG.info("filename retrieved is {}",fileName);
contentType = contentType==null || contentType.isEmpty()?ConstantsResolver.DEFAULT_CONTENTTYPE_UNKNOWN_UNKNOWN:contentType;
logger.info("contentType used is {}",contentType);
LOG.info("contentType used is {}",contentType);
//Building the response
InputStream streamToWrite=iClient.get().RFileAsInputStream(toSEID); //input stream
@ -168,7 +181,7 @@ public class StorageIDResolver {
ResponseBuilder response = Response
.ok(so)
.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename=\""+fileName+"\"")
.header(ConstantsResolver.CONTENT_DISPOSITION, contentDisposition.name()+"; filename=\""+fileName+"\"")
.header(ConstantsResolver.CONTENT_LENGTH, size)
.header("Content-Type",contentType);
@ -195,14 +208,14 @@ public class StorageIDResolver {
@PathParam(STORAGE_ID) String storageId,
@QueryParam(ConstantsResolver.HPC) boolean hproxycheck) throws WebApplicationException {
logger.info(this.getClass().getSimpleName()+" HEAD starts...");
logger.info("The query string is: {}", req.getQueryString());
logger.info("Query parameter {} is {}", ConstantsResolver.HPC, hproxycheck);
LOG.info(this.getClass().getSimpleName()+" HEAD starts...");
LOG.info("The query string is: {}", req.getQueryString());
LOG.info("Query parameter {} is {}", ConstantsResolver.HPC, hproxycheck);
try{
//THIS IS FOR HPROXY CHECK
if(hproxycheck){
logger.trace("returning status 200 for Hproxy check");
LOG.trace("returning status 200 for Hproxy check");
ResponseBuilder response = Response.status(HttpStatus.SC_OK);
return response.build();
}
@ -219,7 +232,7 @@ public class StorageIDResolver {
throw ExceptionManager.internalErrorException(req, error, this.getClass(), help);
}
//ALREADY MANAGED AS WebApplicationException
logger.error("Exception:", e);
LOG.error("Exception:", e);
throw (WebApplicationException) e;
}
}
@ -234,30 +247,30 @@ public class StorageIDResolver {
* @throws Exception the exception
*/
protected Response validationPayload(HttpServletRequest httpRequest, String storageId) throws Exception{
logger.info("validationPayload called");
LOG.info("validationPayload called");
//Checking mandatory parameter storageId
if (storageId == null || storageId.isEmpty()) {
logger.warn("storageId not found");
LOG.warn("storageId not found");
throw ExceptionManager.badRequestException(httpRequest, "Storage Client Exception when getting file from storage with id: "+storageId, this.getClass(), help);
}
StorageClientInstance client = buildStorageClientInstance(storageId);
String toSEID = null;
IClient iClient = null;
storageId = client.getStorageId(); //IT SHOULD BE CHANGED es. removing the suffix '-VLT'
logger.info("I'm using the storageId {}",storageId);
LOG.info("I'm using the storageId {}",storageId);
try{
iClient = client.getStorageClient().getClient();
toSEID = iClient.getId(storageId); //to Storage Encrypted ID
logger.debug("Decoded ID"+" = "+ toSEID);
LOG.debug("Decoded ID"+" = "+ toSEID);
}catch(Exception e){
logger.error("Storage Client Exception when getting file from storage: ", e);
LOG.error("Storage Client Exception when getting file from storage: ", e);
throw ExceptionManager.internalErrorException(httpRequest, "Storage Client Exception when getting file from storage with id: "+storageId, StorageIDResolver.class, help);
}
if(toSEID==null || toSEID.isEmpty()){
logger.error("Decrypted id for storageId: "+storageId +" is null or empty!");
LOG.error("Decrypted id for storageId: "+storageId +" is null or empty!");
throw ExceptionManager.notFoundException(httpRequest, "Error on decrypting the "+STORAGE_ID+ " '"+storageId+"'. Is it a valid id?", StorageIDResolver.class, help);
}
@ -266,20 +279,25 @@ public class StorageIDResolver {
String contentType = ConstantsResolver.DEFAULT_CONTENTTYPE_UNKNOWN_UNKNOWN;
//READING THE METADATA OF FILE FROM STORAGE
StorageMetadataFile metadataFile = getStorageMetadataFile(iClient,toSEID);
logger.debug("MetaFile retrieved from storage? "+ (metadataFile!=null));
LOG.debug("MetaFile retrieved from storage? "+ (metadataFile!=null));
long size = 0;
if (metadataFile != null) {
// Reading the fileName from Storage Metadata only if it is not null
if (metadataFile.getName() != null)
if (metadataFile.getName() != null) {
fileName = metadataFile.getName();
LOG.debug("Read filename {} from {}", fileName, StorageMetadataFile.class.getSimpleName());
}
// Reading the contentType from Storage Metadata only if it is not null
if (metadataFile.getMimeType() != null)
if (metadataFile.getMimeType() != null) {
contentType = metadataFile.getMimeType();
LOG.debug("Read contentType {} from {}", contentType, StorageMetadataFile.class.getSimpleName());
}
size = metadataFile.getSize();
LOG.debug("Read size {} from {}", size, StorageMetadataFile.class.getSimpleName());
}
//Building the response
@ -290,16 +308,16 @@ public class StorageIDResolver {
ResponseBuilder response = null;
try {
c = streamToWrite.read(bytes);
logger.info(c+" byte read from InputStream");
LOG.info(c+" byte read from InputStream");
if(c>0){
logger.info("at least 1 byte read, returning status 200");
LOG.info("at least 1 byte read, returning status 200");
IOUtils.closeQuietly(streamToWrite);
response = Response.status(HttpStatus.SC_OK);
}else
throw ExceptionManager.notFoundException(httpRequest, "The file with id: "+storageId+" is missing in the storage", StorageIDResolver.class, help);
}
catch (IOException e2) {
logger.error("Error on validating the file: ",e2);
LOG.error("Error on validating the file: ",e2);
throw ExceptionManager.internalErrorException(httpRequest, "Error on validating the file with id: "+storageId, StorageIDResolver.class, help);
}
@ -364,7 +382,7 @@ public class StorageIDResolver {
return new StorageMetadataFile(myFile, size);
}catch (Exception e) {
logger.warn("Error on getting file metadata from storage, printing this warning and trying to continue..", e);
LOG.warn("Error on getting file metadata from storage, printing this warning and trying to continue..", e);
return null;
}

View File

@ -1,7 +1,7 @@
/**
*
*/
package org.gcube.datatransfer.resolver.util;
package org.gcube.datatransfer.resolver.shub;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Response.ResponseBuilder;
@ -11,6 +11,7 @@ import org.gcube.common.storagehub.client.plugins.AbstractPlugin;
import org.gcube.common.storagehub.client.proxies.ItemManagerClient;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.ConstantsResolver.CONTENT_DISPOSITION_VALUE;
import org.gcube.datatransfer.resolver.util.Util;
/**
@ -36,7 +37,7 @@ public class StorageHubMetadataResponseBuilder {
this.request = req;
this.responseBuilder = responseBuilder;
}
/**
* Fill metadata.
@ -58,7 +59,12 @@ public class StorageHubMetadataResponseBuilder {
//Managing "Content-Type"
if (streamDescriptor.getContentType()!= null && !streamDescriptor.getContentType().isEmpty())
responseBuilder.header("Content-Type", streamDescriptor.getContentType()+"; charset=utf-8");
responseBuilder.header("Content-Type", streamDescriptor.getContentType());
//Managing "Content-Lenght"
if(streamDescriptor.getContentLenght()>0) {
responseBuilder.header("Content-Length", streamDescriptor.getContentLenght());
}
//Managing "ETag"
//Here is not feasible because the entityId is cripted

View File

@ -0,0 +1,53 @@
package org.gcube.datatransfer.resolver.util;
import javax.servlet.http.HttpServletRequest;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.ConstantsResolver.CONTENT_DISPOSITION_VALUE;
import org.gcube.datatransfer.resolver.services.error.ExceptionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class ValidateContentDisposition.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
*
* Oct 2, 2019
*/
public class ValidateContentDisposition {
public static Logger LOG = LoggerFactory.getLogger(GetResponseRecordFilter.class);
/**
* Valid value.
*
* @param req the req
* @param resolverClass the resolver class
* @param helpURI the help URI
* @param contentDispositionValue the content disposition value
* @return the content disposition value
*/
public static CONTENT_DISPOSITION_VALUE validValue(HttpServletRequest req, Class resolverClass, String helpURI, String contentDispositionValue){
CONTENT_DISPOSITION_VALUE toDispositionValue = CONTENT_DISPOSITION_VALUE.attachment;
//Validating the Content-Disposition value
if(contentDispositionValue!=null && !contentDispositionValue.isEmpty()) {
try {
//It must have a value of: "inline" or "attachement"
toDispositionValue = ConstantsResolver.CONTENT_DISPOSITION_VALUE.valueOf(contentDispositionValue);
}catch (Exception e) {
String allowedValues = String.format("{%s,%s}", CONTENT_DISPOSITION_VALUE.inline,CONTENT_DISPOSITION_VALUE.attachment);
String msg = String.format("Wrong parameter: '%s=%s'. Valid '%s' values are: %s",ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION,contentDispositionValue,ConstantsResolver.QUERY_PARAM_CONTENTDISPOSITION,allowedValues);
LOG.error(msg);
throw ExceptionManager.wrongParameterException(req, msg, resolverClass, helpURI);
}
}
return toDispositionValue;
}
}