From b1c8641a63a67e3c64d948f9e8dce5c01e11e2dd Mon Sep 17 00:00:00 2001 From: mcentner Date: Wed, 5 May 2010 15:29:01 +0000 Subject: Merged feature branch mocca-1.2.13-id@r724 back to trunk. git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@725 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../egiz/bku/local/webapp/BKURequestHandler.java | 135 ++++++++++++++------- 1 file changed, 88 insertions(+), 47 deletions(-) (limited to 'BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java') diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java index 98be4047..cd81b592 100644 --- a/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java @@ -16,98 +16,139 @@ */ package at.gv.egiz.bku.local.webapp; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; -import java.util.Iterator; import java.util.Locale; import java.util.Map; +import java.util.concurrent.ExecutionException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import at.gv.egiz.bku.binding.HTTPBindingProcessor; +import at.gv.egiz.bku.binding.BindingProcessorFuture; +import at.gv.egiz.bku.binding.BindingProcessorManager; +import at.gv.egiz.bku.binding.HTTPBindingProcessorImpl; import at.gv.egiz.bku.binding.HttpUtil; -import at.gv.egiz.bku.conf.Configurator; +import at.gv.egiz.bku.binding.Id; +import at.gv.egiz.bku.binding.IdFactory; +import at.gv.egiz.bku.binding.InputDecoderFactory; import at.gv.egiz.org.apache.tomcat.util.http.AcceptLanguage; public class BKURequestHandler extends SpringBKUServlet { - public final static String ENCODING = "UTF-8"; + private static final long serialVersionUID = 1L; - protected Log log = LogFactory.getLog(BKURequestHandler.class); + public final static String ENCODING = "UTF-8"; + private final Logger log = LoggerFactory.getLogger(BKURequestHandler.class); + + @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { - log.debug("Received SecurityLayer request"); - String acceptLanguage = req.getHeader("Accept-Language"); Locale locale = AcceptLanguage.getLocale(acceptLanguage); - log.debug("Accept-Language locale: " + locale); + log.info("Received request. Accept-Language locale: {}.", locale); - HTTPBindingProcessor bindingProcessor; - bindingProcessor = (HTTPBindingProcessor) getBindingProcessorManager() - .createBindingProcessor(req.getRequestURL().toString(), null, locale); + BindingProcessorManager bindingProcessorManager = getBindingProcessorManager(); + + HTTPBindingProcessorImpl bindingProcessor; + bindingProcessor = (HTTPBindingProcessorImpl) bindingProcessorManager + .createBindingProcessor("HTTP", locale); Map headerMap = new HashMap(); - for (Enumeration headerName = req.getHeaderNames(); headerName + for (Enumeration headerName = req.getHeaderNames(); headerName .hasMoreElements();) { - String header = headerName.nextElement(); + String header = (String) headerName.nextElement(); if (header != null) { headerMap.put(header, req.getHeader(header)); } } - String charset = req.getCharacterEncoding(); - String contentType = req.getContentType(); - if (charset != null) { - contentType += ";" + charset; + + InputStream inputStream; + String charset; + if (req.getMethod().equals("POST")) { + charset = req.getCharacterEncoding(); + String contentType = req.getContentType(); + if (charset != null) { + contentType += ";" + charset; + } + headerMap.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, contentType); + inputStream = req.getInputStream(); + } else { + charset = "UTF-8"; + headerMap.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, + InputDecoderFactory.URL_ENCODED); + String queryString = req.getQueryString(); + if (queryString != null) { + inputStream = new ByteArrayInputStream(queryString.getBytes(charset)); + } else { + inputStream = new ByteArrayInputStream(new byte[] {}); + } } - headerMap.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, contentType); bindingProcessor.setHTTPHeaders(headerMap); - bindingProcessor.consumeRequestStream(req.getInputStream()); + bindingProcessor.consumeRequestStream(req.getRequestURL().toString(), inputStream); + req.getInputStream().close(); - // fixxme just for testing - bindingProcessor.run(); - if (bindingProcessor.getRedirectURL() != null) { - resp.sendRedirect(bindingProcessor.getRedirectURL()); - return; - } + String redirectURL = bindingProcessor.getRedirectURL(); + + Id id = IdFactory.getInstance().createId(); + BindingProcessorFuture bindingProcessorFuture = bindingProcessorManager + .process(id, bindingProcessor); + + if (redirectURL != null) { + // send redirect and return + resp.sendRedirect(redirectURL); + return; + } + + // wait for the binding processor to finish processing + try { + bindingProcessorFuture.get(); + } catch (InterruptedException e) { + resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); + return; + } catch (ExecutionException e) { + log.error("Request processing failed.", e); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return; + } + resp.setStatus(bindingProcessor.getResponseCode()); - for (Iterator it = bindingProcessor.getResponseHeaders().keySet() - .iterator(); it.hasNext();) { - String header = it.next(); - resp.setHeader(header, bindingProcessor.getResponseHeaders().get(header)); + + // set response headers + Map responseHeaders = bindingProcessor.getResponseHeaders(); + for (String header : responseHeaders.keySet()) { + resp.setHeader(header, responseHeaders.get(header)); } - String version = configurator.getProperty(Configurator.SIGNATURE_LAYOUT); - if ((version != null) && (!"".equals(version.trim()))) { - log.debug("setting SignatureLayout header to " + version); - resp.setHeader(Configurator.SIGNATURE_LAYOUT, version); - } else { - log.debug("do not set SignatureLayout header"); + String serverHeader = bindingProcessor.getServerHeaderValue(); + if (serverHeader != null && !serverHeader.isEmpty()) { + resp.setHeader(HttpUtil.HTTP_HEADER_SERVER, serverHeader); + } + String signatureLayout = bindingProcessor.getSignatureLayoutHeaderValue(); + if (signatureLayout != null && !signatureLayout.isEmpty()) { + resp.setHeader("SignatureLayout", signatureLayout); } - - if (configurator.getProperty(Configurator.USERAGENT_CONFIG_P) != null) { - resp.setHeader(HttpUtil.HTTP_HEADER_SERVER, configurator - .getProperty(Configurator.USERAGENT_CONFIG_P)); - } else { - resp.setHeader(HttpUtil.HTTP_HEADER_SERVER, - Configurator.USERAGENT_DEFAULT); - } resp.setContentType(bindingProcessor.getResultContentType()); resp.setCharacterEncoding(ENCODING); bindingProcessor.writeResultTo(resp.getOutputStream(), ENCODING); - req.getInputStream().close(); + resp.getOutputStream().flush(); resp.getOutputStream().close(); - log.debug("Finished Request"); + log.debug("Finished Request."); } + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { doPost(req, resp); } + + } -- cgit v1.2.3