Search in sources :

Example 1 with ErrorResult

use of org.osgl.mvc.result.ErrorResult in project actframework by actframework.

the class NetworkHandler method handleException.

private void handleException(Exception exception, final ActionContext ctx, String errorMessage) {
    logger.error(exception, errorMessage);
    Result r;
    try {
        r = RequestHandlerProxy.GLOBAL_EXCEPTION_INTERCEPTOR.apply(exception, ctx);
    } catch (Exception e) {
        logger.error(e, "Error calling global exception interceptor");
        r = ActErrorResult.of(e);
    }
    if (null == r) {
        r = ActErrorResult.of(exception);
    } else if (r instanceof ErrorResult) {
        r = ActErrorResult.of(r);
    }
    if (null == ctx.handler()) {
        ctx.handler(FastRequestHandler.DUMB);
    }
    r.apply(ctx.req(), ctx.prepareRespForWrite());
}
Also used : ErrorResult(org.osgl.mvc.result.ErrorResult) ActErrorResult(act.view.ActErrorResult) NotAppliedException(org.osgl.exception.NotAppliedException) Result(org.osgl.mvc.result.Result) ErrorResult(org.osgl.mvc.result.ErrorResult) ActErrorResult(act.view.ActErrorResult)

Example 2 with ErrorResult

use of org.osgl.mvc.result.ErrorResult in project actframework by actframework.

the class UrlEncodedParser method parse.

@Override
public Map<String, String[]> parse(ActionContext context) {
    H.Request request = context.req();
    // Encoding is either retrieved from contentType or it is the default encoding
    final String encoding = request.characterEncoding();
    InputStream is = request.inputStream();
    try {
        Map<String, String[]> params = new LinkedHashMap<String, String[]>();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) > 0) {
            os.write(buffer, 0, bytesRead);
        }
        String data = new String(os.toByteArray(), encoding);
        if (data.length() == 0) {
            // data is empty - can skip the rest
            return new HashMap<String, String[]>(0);
        }
        // check if data is in JSON format
        if (data.startsWith("{") && data.endsWith("}") || data.startsWith("[") && data.endsWith("]")) {
            return C.Map(ActionContext.REQ_BODY, new String[] { data });
        }
        // data is o the form:
        // a=b&b=c%12...
        // Let us lookup in two phases - we wait until everything is parsed before
        // we decoded it - this makes it possible for use to look for the
        // special _charset_ param which can hold the charset the form is encoded in.
        // 
        // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
        // https://bugzilla.mozilla.org/show_bug.cgi?id=18643
        // 
        // NB: _charset_ must always be used with accept-charset and it must have the same value
        String[] keyValues = data.split("&");
        int httpMaxParams = context.app().config().httpMaxParams();
        // we should by default not lookup the params into HashMap if the count exceeds a maximum limit
        if (httpMaxParams != 0 && keyValues.length > httpMaxParams) {
            logger.warn("Number of request parameters %d is higher than maximum of %d, aborting. Can be configured using 'act.http.params.max'", keyValues.length, httpMaxParams);
            // 413 Request Entity Too Large
            throw new ErrorResult(H.Status.valueOf(413));
        }
        for (String keyValue : keyValues) {
            // split this key-value on the first '='
            int i = keyValue.indexOf('=');
            String key = null;
            String value = null;
            if (i > 0) {
                key = keyValue.substring(0, i);
                value = keyValue.substring(i + 1);
            } else {
                key = keyValue;
            }
            if (key.length() > 0) {
                MapUtil.mergeValueInMap(params, key, value);
            }
        }
        // Second phase - look for _charset_ param and do the encoding
        Charset charset = Charset.forName(encoding);
        if (params.containsKey("_charset_")) {
            // The form contains a _charset_ param - When this is used together
            // with accept-charset, we can use _charset_ to extract the encoding.
            // PS: When rendering the view/form, _charset_ and accept-charset must be given the
            // same value - since only Firefox and sometimes IE actually sets it when Posting
            String providedCharset = params.get("_charset_")[0];
            // Must be sure the providedCharset is a valid encoding..
            try {
                "test".getBytes(providedCharset);
                // it works..
                charset = Charset.forName(providedCharset);
            } catch (Exception e) {
                logger.debug("Got invalid _charset_ in form: " + providedCharset);
            // lets just use the default one..
            }
        }
        // We're ready to decode the params
        Map<String, String[]> decodedParams = new LinkedHashMap<String, String[]>(params.size());
        for (Map.Entry<String, String[]> e : params.entrySet()) {
            String key = e.getKey();
            try {
                key = Codec.decodeUrl(e.getKey(), charset);
            } catch (Throwable z) {
            // Nothing we can do about, ignore
            }
            for (String value : e.getValue()) {
                try {
                    MapUtil.mergeValueInMap(decodedParams, key, (value == null ? null : Codec.decodeUrl(value, charset)));
                } catch (Throwable z) {
                    // Nothing we can do about, lets fill in with the non decoded value
                    MapUtil.mergeValueInMap(decodedParams, key, value);
                }
            }
        }
        // add the complete body as a parameters
        if (!forQueryString) {
            decodedParams.put(ActionContext.REQ_BODY, new String[] { data });
        }
        return decodedParams;
    } catch (Result s) {
        // just pass it along
        throw s;
    } catch (Exception e) {
        throw new UnexpectedException(e);
    }
}
Also used : UnexpectedException(org.osgl.exception.UnexpectedException) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) InputStream(java.io.InputStream) H(org.osgl.http.H) ErrorResult(org.osgl.mvc.result.ErrorResult) Charset(java.nio.charset.Charset) ByteArrayOutputStream(java.io.ByteArrayOutputStream) UnexpectedException(org.osgl.exception.UnexpectedException) LinkedHashMap(java.util.LinkedHashMap) ErrorResult(org.osgl.mvc.result.ErrorResult) Result(org.osgl.mvc.result.Result) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map)

Example 3 with ErrorResult

use of org.osgl.mvc.result.ErrorResult in project actframework by actframework.

the class RequestHandlerProxy method onResult.

private void onResult(Result result, ActionContext context) {
    context.dissolve();
    boolean isRenderAny = false;
    try {
        if (result instanceof RenderAny) {
            RenderAny any = (RenderAny) result;
            isRenderAny = true;
            any.apply(context);
        } else {
            H.Request req = context.req();
            ActResponse<?> resp = context.prepareRespForWrite();
            if (result instanceof ErrorResult) {
                resp.contentType(req.accept());
            }
            result.apply(req, resp);
        }
    } catch (RuntimeException e) {
        context.cacheTemplate(null);
        throw e;
    } finally {
        if (isRenderAny) {
            RenderAny.clearThreadLocals();
        }
    }
}
Also used : H(org.osgl.http.H) ErrorResult(org.osgl.mvc.result.ErrorResult) ActErrorResult(act.view.ActErrorResult) RenderAny(act.view.RenderAny)

Aggregations

ErrorResult (org.osgl.mvc.result.ErrorResult)3 ActErrorResult (act.view.ActErrorResult)2 H (org.osgl.http.H)2 Result (org.osgl.mvc.result.Result)2 RenderAny (act.view.RenderAny)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 InputStream (java.io.InputStream)1 Charset (java.nio.charset.Charset)1 HashMap (java.util.HashMap)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 NotAppliedException (org.osgl.exception.NotAppliedException)1 UnexpectedException (org.osgl.exception.UnexpectedException)1