use of digilib.auth.AuthOpException in project digilib by robcast.
the class ScalerNoThread method processRequest.
/**
* Service this request using the response.
*
* @param request
* @param response
* @throws ServletException
*/
public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {
if (dlConfig == null) {
logger.error("ERROR: No Configuration!");
throw new ServletException("NO VALID digilib CONFIGURATION!");
}
accountlog.debug("request: " + request.getQueryString());
logger.debug("request: " + request.getQueryString());
long startTime = System.currentTimeMillis();
// parse request
DigilibServletRequest dlRequest = new DigilibServletRequest(request, dlConfig);
// type of error reporting
ErrMsg errMsgType = ErrMsg.IMAGE;
if (dlRequest.hasOption(DigilibOption.errtxt)) {
errMsgType = ErrMsg.TEXT;
} else if (dlRequest.hasOption(DigilibOption.errcode)) {
errMsgType = ErrMsg.CODE;
}
try {
// extract the job information
ImageJobDescription jobTicket = ImageJobDescription.getInstance(dlRequest, dlConfig);
/*
* check if we can fast-track without scaling
*/
ImageInput fileToLoad = (ImageInput) jobTicket.getInput();
// check permissions
if (useAuthorization) {
// is the current request/user authorized?
if (!authzOp.isAuthorized(dlRequest)) {
// send deny answer and abort
throw new AuthOpException();
}
}
// if requested, send image as a file
if (sendFileAllowed && jobTicket.getSendAsFile()) {
String mt = null;
if (jobTicket.hasOption(DigilibOption.rawfile)) {
mt = "application/octet-stream";
}
logger.debug("Sending RAW File as is.");
ServletOps.sendFile(fileToLoad.getFile(), mt, null, response, logger);
logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
return;
}
// it
if (!jobTicket.isTransformRequired()) {
logger.debug("Sending File as is.");
ServletOps.sendFile(fileToLoad.getFile(), null, null, response, logger);
logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
return;
}
// create job
ImageWorker job = new ImageWorker(dlConfig, jobTicket);
// get result immediately
DocuImage img = job.call();
// forced destination image type
String mt = null;
if (jobTicket.hasOption(DigilibOption.jpg)) {
mt = "image/jpeg";
} else if (jobTicket.hasOption(DigilibOption.png)) {
mt = "image/png";
}
// send image
ServletOps.sendImage(img, mt, response, logger);
logger.debug("Job Processing Time: " + (System.currentTimeMillis() - startTime) + "ms");
} catch (ImageOpException e) {
logger.error(e.getClass() + ": " + e.getMessage());
digilibError(errMsgType, Error.IMAGE, null, response);
} catch (IOException e) {
logger.error(e.getClass() + ": " + e.getMessage());
digilibError(errMsgType, Error.FILE, null, response);
} catch (AuthOpException e) {
logger.error(e.getClass() + ": " + e.getMessage());
digilibError(errMsgType, Error.AUTH, null, response);
}
}
use of digilib.auth.AuthOpException in project digilib by robcast.
the class Manifester method processRequest.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
try {
// create DigilibRequest from ServletRequest, omit IIIF Image API parsing
DigilibServletRequest dlRequest = new DigilibServletRequest(request, dlConfig, EnumSet.of(ParsingOption.omitIiifImageApi));
// get list of IIIF parameters
@SuppressWarnings("unchecked") List<String> iiifParams = (List<String>) dlRequest.getValue("request.iiif.elements");
if (iiifParams == null) {
logger.error("Invalid IIIF request.");
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid IIIF request.");
return;
}
// get identifier (first parameter)
// allow empty identifier for image root dir
String identifier = "";
if (iiifParams.size() > 0) {
identifier = iiifParams.get(0);
}
// decode identifier to file path
dlRequest.setValueFromString("fn", dlRequest.decodeIiifIdentifier(identifier));
// get directory path
String dlFn = dlRequest.getFilePath();
// get information about the directory
DocuDirectory dlDir = dirCache.getDirectory(dlFn);
if (dlDir == null) {
logger.error("Directory for manifest not found: " + dlFn);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
// check for existing manifest file
File mfFile = new File(dlDir.getDir(), "manifest.json");
// check for image files
if ((dlDir.size() == 0) && !mfFile.canRead()) {
logger.debug("Directory has no files: " + dlFn);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
ManifestParams params = new ManifestParams();
/*
* set CORS header ACAO "*" for info response as per IIIF spec
*/
if (corsForInfoRequests) {
String origin = request.getHeader("Origin");
if (origin != null) {
response.setHeader("Access-Control-Allow-Origin", "*");
}
}
/*
* check permissions
*/
if (useAuthorization) {
// is the current request/user authorized?
if (!authzOp.isAuthorized(dlRequest)) {
// send deny answer and abort
throw new AuthOpException("Access denied!");
}
}
// use JSON-LD content type only when asked
String accept = request.getHeader("Accept");
if (accept != null && accept.contains("application/ld+json")) {
response.setContentType("application/ld+json");
} else {
response.setContentType("application/json");
}
if (mfFile.canRead()) {
// send manifest file
ServletOps.sendFile(mfFile, "", "", response);
return;
}
// check for manifest-meta.json file with additional metadata
File mfMetaFile = new File(dlDir.getDir(), "manifest-meta.json");
if (mfMetaFile.canRead()) {
params.mfMetaFile = mfMetaFile;
}
/*
* configure base URLs for manifest
*/
params.imgApiUrl = dlConfig.getAsString("iiif-image-base-url");
String manifestBaseUrl = dlConfig.getAsString("iiif-manifest-base-url");
if ("".equals(params.imgApiUrl) || "".equals(manifestBaseUrl)) {
// try to figure out base URLs
String servletBaseUrl = dlConfig.getAsString("webapp-base-url");
if ("".equals(servletBaseUrl)) {
String url = request.getRequestURL().toString();
// get base URL for web application by last occurrence of Servlet path
int srvPathLen = url.lastIndexOf(request.getServletPath());
servletBaseUrl = url.substring(0, srvPathLen);
}
// manifest base URL
manifestBaseUrl = servletBaseUrl + request.getServletPath() + "/" + dlConfig.getAsString("iiif-prefix");
// Image API base URL
params.imgApiUrl = servletBaseUrl + "/" + this.scalerServletPath + "/" + dlConfig.getAsString("iiif-prefix");
}
// full manifest URL with identifier
params.manifestUrl = manifestBaseUrl + "/" + identifier;
params.identifier = identifier;
params.docuDir = dlDir;
/*
* start json representation
*/
ServletOutputStream out = response.getOutputStream();
JsonGenerator manifest = Json.createGenerator(out).writeStartObject();
/*
* manifest metadata
*/
writeManifestMeta(manifest, dlFn, params);
/*
* sequences
*/
writeSequences(manifest, params);
// manifest
manifest.writeEnd();
manifest.close();
} catch (IOException e) {
logger.error("ERROR sending manifest: ", e);
} catch (ImageOpException e) {
logger.error("ERROR sending manifest: ", e);
} catch (AuthOpException e) {
logger.debug("Permission denied.");
try {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
} catch (IOException e1) {
logger.error("Error sending error: ", e);
}
}
}
use of digilib.auth.AuthOpException in project digilib by robcast.
the class Scaler method processRequest.
/**
* Service this request using the response.
*
* @param request
* @param response
* @throws ServletException
*/
public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {
if (dlConfig == null) {
logger.error("ERROR: No Configuration!");
throw new ServletException("NO VALID digilib CONFIGURATION!");
}
accountlog.debug("request: " + request.getQueryString());
logger.debug("request: " + request.getQueryString());
// logger.debug("processRequest response committed=" + response.isCommitted());
if (response.isCommitted()) {
logger.error("Crap: response committed before we got a chance!");
}
final long startTime = System.currentTimeMillis();
// parse request
DigilibServletRequest dlRequest = new DigilibServletRequest(request, dlConfig);
// type of error reporting
ErrMsg errMsgType = defaultErrMsgType;
if (dlRequest.hasOption(DigilibOption.errimg)) {
errMsgType = ErrMsg.IMAGE;
} else if (dlRequest.hasOption(DigilibOption.errtxt)) {
errMsgType = ErrMsg.TEXT;
} else if (dlRequest.hasOption(DigilibOption.errcode)) {
errMsgType = ErrMsg.CODE;
}
try {
// extract the job information
final ImageJobDescription jobTicket = ImageJobDescription.getInstance(dlRequest, dlConfig);
// handle the IIIF info-request
if (dlRequest.hasOption(DigilibOption.info)) {
ServletOps.sendIiifInfo(dlRequest, response, logger);
return;
}
if (dlRequest.hasOption(DigilibOption.redirect_info)) {
StringBuffer url = request.getRequestURL();
if (url.toString().endsWith("/")) {
url.append("info.json");
} else {
url.append("/info.json");
}
// TODO: the redirect should have code 303
response.sendRedirect(url.toString());
return;
}
// error out if request was bad
if (dlRequest.errorMessage != null) {
digilibError(errMsgType, Error.UNKNOWN, dlRequest.errorMessage, response);
return;
}
/*
* check permissions
*/
if (useAuthorization) {
// is the current request/user authorized?
if (!authzOp.isAuthorized(dlRequest)) {
// send deny answer and abort
throw new AuthOpException("Access denied!");
}
}
/*
* get the input file
*/
ImageInput fileToLoad = jobTicket.getInput();
/*
* if requested, send image as a file
*/
if (sendFileAllowed && jobTicket.getSendAsFile()) {
String mt = null;
if (jobTicket.hasOption(DigilibOption.rawfile)) {
// mo=rawfile sends as octet-stream
mt = "application/octet-stream";
}
logger.debug("Sending RAW File as is.");
ServletOps.sendFile(fileToLoad.getFile(), mt, null, response, logger);
logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
return;
}
/*
* send the image if it's possible without having to transform it
*/
if (!jobTicket.isTransformRequired()) {
logger.debug("Sending File as is.");
ServletOps.sendFile(fileToLoad.getFile(), null, null, response, logger);
logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
return;
}
/*
* check load of workers
*/
if (imageJobCenter.isBusy()) {
logger.error("Servlet overloaded!");
response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
return;
}
/*
* dispatch worker job to be done asynchronously
*/
AsyncContext asyncCtx = request.startAsync();
// create job
AsyncServletWorker job = new AsyncServletWorker(dlConfig, jobTicket, asyncCtx, errMsgType, startTime);
// AsyncServletWorker is its own AsyncListener
asyncCtx.addListener(job);
// submit job
imageJobCenter.submit(job);
// we're done for now
} catch (ImageOpException e) {
logger.error(e.getClass() + ": " + e.getMessage());
digilibError(errMsgType, Error.IMAGE, null, response);
} catch (IOException e) {
logger.error(e.getClass() + ": " + e.getMessage());
digilibError(errMsgType, Error.FILE, null, response);
} catch (AuthOpException e) {
logger.error(e.getClass() + ": " + e.getMessage());
digilibError(errMsgType, Error.AUTH, null, response);
} catch (Exception e) {
logger.error("Other Exception: ", e);
// TODO: should we rethrow or swallow?
// throw new ServletException(e);
}
}
Aggregations