package ameba.message.filtering;
import ameba.core.Requests;
import ameba.message.Download;
import com.google.common.base.Charsets;
import org.apache.commons.lang3.StringUtils;
import javax.inject.Singleton;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Date;
/**
* <p>DownloadEntityFilter class.</p>
*
* @author icode
*
*/
@Singleton
public class DownloadEntityFilter implements ContainerResponseFilter {
/**
* {@inheritDoc}
*/
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
Object entity = responseContext.getEntity();
if (entity instanceof Download) {
Download downloadEntity = (Download) entity;
Response.ResponseBuilder builder = null;
String _etag = downloadEntity.getEtag();
EntityTag etag = null;
if (_etag != null) {
etag = new EntityTag(_etag);
}
Long lm = downloadEntity.getLastModified();
Date lastModified = null;
if (lm != null) {
lastModified = new Date(lm);
}
if (etag != null && lastModified != null) {
builder = requestContext.getRequest().evaluatePreconditions(
lastModified,
etag
);
} else if (etag != null) {
builder = requestContext.getRequest().evaluatePreconditions(
etag
);
} else if (lastModified != null) {
builder = requestContext.getRequest().evaluatePreconditions(
lastModified
);
}
if (builder != null) {
responseContext.setEntity(builder.build());
return;
}
entity = downloadEntity.getEntity();
if (downloadEntity.isAttachment()) {
String download = "attachment;";
String fileName = downloadEntity.getFileName();
if (StringUtils.isBlank(fileName) && entity instanceof File) {
fileName = ((File) entity).getName();
}
if (StringUtils.isNotBlank(fileName)) {
String userAgent = Requests.getHeaders().getFirst(HttpHeaders.USER_AGENT);
fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
if (StringUtils.isBlank(userAgent) || userAgent.contains("MSIE") || userAgent.contains("Android"))
fileName = "filename=" + fileName;
else
fileName = "filename*=UTF-8''" + fileName;
download += fileName;
}
responseContext.getHeaders().putSingle(HttpHeaders.CONTENT_DISPOSITION, download);
}
if (downloadEntity.getMediaType() != null) {
MediaType mediaType = downloadEntity.getMediaType();
responseContext.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, mediaType);
}
if (etag != null) {
responseContext.getHeaders().putSingle(HttpHeaders.ETAG, etag);
}
if (lastModified != null) {
responseContext.getHeaders().putSingle(HttpHeaders.LAST_MODIFIED, lastModified);
}
responseContext.setEntity(entity);
}
}
}