2020年10月16日(金) 22:08 Martin Grigorov <mgrigo...@apache.org>: > 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. > > I'm sorry to reply late. Thanks for your comment. Fixed changelog entry and added documentation.
> > > + </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 > > > > > -- Keiichi.Fujino