From dev-return-202436-archive-asf-public=cust-asf.ponee.io@tomcat.apache.org Fri Oct 11 09:51:42 2019 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [207.244.88.153]) by mx-eu-01.ponee.io (Postfix) with SMTP id 4AABE180656 for ; Fri, 11 Oct 2019 11:51:42 +0200 (CEST) Received: (qmail 92391 invoked by uid 500); 11 Oct 2019 09:51:38 -0000 Mailing-List: contact dev-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Developers List" Delivered-To: mailing list dev@tomcat.apache.org Received: (qmail 92308 invoked by uid 99); 11 Oct 2019 09:51:38 -0000 Received: from Unknown (HELO mailrelay1-lw-us.apache.org) (10.10.3.42) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 11 Oct 2019 09:51:38 +0000 Received: from mail-yw1-f42.google.com (mail-yw1-f42.google.com [209.85.161.42]) by mailrelay1-lw-us.apache.org (ASF Mail Server at mailrelay1-lw-us.apache.org) with ESMTPSA id C93F36222 for ; Fri, 11 Oct 2019 09:51:37 +0000 (UTC) Received: by mail-yw1-f42.google.com with SMTP id e205so3261371ywc.7 for ; Fri, 11 Oct 2019 02:51:37 -0700 (PDT) X-Gm-Message-State: APjAAAUmrqbHpICopc+/mG9Of6PbwiYepb4m4Qf9psqpFOLLq06hdoCT lV6lSYUYkd7/0+XzvlL5OxHc3ea5BS91CxOELLM= X-Google-Smtp-Source: APXvYqwudcoqg4JD0pZDKGbDeruMlgT2/5Vlwo2w7VpVc9Usz1ew+CUs0TGK3PHBMKfs8n3EB+a8bKnHAH2lLZD6T+s= X-Received: by 2002:a0d:d606:: with SMTP id y6mr1580697ywd.30.1570787497371; Fri, 11 Oct 2019 02:51:37 -0700 (PDT) MIME-Version: 1.0 References: <157078262202.29028.12535752263430737792@gitbox.apache.org> <20191011083022.2E01B811CC@gitbox.apache.org> In-Reply-To: <20191011083022.2E01B811CC@gitbox.apache.org> From: =?UTF-8?Q?R=C3=A9my_Maucherat?= Date: Fri, 11 Oct 2019 11:51:26 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [tomcat] 01/01: First draft To: Tomcat Developers List Content-Type: multipart/alternative; boundary="000000000000cc6f8a05949f760f" --000000000000cc6f8a05949f760f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Oct 11, 2019 at 10:30 AM wrote: > This is an automated email from the ASF dual-hosted git repository. > > michaelo pushed a commit to branch BZ-63835/8.5.x > in repository https://gitbox.apache.org/repos/asf/tomcat.git > > commit 6ff2233cbbd27c9c2c649208a21931e5f3e132a6 > Author: Michael Osipov > AuthorDate: Fri Oct 11 10:30:08 2019 +0200 > > First draft > + if (keepAliveTimeout > 0) { + String value =3D "timeout=3D" + TimeUnit.MILLISECONDS.toSeconds(keepAliveTimeout); + + if (maxKeepAliveRequests > 0) { + value +=3D ", max=3D" + maxKeepAliveRequests; + } StringBuilder ? Can you add a new flag controlling the feature ? The information may not be very useful in many cases such as when proxying, so it would be better to skip generating it by default. R=C3=A9my > --- > java/org/apache/coyote/http11/Http11Processor.java | 36 > ++++++++++++++++++---- > 1 file changed, 30 insertions(+), 6 deletions(-) > > diff --git a/java/org/apache/coyote/http11/Http11Processor.java > b/java/org/apache/coyote/http11/Http11Processor.java > index 6072602..3182bb7 100644 > --- a/java/org/apache/coyote/http11/Http11Processor.java > +++ b/java/org/apache/coyote/http11/Http11Processor.java > @@ -23,6 +23,7 @@ import java.util.Enumeration; > import java.util.Locale; > import java.util.Map; > import java.util.Set; > +import java.util.concurrent.TimeUnit; > import java.util.regex.Pattern; > > import javax.servlet.http.HttpServletResponse; > @@ -1307,7 +1308,7 @@ public class Http11Processor extends > AbstractProcessor { > } else { > // If the response code supports an entity body and we're on > // HTTP 1.1 then we chunk unless we have a Connection: close > header > - connectionClosePresent =3D isConnectionClose(headers); > + connectionClosePresent =3D isConnectionValue(headers, > Constants.CLOSE); > if (entityBody && http11 && !connectionClosePresent) { > outputBuffer.addActiveFilter > (outputFilters[Constants.CHUNKED_FILTER]); > @@ -1369,10 +1370,33 @@ public class Http11Processor extends > AbstractProcessor { > headers.addValue(Constants.CONNECTION).setString( > Constants.CLOSE); > } > - } else if (!http11 && !getErrorState().isError()) { > - > headers.addValue(Constants.CONNECTION).setString(Constants.KEEPALIVE); > - } > + } else if (!getErrorState().isError()) { > + if (!http11) { > + > headers.addValue(Constants.CONNECTION).setString(Constants.KEEPALIVE); > + } > + > + boolean connectionKeepAlivePresent =3D > + isConnectionValue(request.getMimeHeaders(), > Constants.KEEPALIVE); > + > + if (connectionKeepAlivePresent) { > + int keepAliveTimeout =3D endpoint.getKeepAliveTimeout(); > + int maxKeepAliveRequests =3D getMaxKeepAliveRequests(); > + > + if (keepAliveTimeout > 0) { > + String value =3D "timeout=3D" + > TimeUnit.MILLISECONDS.toSeconds(keepAliveTimeout); > + > + if (maxKeepAliveRequests > 0) { > + value +=3D ", max=3D" + maxKeepAliveRequests; > + } > > + headers.setValue("Keep-Alive").setString(value); > + } > + > + if (http11) { > + > headers.addValue(Constants.CONNECTION).setString(Constants.KEEPALIVE); > + } > + } > + } > // Add server header > if (server =3D=3D null) { > if (serverRemoveAppProvidedValues) { > @@ -1403,12 +1427,12 @@ public class Http11Processor extends > AbstractProcessor { > outputBuffer.commit(); > } > > - private static boolean isConnectionClose(MimeHeaders headers) { > + private static boolean isConnectionValue(MimeHeaders headers, String > value) { > MessageBytes connection =3D headers.getValue(Constants.CONNECTIO= N); > if (connection =3D=3D null) { > return false; > } > - return connection.equals(Constants.CLOSE); > + return connection.equals(value); > } > > private void prepareSendfile(OutputFilter[] outputFilters) { > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org > For additional commands, e-mail: dev-help@tomcat.apache.org > > --000000000000cc6f8a05949f760f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Fri, Oct 11, 2019 at 10:30 AM <michaelo@apache.org> wrote:
This is an automated email fro= m the ASF dual-hosted git repository.

