use of com.dexels.navajo.document.Header in project navajo by Dexels.
the class TmlHttpServlet method doPost.
/**
* Handle a request.
*
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
MDC.clear();
Date created = new java.util.Date();
long start = created.getTime();
String sendEncoding = request.getHeader("Accept-Encoding");
String recvEncoding = request.getHeader("Content-Encoding");
if (sendEncoding != null) {
MDC.put("Accept-Encoding", sendEncoding);
}
if (recvEncoding != null) {
MDC.put("Content-Encoding", recvEncoding);
}
DispatcherInterface dis = null;
BufferedReader r = null;
BufferedWriter out = null;
try {
Navajo in = null;
if (streamingMode) {
if (sendEncoding != null && sendEncoding.equals(COMPRESS_JZLIB)) {
r = new BufferedReader(new java.io.InputStreamReader(new InflaterInputStream(request.getInputStream()), "UTF-8"));
} else if (sendEncoding != null && sendEncoding.equals(COMPRESS_GZIP)) {
r = new BufferedReader(new java.io.InputStreamReader(new java.util.zip.GZIPInputStream(request.getInputStream()), "UTF-8"));
} else {
r = new BufferedReader(request.getReader());
}
in = NavajoFactory.getInstance().createNavajo(r);
r.close();
r = null;
} else {
logger.info("Warning: Using non-streaming mode for " + request.getRequestURI() + ", file written: " + logfileIndex + ", total size: " + bytesWritten);
InputStream is = request.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
copyResource(bos, is);
is.close();
bos.close();
byte[] bytes = bos.toByteArray();
try {
if (sendEncoding != null && sendEncoding.equals(COMPRESS_JZLIB)) {
r = new BufferedReader(new java.io.InputStreamReader(new InflaterInputStream(new ByteArrayInputStream(bytes)), "UTF-8"));
} else if (sendEncoding != null && sendEncoding.equals(COMPRESS_GZIP)) {
r = new BufferedReader(new java.io.InputStreamReader(new java.util.zip.GZIPInputStream(new ByteArrayInputStream(bytes)), "UTF-8"));
} else {
r = new BufferedReader(new java.io.InputStreamReader(new ByteArrayInputStream(bytes), "UTF-8"));
}
in = NavajoFactory.getInstance().createNavajo(r);
if (in == null) {
throw new Exception("Invalid Navajo");
}
r.close();
r = null;
} catch (Throwable t) {
// Write request to temp file.
File f = DispatcherFactory.getInstance().getTempDir();
if (f != null) {
bytesWritten += bytes.length;
logfileIndex++;
FileOutputStream fos = new FileOutputStream(new File(f, "request-" + logfileIndex));
copyResource(fos, new ByteArrayInputStream(bytes));
fos.close();
PrintWriter fw = new PrintWriter(new FileWriter(new File(f, "exception-" + logfileIndex)));
t.printStackTrace(fw);
fw.flush();
fw.close();
}
dumHttp(request, logfileIndex, f);
throw new ServletException(t);
}
}
long stamp = System.currentTimeMillis();
int pT = (int) (stamp - start);
if (in == null) {
throw new ServletException("Invalid request.");
}
Header header = in.getHeader();
if (header == null) {
throw new ServletException("Empty Navajo header.");
}
dis = DispatcherFactory.getInstance();
if (dis == null) {
System.err.println("SERIOUS: No dispatcher found. The navajo context did not initialize properly, check the logs to find out why!");
return;
}
// Check for certificate.
Object certObject = request.getAttribute("javax.servlet.request.X509Certificate");
// Call Dispatcher with parsed TML document as argument.
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.equals("")) {
ip = request.getRemoteAddr();
}
ClientInfo clientInfo = new ClientInfo(ip, "unknown", recvEncoding, pT, (recvEncoding != null && (recvEncoding.equals(COMPRESS_GZIP) || recvEncoding.equals(COMPRESS_JZLIB))), (sendEncoding != null && (sendEncoding.equals(COMPRESS_GZIP) || sendEncoding.equals(COMPRESS_JZLIB))), request.getContentLength(), created);
String instance = determineInstanceFromRequest(request);
Navajo outDoc = handleTransaction(instance, dis, in, certObject, clientInfo);
response.setContentType("text/xml; charset=UTF-8");
response.setHeader("Accept-Ranges", "none");
if (recvEncoding != null && recvEncoding.equals(COMPRESS_JZLIB)) {
response.setHeader("Content-Encoding", COMPRESS_JZLIB);
out = new BufferedWriter(new OutputStreamWriter(new DeflaterOutputStream(response.getOutputStream()), "UTF-8"));
} else if (recvEncoding != null && recvEncoding.equals(COMPRESS_GZIP)) {
response.setHeader("Content-Encoding", COMPRESS_GZIP);
out = new BufferedWriter(new OutputStreamWriter(new java.util.zip.GZIPOutputStream(response.getOutputStream()), "UTF-8"));
} else {
out = new BufferedWriter(response.getWriter());
}
outDoc.write(out);
out.flush();
out.close();
if (in.getHeader() != null && outDoc.getHeader() != null && !Dispatcher.isSpecialwebservice(in.getHeader().getRPCName())) {
statLogger.info("Finished {} ({}) in {}ms", outDoc.getHeader().getHeaderAttribute("accessId"), in.getHeader().getRPCName(), (System.currentTimeMillis() - start));
}
out = null;
} catch (Throwable e) {
logger.error("Error: ", e);
dumHttp(request, -1, null);
if (e instanceof FatalException) {
FatalException fe = (FatalException) e;
if (fe.getMessage().equals("500.13")) {
// Server too busy.
throw new ServletException("500.13", e);
}
}
throw new ServletException(e);
} finally {
dis = null;
if (r != null) {
try {
r.close();
} catch (Exception e) {
// NOT INTERESTED.
}
}
if (out != null) {
try {
out.close();
} catch (Exception e) {
// NOT INTERESTED.
}
}
}
}
use of com.dexels.navajo.document.Header in project navajo by Dexels.
the class GetHeader method evaluate.
@Override
public Object evaluate() throws TMLExpressionException {
String result;
if (inMessage != null) {
Header h = inMessage.getHeader();
result = h.getHeaderAttribute(getStringOperand(0));
} else {
return "empty header";
}
return result;
}
use of com.dexels.navajo.document.Header in project navajo by Dexels.
the class NavajoMap method run.
@Override
public void run() {
try {
Header h = outDoc.getHeader();
if (h == null) {
h = NavajoFactory.getInstance().createHeader(outDoc, method, username, password, -1);
outDoc.addHeader(h);
} else {
h.setRPCName(method);
h.setRPCPassword(password);
h.setRPCUser(username);
}
// Clear request id.
h.setRequestId(null);
h.setHeaderAttribute("parentaccessid", access.accessID);
h.setHeaderAttribute("application", access.getApplication());
h.setHeaderAttribute("organization", access.getOrganization());
if (locale != null && !locale.equals("")) {
h.setHeaderAttribute("locale", locale);
} else if (access.getInDoc() != null && access.getInDoc().getHeader().getHeaderAttribute("locale") != null) {
h.setHeaderAttribute("locale", access.getInDoc().getHeader().getHeaderAttribute("locale"));
}
if (userAgent != null && !userAgent.equals("")) {
h.setHeaderAttribute("user_agent", userAgent);
} else if (access.getInDoc() != null && access.getInDoc().getHeader().getHeaderAttribute("user_agent") != null) {
h.setHeaderAttribute("user_agent", access.getInDoc().getHeader().getHeaderAttribute("user_agent"));
}
// TODO: MAYBE ALL?
String tenant = access.getTenant();
boolean skipAuth = true;
if (this.tenant != null && !this.tenant.equals("")) {
tenant = this.tenant;
}
inDoc = DispatcherFactory.getInstance().handle(outDoc, tenant, skipAuth);
checkSetPerformOrderBy();
serviceFinished = true;
serviceCalled = true;
continueAfterRun();
} catch (Exception e) {
setException(e);
} finally {
serviceFinished = true;
serviceCalled = true;
}
}
use of com.dexels.navajo.document.Header in project navajo by Dexels.
the class AsyncProxyMap method run.
@Override
public void run() throws UserException {
Header h = outDoc.getHeader();
if (h == null) {
h = NavajoFactory.getInstance().createHeader(outDoc, method, username, password, -1);
outDoc.addHeader(h);
} else {
h.setRPCName(method);
h.setRPCPassword(password);
h.setRPCUser(username);
}
// Clear request id.
h.setRequestId(null);
try {
inDoc = DispatcherFactory.getInstance().handle(outDoc);
} catch (Exception e) {
throw new UserException(-1, e.getMessage(), e);
} finally {
logger.info("Setting set is finished.");
setIsFinished();
}
}
use of com.dexels.navajo.document.Header in project navajo by Dexels.
the class Dispatcher method generateAuthorizationErrorMessage.
/**
* Generate a Navajo authorization error response.
*
* @param access
* Beware, might be null
* @param ae
* @return
* @throws FatalException
*/
private final Navajo generateAuthorizationErrorMessage(Access access, AuthorizationException ae, String rpcName) throws FatalException {
try {
Navajo outMessage = NavajoFactory.getInstance().createNavajo();
// Make sure empty Header is constructed
Header h = NavajoFactory.getInstance().createHeader(outMessage, "", "", "", -1);
outMessage.addHeader(h);
Message errorMessage = NavajoFactory.getInstance().createMessage(outMessage, (ae.isNotAuthorized() ? AuthorizationException.AUTHORIZATION_ERROR_MESSAGE : AuthorizationException.AUTHENTICATION_ERROR_MESSAGE));
outMessage.addMessage(errorMessage);
Property prop = NavajoFactory.getInstance().createProperty(outMessage, "Message", Property.STRING_PROPERTY, ae.getMessage(), 0, "Message", Property.DIR_OUT);
errorMessage.addProperty(prop);
prop = NavajoFactory.getInstance().createProperty(outMessage, "User", Property.STRING_PROPERTY, ae.getUser(), 0, "User", Property.DIR_OUT);
errorMessage.addProperty(prop);
prop = NavajoFactory.getInstance().createProperty(outMessage, "Webservice", Property.STRING_PROPERTY, rpcName, 0, "User", Property.DIR_OUT);
errorMessage.addProperty(prop);
if (access != null) {
access.setException(ae);
access.setOutputDoc(outMessage);
}
return outMessage;
} catch (Exception e) {
throw new FatalException(e.getMessage(), e);
}
}
Aggregations