Java tutorial
/* * BeanShell Web * Copyright (C) 2012 Stefano Fornari * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License version 3 as published by * the Free Software Foundation with the addition of the following permission * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED * WORK IN WHICH THE COPYRIGHT IS OWNED BY Stefano Fornari, Stefano Fornari * DISCLAIMS THE WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program; if not, see http://www.gnu.org/licenses or write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA. */ package ste.web.http.beanshell; import bsh.EvalError; import bsh.Interpreter; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import org.apache.commons.io.IOUtils; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.entity.ContentType; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpCoreContext; import static ste.web.beanshell.Constants.*; import ste.web.http.BasicHttpConnection; import ste.web.http.HttpSessionContext; import ste.web.http.HttpUtils; import ste.web.http.QueryString; /** * * @author ste */ public class BeanShellUtils extends ste.web.beanshell.BeanShellUtils { // ---------------------------------------------------------- Public methods public static void setup(final Interpreter interpreter, final HttpRequest request, final HttpResponse response, final HttpSessionContext context) throws EvalError, IOException { // // Set attributes as script variables // for (String k : context.keySet()) { String key = normalizeVariableName(k); interpreter.set(key, context.getAttribute(k)); } // // If the request contains url-encoded body, set the given parameters // Header[] headers = request.getHeaders(HttpHeaders.CONTENT_TYPE); if (headers.length > 0) { String contentType = headers[0].getValue(); if (contentType.matches(ContentType.APPLICATION_FORM_URLENCODED.getMimeType() + "( *;.*)?")) { HttpEntityEnclosingRequest r = (HttpEntityEnclosingRequest) request; HttpEntity e = r.getEntity(); QueryString qs = QueryString.parse(IOUtils.toString(e.getContent())); for (String n : qs.getNames()) { String name = normalizeVariableName(n); interpreter.set(name, qs.getValues(n).get(0)); } } } // // Set request parameters as script variables. Note that parameters // override attributes (note that these override form content // try { QueryString qs = QueryString.parse(new URI(request.getRequestLine().getUri())); for (String n : qs.getNames()) { String name = normalizeVariableName(n); interpreter.set(name, qs.getValues(n).get(0)); } } catch (URISyntaxException x) { // // nothing to do // } BasicHttpConnection connection = (BasicHttpConnection) context .getAttribute(HttpCoreContext.HTTP_CONNECTION); interpreter.set(VAR_REQUEST, request); interpreter.set(VAR_RESPONSE, response); interpreter.set(VAR_SESSION, context); interpreter.set(VAR_OUT, connection.getWriter()); interpreter.set(VAR_LOG, log); if (HttpUtils.hasJSONBody(request) && (request instanceof HttpEntityEnclosingRequest)) { interpreter.set(VAR_BODY, getJSONBody(getEntityInputStream(request))); } } /** * Cleans up request variables so that they won't be set in next invocations * * @param interpreter the beanshell interpreter * @param request the request * * @throws bsh.EvalError in case of syntax errors * */ public static void cleanup(final Interpreter interpreter, final HttpRequest request) throws EvalError { try { URI uri = new URI(request.getRequestLine().getUri()); for (String name : QueryString.parse(uri).getNames()) { interpreter.unset(name); } } catch (URISyntaxException x) { // // nothing to do // } } /** * Sets all variables available in the interpreter as session attributes. * * @param i the interpreter - NOT NULL * @param c the request context - NOT NULL * * @throws EvalError */ public static void setVariablesAttributes(final Interpreter i, final HttpContext c) throws EvalError { if (i == null) { throw new IllegalArgumentException("interpreter cannot be null"); } if (c == null) { throw new IllegalArgumentException("context cannot be null"); } String[] vars = (String[]) i.get("this.variables"); for (String var : vars) { c.setAttribute(var, i.get(var)); } } // --------------------------------------------------------- private methods private static InputStream getEntityInputStream(HttpRequest r) throws IOException { return ((HttpEntityEnclosingRequest) r).getEntity().getContent(); } }