michaelo pushed a commit to branch BZ-63835/8.5.x
in repository https://gitbox.apache.org/repos/asf/tomc= at.git

commit 6ff2233cbbd27c9c2c649208a21931e5f3e132a6
Author: Michael Osipov <michaelo@apache.org>
AuthorDate: Fri Oct 11 10:30:08 2019 +0200

=C2=A0 =C2=A0 First draft

+= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (keepAliveTimeou= t > 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Stri= ng value =3D "timeout=3D" + TimeUnit.MILLISECONDS.toSeconds(keepA= liveTimeout);
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (= maxKeepAliveRequests > 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 value +=3D ", max=3D" + maxKeepAliveRequests;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
StringBuilder ?

Can you add a new flag= controlling the feature ? The information may not be very useful in many c= ases such as when proxying, so it would be better to skip generating it by = default.

R=C3=A9my
=C2=A0
---
=C2=A0java/org/apache/coyote/http11/Http11Processor.java | 36 +++++++++++++= +++++----
=C2=A01 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/= apache/coyote/http11/Http11Processor.java
index 6072602..3182bb7 100644
--- a/java/org/apache/coyote/http11/Http11Processor.java
+++ b/java/org/apache/coyote/http11/Http11Processor.java
@@ -23,6 +23,7 @@ import java.util.Enumeration;
=C2=A0import java.util.Locale;
=C2=A0import java.util.Map;
=C2=A0import java.util.Set;
+import java.util.concurrent.TimeUnit;
=C2=A0import java.util.regex.Pattern;

=C2=A0import javax.servlet.http.HttpServletResponse;
@@ -1307,7 +1308,7 @@ public class Http11Processor extends AbstractProcesso= r {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// If the response code sup= ports an entity body and we're on
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// HTTP 1.1 then we chunk u= nless we have a Connection: close header
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 connectionClosePresent =3D isCon= nectionClose(headers);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 connectionClosePresent =3D isCon= nectionValue(headers, Constants.CLOSE);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (entityBody && h= ttp11 && !connectionClosePresent) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0outputBuffer.= addActiveFilter
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0(outputFilters[Constants.CHUNKED_FILTER]);
@@ -1369,10 +1370,33 @@ public class Http11Processor extends AbstractProces= sor {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0headers.addVa= lue(Constants.CONNECTION).setString(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0Constants.CLOSE);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!http11 && !getErrorState()= .isError()) {
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 headers.addValue(Constants.CONNE= CTION).setString(Constants.KEEPALIVE);
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!getErrorState().isError()) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!http11) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 headers.addValue(C= onstants.CONNECTION).setString(Constants.KEEPALIVE);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 boolean connectionKeepAlivePrese= nt =3D
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 isConnectionValue(= request.getMimeHeaders(), Constants.KEEPALIVE);
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (connectionKeepAlivePresent) = {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int keepAliveTimeo= ut =3D endpoint.getKeepAliveTimeout();
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int maxKeepAliveRe= quests =3D getMaxKeepAliveRequests();
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (keepAliveTimeo= ut > 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Stri= ng value =3D "timeout=3D" + TimeUnit.MILLISECONDS.toSeconds(keepA= liveTimeout);
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (= maxKeepAliveRequests > 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 value +=3D ", max=3D" + maxKeepAliveRequests;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 head= ers.setValue("Keep-Alive").setString(value);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (http11) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 head= ers.addValue(Constants.CONNECTION).setString(Constants.KEEPALIVE);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// Add server header
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (server =3D=3D null) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (serverRemoveAppProvided= Values) {
@@ -1403,12 +1427,12 @@ public class Http11Processor extends AbstractProces= sor {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0outputBuffer.commit();
=C2=A0 =C2=A0 =C2=A0}

-=C2=A0 =C2=A0 private static boolean isConnectionClose(MimeHeaders headers= ) {
+=C2=A0 =C2=A0 private static boolean isConnectionValue(MimeHeaders headers= , String value) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0MessageBytes connection =3D headers.getVa= lue(Constants.CONNECTION);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (connection =3D=3D null) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return false;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 return connection.equals(Constants.CLOSE);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 return connection.equals(value);
=C2=A0 =C2=A0 =C2=A0}

=C2=A0 =C2=A0 =C2=A0private void prepareSendfile(OutputFilter[] outputFilte= rs) {


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org

--000000000000cc6f8a05949f760f--