On Wed, Oct 14, 2020 at 5:55 PM <kfuj...@apache.org> wrote:

> This is an automated email from the ASF dual-hosted git repository.
>
> kfujino pushed a commit to branch master
> in repository https://gitbox.apache.org/repos/asf/tomcat.git
>
>
> The following commit(s) were added to refs/heads/master by this push:
>      new 42a0841  Add extended ErrorReportValve that returns response as
> JSON instead of HTML
> 42a0841 is described below
>
> commit 42a0841d289a35117da842201622454a9f387cd7
> Author: KeiichiFujino <kfuj...@apache.org>
> AuthorDate: Wed Oct 14 23:54:22 2020 +0900
>
>     Add extended ErrorReportValve that returns response as JSON instead of
> HTML
> ---
>  .../catalina/valves/JsonErrorReportValve.java      | 111
> +++++++++++++++++++++
>  webapps/docs/changelog.xml                         |   8 +-
>  2 files changed, 117 insertions(+), 2 deletions(-)
>
> diff --git a/java/org/apache/catalina/valves/JsonErrorReportValve.java
> b/java/org/apache/catalina/valves/JsonErrorReportValve.java
> new file mode 100644
> index 0000000..a438e77
> --- /dev/null
> +++ b/java/org/apache/catalina/valves/JsonErrorReportValve.java
> @@ -0,0 +1,111 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.catalina.valves;
> +
> +import java.io.IOException;
> +import java.io.Writer;
> +import java.util.concurrent.atomic.AtomicBoolean;
> +
> +import org.apache.catalina.connector.Request;
> +import org.apache.catalina.connector.Response;
> +import org.apache.catalina.tribes.util.ExceptionUtils;
> +import org.apache.coyote.ActionCode;
> +import org.apache.tomcat.util.res.StringManager;
> +
> +/**
> + * <p>Implementation of a Valve that outputs error jsons.</p>
> + *
> + * <p>This Valve should be attached at the Host level, although it will
> work
> + * if attached to a Context.</p>
> + *
> + */
> +public class JsonErrorReportValve extends ErrorReportValve {
> +
> +    public JsonErrorReportValve() {
> +        super();
> +    }
> +
> +    @Override
> +    protected void report(Request request, Response response, Throwable
> throwable) {
> +
> +        int statusCode = response.getStatus();
> +
> +        // Do nothing on a 1xx, 2xx and 3xx status
> +        // Do nothing if anything has been written already
> +        // Do nothing if the response hasn't been explicitly marked as in
> error
> +        //    and that error has not been reported.
> +        if (statusCode < 400 || response.getContentWritten() > 0 ||
> !response.setErrorReported()) {
> +            return;
> +        }
> +
> +        // If an error has occurred that prevents further I/O, don't
> waste time
> +        // producing an error report that will never be read
> +        AtomicBoolean result = new AtomicBoolean(false);
> +        response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED,
> result);
> +        if (!result.get()) {
> +            return;
> +        }
> +
> +        StringManager smClient =
> StringManager.getManager(Constants.Package, request.getLocales());
> +        response.setLocale(smClient.getLocale());
> +        String type = null;
> +        if (throwable != null) {
> +            type = smClient.getString("errorReportValve.exceptionReport");
> +        } else {
> +            type = smClient.getString("errorReportValve.statusReport");
> +        }
> +        String message = response.getMessage();
> +        if (message == null && throwable != null) {
> +            message = throwable.getMessage();
> +        }
> +        String description = null;
> +        description = smClient.getString("http." + statusCode + ".desc");
> +        if (description == null) {
> +            if (message.isEmpty()) {
> +                return;
> +            } else {
> +                description =
> smClient.getString("errorReportValve.noDescription");
> +            }
> +        }
> +        String jsonReport = "{\n" +
> +                            "  \"type\": \"" + type + "\",\n" +
> +                            "  \"message\": \"" + message + "\"\n" +
> +                            "  \"description\": \"" + description +
> "\"\n" +
> +                            "}";
> +        try {
> +            try {
> +                response.setContentType("application/json");
> +                response.setCharacterEncoding("utf-8");
> +            } catch (Throwable t) {
> +                ExceptionUtils.handleThrowable(t);
> +                if (container.getLogger().isDebugEnabled()) {
> +                    container.getLogger().debug("status.setContentType",
> t);
> +                }
> +            }
> +            Writer writer = response.getReporter();
> +            if (writer != null) {
> +                writer.write(jsonReport);
> +                response.finishResponse();
> +                return;
> +            }
> +        } catch (IOException e) {
> +            // Ignore
> +        } catch (IllegalStateException e) {
> +            // Ignore
> +        }
> +    }
> +}
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
> index 97cf512..1abb0ee 100644
> --- a/webapps/docs/changelog.xml
> +++ b/webapps/docs/changelog.xml
> @@ -63,9 +63,13 @@
>          retries are made on a new connection, just like with the single
>          connection scenario. (remm)
>        </fix>
> +      <add>
> +        Add extended <code>ErrorReportValve</code> that returns response
> as
> +        JSON instead of HTML. (kfujino)
>

>From the changelog entry it is not clear what is the name of the new class.
And since the docs are not updated the users will have to check the commit
diff to figure out.


> +      </add>
>      </changelog>
>    </subsection>
> -  <subseciton name="Coyote">
> +  <subsection name="Coyote">
>      <changelog>
>        <fix>
>          Refactor the HTTP/2 window update handling for padding in data
> frames to
> @@ -83,7 +87,7 @@
>          request statistics for HTTP/2 requests. (markt)
>        </fix>
>      </changelog>
> -  </subseciton>
> +  </subsection>
>    <subsection name="Jasper">
>      <changelog>
>        <fix>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>
>

Reply via email to