Merge remote-tracking branch 'origin/jetty-9.4.x' into jetty-10.0.x-fixed
This commit is contained in:
commit
1c04f9838d
|
@ -41,8 +41,9 @@ def getFullBuild(jdk, os) {
|
||||||
maven: 'maven3',
|
maven: 'maven3',
|
||||||
jdk: "$jdk",
|
jdk: "$jdk",
|
||||||
publisherStrategy: 'EXPLICIT',
|
publisherStrategy: 'EXPLICIT',
|
||||||
|
globalMavenSettingsConfig: 'oss-settings.xml',
|
||||||
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
||||||
sh "mvn -V -B clean install -Dtest=None -T6"
|
sh "mvn -V -B clean install -DskipTests -T6"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -62,6 +63,7 @@ def getFullBuild(jdk, os) {
|
||||||
maven: 'maven3',
|
maven: 'maven3',
|
||||||
jdk: "$jdk",
|
jdk: "$jdk",
|
||||||
publisherStrategy: 'EXPLICIT',
|
publisherStrategy: 'EXPLICIT',
|
||||||
|
globalMavenSettingsConfig: 'oss-settings.xml',
|
||||||
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
||||||
sh "mvn -V -B javadoc:javadoc -T5"
|
sh "mvn -V -B javadoc:javadoc -T5"
|
||||||
}
|
}
|
||||||
|
@ -83,6 +85,8 @@ def getFullBuild(jdk, os) {
|
||||||
maven: 'maven3',
|
maven: 'maven3',
|
||||||
jdk: "$jdk",
|
jdk: "$jdk",
|
||||||
publisherStrategy: 'EXPLICIT',
|
publisherStrategy: 'EXPLICIT',
|
||||||
|
//options: [invokerPublisher(disabled: false)],
|
||||||
|
globalMavenSettingsConfig: 'oss-settings.xml',
|
||||||
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
||||||
//
|
//
|
||||||
sh "mvn -V -B install -Dmaven.test.failure.ignore=true -Prun-its -T3 -e -Dmaven.repo.local=${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}"
|
sh "mvn -V -B install -Dmaven.test.failure.ignore=true -Prun-its -T3 -e -Dmaven.repo.local=${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}"
|
||||||
|
@ -137,6 +141,7 @@ def getFullBuild(jdk, os) {
|
||||||
maven: 'maven3',
|
maven: 'maven3',
|
||||||
jdk: "$jdk",
|
jdk: "$jdk",
|
||||||
publisherStrategy: 'EXPLICIT',
|
publisherStrategy: 'EXPLICIT',
|
||||||
|
globalMavenSettingsConfig: 'oss-settings.xml',
|
||||||
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
|
||||||
sh "mvn -V -B -Pcompact3 clean install -T5"
|
sh "mvn -V -B -Pcompact3 clean install -T5"
|
||||||
}
|
}
|
||||||
|
|
92
VERSION.txt
92
VERSION.txt
|
@ -1,5 +1,97 @@
|
||||||
jetty-10.0.0-SNAPSHOT
|
jetty-10.0.0-SNAPSHOT
|
||||||
|
|
||||||
|
jetty-9.4.9.v20180320 - 20 March 2018
|
||||||
|
+ 347 Avoid sending request using a connection that is idle timing out
|
||||||
|
+ 1416 GzipHandler generated ETag suffix has problems with If-Match header
|
||||||
|
logic
|
||||||
|
+ 1602 WebAppContext is started twice, once by deployer, again by lifecycle
|
||||||
|
+ 1614 AbstractNCSARequestLog does not extract the user from the http header
|
||||||
|
when it has not been authenticated
|
||||||
|
+ 1770 SniX509ExtendedKeyManager.chooseServerAlias() throws
|
||||||
|
NullPointerException when socket is null
|
||||||
|
+ 1797 JEP 238 - Multi-Release JAR files break bytecode scanning
|
||||||
|
+ 1832 Bad HTTP Close prevents proper TCP close
|
||||||
|
+ 1918 Scalable scheduler implementation
|
||||||
|
+ 1933 Use CLASSPATH for scanning java9 system classes
|
||||||
|
+ 1940 Embedded CDI: SessionScoped gives a NPE
|
||||||
|
+ 1949 Client-side problems with digest authentication
|
||||||
|
+ 1956 Store and report build information of Jetty
|
||||||
|
+ 1966 HttpMethod case sensitive
|
||||||
|
+ 1970 ManagedSelector can lose selector thread under high concurrent load
|
||||||
|
+ 1973 Implement minimum response data rate
|
||||||
|
+ 1983 Improve warning for incompatible ALPN processor
|
||||||
|
+ 1986 ServletContextHandler.Context addListener() methods support
|
||||||
|
session listeners
|
||||||
|
+ 2003 Do not submit blocking tasks as managed selector actions
|
||||||
|
+ 2006 ServletInputStream.isReady not registering interest when it should
|
||||||
|
+ 2010 SniX509ExtendedKeyManager causes exception: "FIPS mode: only SunJSSE
|
||||||
|
KeyManagers may be used"
|
||||||
|
+ 2014 Support unix domain sockets in HttpClient
|
||||||
|
+ 2015 jetty-alpn-conscrypt-server needs appropriate osgi headers in manifest
|
||||||
|
+ 2016 jetty-alpn-openjdk8-server needs correct osgi headers in manifest
|
||||||
|
+ 2019 Expose HttpClientTransport in JMX
|
||||||
|
+ 2020 Introduce a name for `HttpClient` instances
|
||||||
|
+ 2022 Fine grained RFC HTTP Compliance modes: including OWS prior to field
|
||||||
|
colon
|
||||||
|
+ 2028 Add osgi headers for alpn-java client and server
|
||||||
|
+ 2030 NPE in AnnotationConfiguration with DEBUG enabled
|
||||||
|
+ 2033 Improve HTTP/2 session and stream stall times report
|
||||||
|
+ 2034 Improve HTTP2Session dump
|
||||||
|
+ 2035 FlowControlStrategy keeps around reset streams
|
||||||
|
+ 2037 HTTP/2 stream reset leaves stream frames in the flusher
|
||||||
|
+ 2038 FileSessionDataStore.deleteAllFiles(File, String) can become slow
|
||||||
|
+ 2043 ConcurrentModificationException during annotation parsing
|
||||||
|
+ 2046 Server.stop not closing connections
|
||||||
|
+ 2050 Clarify ObjectMBean getObject[Name|Context]Basis() methods
|
||||||
|
+ 2079 Upgrade to apache jasper 8.5.24
|
||||||
|
+ 2080 Exclude more maven machinery dependencies from the jetty-maven-plugin
|
||||||
|
server path
|
||||||
|
+ 2081 No idle timeout exception when dispatch is delayed
|
||||||
|
+ 2088 Recycle HTTP/2 channels on the client
|
||||||
|
+ 2090 Jetty fails to start on OpenJDK 9: "Invalid Java version 9.0.1.3"
|
||||||
|
+ 2093 Correcting Bom managed dependencies that do not exist
|
||||||
|
+ 2114 Fix NPE in JettyHttpServerProvider
|
||||||
|
+ 2117 Allow to configure HttpClient default request Content-Type
|
||||||
|
+ 2130 Introduce thread pool module for simpler configuration of thread pool
|
||||||
|
in standalone
|
||||||
|
+ 2131 Introduce a monitored thread pool
|
||||||
|
+ 2136 maven & jetty-maven-plugin & offline
|
||||||
|
error:java.net.UnknownHostException: www.eclipse.org
|
||||||
|
+ 2148 Limit BufferUtil.toDetailString() raw character display to USASCII
|
||||||
|
7-bit printable characters
|
||||||
|
+ 2152 Produce jetty-home-source artifacts for Eclipse Jetty source jars
|
||||||
|
+ 2160 Digest authentication should use absolute path
|
||||||
|
+ 2164 Ensure all jetty modules that use ServiceLoader have correct OSGi
|
||||||
|
manifest headers
|
||||||
|
+ 2190 HTTP/2 close and GOAWAY behavior
|
||||||
|
+ 2203 Use GlobalWebAppConfigBinding rather than special methods on
|
||||||
|
DeploymentManager/WebAppProvider
|
||||||
|
+ 2209 jetty-maven-plugin deploy-war silently fails (unless the pom has war
|
||||||
|
packaging)
|
||||||
|
+ 2210 NPE at org.eclipse.jetty.client.HttpDestination.newExchangeQueue
|
||||||
|
+ 2218 Adding workaround for Windows NIO Selector Bug
|
||||||
|
+ 2232 Dependency Conflict: Conflicting JARs org.apache.maven:maven-project
|
||||||
|
+ 2255 Notify SSL handshake failures on write failures
|
||||||
|
+ 2275 jetty.server.ResourceService.doGet() + RequestDispatcher INCLUDE
|
||||||
|
+ 2278 Could not find artifact
|
||||||
|
org.eclipse.jetty.tests:test-webapps-parent:pom:9.4.8.v20171121
|
||||||
|
+ 2279 Jetty 9.4.x start.jar: "?=" in [ini] defeats Issue #1139 functionality
|
||||||
|
+ 2280 Default application/json to utf-8 encoding in encoding.properties
|
||||||
|
+ 2284 NPE from start.jar during JVM version parsing
|
||||||
|
+ 2288 Cleanup the statistics classes
|
||||||
|
+ 2291 Expose HTTP/2 close reason in dumps
|
||||||
|
+ 2293 HTTP/2 client multiplexed connection pool creates too many connections
|
||||||
|
+ 2297 HTTP/2 client transport should honor HttpClient.connectBlocking
|
||||||
|
+ 2298 Override the processor number with an environment variable
|
||||||
|
+ 2307 Error page can have null charset in content type
|
||||||
|
+ 2308 Type change in MonitorTask - int cannot be converted to
|
||||||
|
ThreadPoolExecutor
|
||||||
|
+ 2312 HTTP/2 Connection.Listener notified after first request
|
||||||
|
+ 2313 Dump HTTP/2 channel state
|
||||||
|
+ 2318 HttpParser.Listener.onBadMessage() should take BadMessageException
|
||||||
|
+ 2346 Missing stack traces in HTTPChannel.onException
|
||||||
|
+ 2358 Add ALPN module file for JDK 10
|
||||||
|
|
||||||
jetty-9.4.8.v20171121 - 21 November 2017
|
jetty-9.4.8.v20171121 - 21 November 2017
|
||||||
+ 212 HttpClient should support pluggable AuthenticationStore
|
+ 212 HttpClient should support pluggable AuthenticationStore
|
||||||
+ 215 Add Conscrypt for native ALPN/TLS/SSL
|
+ 215 Add Conscrypt for native ALPN/TLS/SSL
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables use of the apache implementation of JSP
|
Enables use of the apache implementation of JSP
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables the apache version of JSTL
|
Enables the apache version of JSTL
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Selects an ALPN (Application Layer Protocol Negotiation) implementation by java version.
|
Selects an ALPN (Application Layer Protocol Negotiation) implementation by java version.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar|lib/alpn/alpn-boot-8.1.9.v20160720.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar|lib/alpn/alpn-boot-8.1.9.v20160720.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar|lib/alpn/alpn-boot-8.1.9.v20160720.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar|lib/alpn/alpn-boot-8.1.9.v20160720.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar|lib/alpn/alpn-boot-8.1.9.v20160720.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar|lib/alpn/alpn-boot-8.1.9.v20160720.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.10.v20161026/alpn-boot-8.1.10.v20161026.jar|lib/alpn/alpn-boot-8.1.10.v20161026.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.10.v20161026/alpn-boot-8.1.10.v20161026.jar|lib/alpn/alpn-boot-8.1.10.v20161026.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.12.v20180117/alpn-boot-8.1.12.v20180117.jar|lib/alpn/alpn-boot-8.1.12.v20180117.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.12.v20180117/alpn-boot-8.1.12.v20180117.jar|lib/alpn/alpn-boot-8.1.12.v20180117.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.12.v20180117/alpn-boot-8.1.12.v20180117.jar|lib/alpn/alpn-boot-8.1.12.v20180117.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.12.v20180117/alpn-boot-8.1.12.v20180117.jar|lib/alpn/alpn-boot-8.1.12.v20180117.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.2.v20141202|lib/alpn/alpn-boot-8.1.2.v20141202.jar
|
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.2.v20141202|lib/alpn/alpn-boot-8.1.2.v20141202.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.3.v20150130|lib/alpn/alpn-boot-8.1.3.v20150130.jar
|
maven://org.mortbay.jetty.alpn/alpn-boot/8.1.3.v20150130|lib/alpn/alpn-boot-8.1.3.v20150130.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar|lib/alpn/alpn-boot-8.1.3.v20150130.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar|lib/alpn/alpn-boot-8.1.3.v20150130.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar|lib/alpn/alpn-boot-8.1.3.v20150130.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar|lib/alpn/alpn-boot-8.1.3.v20150130.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.4.v20150727/alpn-boot-8.1.4.v20150727.jar|lib/alpn/alpn-boot-8.1.4.v20150727.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.4.v20150727/alpn-boot-8.1.4.v20150727.jar|lib/alpn/alpn-boot-8.1.4.v20150727.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.5.v20150921/alpn-boot-8.1.5.v20150921.jar|lib/alpn/alpn-boot-8.1.5.v20150921.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.5.v20150921/alpn-boot-8.1.5.v20150921.jar|lib/alpn/alpn-boot-8.1.5.v20150921.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.6.v20151105/alpn-boot-8.1.6.v20151105.jar|lib/alpn/alpn-boot-8.1.6.v20151105.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.6.v20151105/alpn-boot-8.1.6.v20151105.jar|lib/alpn/alpn-boot-8.1.6.v20151105.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.6.v20151105/alpn-boot-8.1.6.v20151105.jar|lib/alpn/alpn-boot-8.1.6.v20151105.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.6.v20151105/alpn-boot-8.1.6.v20151105.jar|lib/alpn/alpn-boot-8.1.6.v20151105.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.8.v20160420/alpn-boot-8.1.8.v20160420.jar|lib/alpn/alpn-boot-8.1.8.v20160420.jar
|
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.8.v20160420/alpn-boot-8.1.8.v20160420.jar|lib/alpn/alpn-boot-8.1.8.v20160420.jar
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
|
[depend]
|
||||||
|
alpn-impl/alpn-9
|
|
@ -0,0 +1,4 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
|
[depend]
|
||||||
|
alpn-impl/alpn-9
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Provides ALPN support for JDK 8, modifying the sun.security.ssl
|
Provides ALPN support for JDK 8, modifying the sun.security.ssl
|
||||||
classes and adding them to the JVM boot classpath.
|
classes and adding them to the JVM boot classpath.
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Provides support for ALPN based on JDK 9 APIs.
|
Provides support for ALPN based on JDK 9+ APIs.
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
lib/jetty-alpn-java-server-${jetty.version}.jar
|
lib/jetty-alpn-java-server-${jetty.version}.jar
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables the ALPN (Application Layer Protocol Negotiation) TLS extension.
|
Enables the ALPN (Application Layer Protocol Negotiation) TLS extension.
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
[name]
|
|
||||||
protonego-boot
|
|
||||||
|
|
||||||
[files]
|
|
||||||
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar|lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
|
||||||
|
|
||||||
[exec]
|
|
||||||
-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.11.v20170118.jar
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables Annotation scanning for deployed webapplications.
|
Enables Annotation scanning for deployed webapplications.
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ import org.eclipse.jetty.plus.annotation.ContainerInitializer;
|
||||||
import org.eclipse.jetty.plus.webapp.PlusConfiguration;
|
import org.eclipse.jetty.plus.webapp.PlusConfiguration;
|
||||||
import org.eclipse.jetty.util.JavaVersion;
|
import org.eclipse.jetty.util.JavaVersion;
|
||||||
import org.eclipse.jetty.util.MultiException;
|
import org.eclipse.jetty.util.MultiException;
|
||||||
|
import org.eclipse.jetty.util.ProcessorUtils;
|
||||||
import org.eclipse.jetty.util.StringUtil;
|
import org.eclipse.jetty.util.StringUtil;
|
||||||
import org.eclipse.jetty.util.TypeUtil;
|
import org.eclipse.jetty.util.TypeUtil;
|
||||||
import org.eclipse.jetty.util.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
@ -467,7 +468,7 @@ public class AnnotationConfiguration extends AbstractConfiguration
|
||||||
start = System.nanoTime();
|
start = System.nanoTime();
|
||||||
|
|
||||||
//execute scan, either effectively synchronously (1 thread only), or asynchronously (limited by number of processors available)
|
//execute scan, either effectively synchronously (1 thread only), or asynchronously (limited by number of processors available)
|
||||||
final Semaphore task_limit = (isUseMultiThreading(context)? new Semaphore(Runtime.getRuntime().availableProcessors()):new Semaphore(1));
|
final Semaphore task_limit = (isUseMultiThreading(context)? new Semaphore(ProcessorUtils.availableProcessors()):new Semaphore( 1));
|
||||||
final CountDownLatch latch = new CountDownLatch(_parserTasks.size());
|
final CountDownLatch latch = new CountDownLatch(_parserTasks.size());
|
||||||
final MultiException me = new MultiException();
|
final MultiException me = new MultiException();
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Jetty setup to support Weld/CDI2 with WELD inside the webapp
|
Jetty setup to support Weld/CDI2 with WELD inside the webapp
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Adds the Jetty HTTP client to the server classpath.
|
Adds the Jetty HTTP client to the server classpath.
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,10 @@ package org.eclipse.jetty.client;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
import org.eclipse.jetty.client.api.Connection;
|
import org.eclipse.jetty.client.api.Connection;
|
||||||
import org.eclipse.jetty.client.api.Destination;
|
import org.eclipse.jetty.client.api.Destination;
|
||||||
|
import org.eclipse.jetty.util.AtomicBiInteger;
|
||||||
import org.eclipse.jetty.util.Callback;
|
import org.eclipse.jetty.util.Callback;
|
||||||
import org.eclipse.jetty.util.Promise;
|
import org.eclipse.jetty.util.Promise;
|
||||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||||
|
@ -39,7 +39,12 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
private static final Logger LOG = Log.getLogger(AbstractConnectionPool.class);
|
private static final Logger LOG = Log.getLogger(AbstractConnectionPool.class);
|
||||||
|
|
||||||
private final AtomicBoolean closed = new AtomicBoolean();
|
private final AtomicBoolean closed = new AtomicBoolean();
|
||||||
private final AtomicInteger connectionCount = new AtomicInteger();
|
|
||||||
|
/**
|
||||||
|
* The connectionCount encodes both the total connections plus the pending connection counts, so both can be atomically changed.
|
||||||
|
* The bottom 32 bits represent the total connections and the top 32 bits represent the pending connections.
|
||||||
|
*/
|
||||||
|
private final AtomicBiInteger connections = new AtomicBiInteger();
|
||||||
private final Destination destination;
|
private final Destination destination;
|
||||||
private final int maxConnections;
|
private final int maxConnections;
|
||||||
private final Callback requester;
|
private final Callback requester;
|
||||||
|
@ -60,13 +65,19 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
@ManagedAttribute(value = "The number of connections", readonly = true)
|
@ManagedAttribute(value = "The number of connections", readonly = true)
|
||||||
public int getConnectionCount()
|
public int getConnectionCount()
|
||||||
{
|
{
|
||||||
return connectionCount.get();
|
return connections.getLo();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManagedAttribute(value = "The number of pending connections", readonly = true)
|
||||||
|
public int getPendingCount()
|
||||||
|
{
|
||||||
|
return connections.getHi();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty()
|
public boolean isEmpty()
|
||||||
{
|
{
|
||||||
return connectionCount.get() == 0;
|
return connections.getLo() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -80,29 +91,34 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
{
|
{
|
||||||
Connection connection = activate();
|
Connection connection = activate();
|
||||||
if (connection == null)
|
if (connection == null)
|
||||||
connection = tryCreate();
|
{
|
||||||
|
tryCreate(-1);
|
||||||
|
connection = activate();
|
||||||
|
}
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Connection tryCreate()
|
protected void tryCreate(int maxPending)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
int current = getConnectionCount();
|
long encoded = connections.get();
|
||||||
final int next = current + 1;
|
int pending = AtomicBiInteger.getHi(encoded);
|
||||||
|
int total = AtomicBiInteger.getLo(encoded);
|
||||||
|
|
||||||
if (next > maxConnections)
|
if (LOG.isDebugEnabled())
|
||||||
|
LOG.debug("tryCreate {}/{} connections {}/{} pending",total,maxConnections,pending,maxPending);
|
||||||
|
|
||||||
|
if (total >= maxConnections)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (maxPending>=0 && pending>=maxPending)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (connections.compareAndSet(encoded,pending+1,total+1))
|
||||||
{
|
{
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Max connections {}/{} reached", current, maxConnections);
|
LOG.debug("newConnection {}/{} connections {}/{} pending", total+1, maxConnections, pending+1, maxPending);
|
||||||
// Try again the idle connections
|
|
||||||
return activate();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connectionCount.compareAndSet(current, next))
|
|
||||||
{
|
|
||||||
if (LOG.isDebugEnabled())
|
|
||||||
LOG.debug("Connection {}/{} creation", next, maxConnections);
|
|
||||||
|
|
||||||
destination.newConnection(new Promise<Connection>()
|
destination.newConnection(new Promise<Connection>()
|
||||||
{
|
{
|
||||||
|
@ -110,7 +126,8 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
public void succeeded(Connection connection)
|
public void succeeded(Connection connection)
|
||||||
{
|
{
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Connection {}/{} creation succeeded {}", next, maxConnections, connection);
|
LOG.debug("Connection {}/{} creation succeeded {}", total+1, maxConnections, connection);
|
||||||
|
connections.update(-1,0);
|
||||||
onCreated(connection);
|
onCreated(connection);
|
||||||
proceed();
|
proceed();
|
||||||
}
|
}
|
||||||
|
@ -119,14 +136,13 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
public void failed(Throwable x)
|
public void failed(Throwable x)
|
||||||
{
|
{
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Connection " + next + "/" + maxConnections + " creation failed", x);
|
LOG.debug("Connection " + (total+1) + "/" + maxConnections + " creation failed", x);
|
||||||
connectionCount.decrementAndGet();
|
connections.update(-1,-1);
|
||||||
requester.failed(x);
|
requester.failed(x);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Try again the idle connections
|
return;
|
||||||
return activate();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,7 +190,7 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
|
|
||||||
protected void removed(Connection connection)
|
protected void removed(Connection connection)
|
||||||
{
|
{
|
||||||
int pooled = connectionCount.decrementAndGet();
|
int pooled = connections.updateLo(-1);
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Connection removed {} - pooled: {}", connection, pooled);
|
LOG.debug("Connection removed {} - pooled: {}", connection, pooled);
|
||||||
}
|
}
|
||||||
|
@ -184,7 +200,7 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
|
||||||
{
|
{
|
||||||
if (closed.compareAndSet(false, true))
|
if (closed.compareAndSet(false, true))
|
||||||
{
|
{
|
||||||
connectionCount.set(0);
|
connections.set(0,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,21 +88,22 @@ public abstract class AbstractConnectorHttpClientTransport extends AbstractHttpC
|
||||||
context.put(SslClientConnectionFactory.SSL_PEER_HOST_CONTEXT_KEY, destination.getHost());
|
context.put(SslClientConnectionFactory.SSL_PEER_HOST_CONTEXT_KEY, destination.getHost());
|
||||||
context.put(SslClientConnectionFactory.SSL_PEER_PORT_CONTEXT_KEY, destination.getPort());
|
context.put(SslClientConnectionFactory.SSL_PEER_PORT_CONTEXT_KEY, destination.getPort());
|
||||||
|
|
||||||
|
boolean connected = true;
|
||||||
if (client.isConnectBlocking())
|
if (client.isConnectBlocking())
|
||||||
{
|
{
|
||||||
channel.socket().connect(address, (int)client.getConnectTimeout());
|
channel.socket().connect(address, (int)client.getConnectTimeout());
|
||||||
channel.configureBlocking(false);
|
channel.configureBlocking(false);
|
||||||
selectorManager.accept(channel, context);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
channel.configureBlocking(false);
|
channel.configureBlocking(false);
|
||||||
if (channel.connect(address))
|
connected = channel.connect(address);
|
||||||
|
}
|
||||||
|
if (connected)
|
||||||
selectorManager.accept(channel, context);
|
selectorManager.accept(channel, context);
|
||||||
else
|
else
|
||||||
selectorManager.connect(channel, context);
|
selectorManager.connect(channel, context);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// Must catch all exceptions, since some like
|
// Must catch all exceptions, since some like
|
||||||
// UnresolvedAddressException are not IOExceptions.
|
// UnresolvedAddressException are not IOExceptions.
|
||||||
catch (Throwable x)
|
catch (Throwable x)
|
||||||
|
|
|
@ -91,4 +91,20 @@ public interface ConnectionPool extends Closeable
|
||||||
*/
|
*/
|
||||||
ConnectionPool newConnectionPool(HttpDestination destination);
|
ConnectionPool newConnectionPool(HttpDestination destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks a connection pool as supporting multiplexed connections.
|
||||||
|
*/
|
||||||
|
interface Multiplexable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return the max number of requests multiplexable on a single connection
|
||||||
|
*/
|
||||||
|
int getMaxMultiplex();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param maxMultiplex the max number of requests multiplexable on a single connection
|
||||||
|
*/
|
||||||
|
void setMaxMultiplex(int maxMultiplex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,10 +70,14 @@ public abstract class HttpChannel
|
||||||
}
|
}
|
||||||
|
|
||||||
if (abort)
|
if (abort)
|
||||||
|
{
|
||||||
exchange.getRequest().abort(new UnsupportedOperationException("Pipelined requests not supported"));
|
exchange.getRequest().abort(new UnsupportedOperationException("Pipelined requests not supported"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("{} associated {} to {}", exchange, result, this);
|
LOG.debug("{} associated {} to {}", exchange, result, this);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,7 @@ import org.eclipse.jetty.io.MappedByteBufferPool;
|
||||||
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
|
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
|
||||||
import org.eclipse.jetty.util.Fields;
|
import org.eclipse.jetty.util.Fields;
|
||||||
import org.eclipse.jetty.util.Jetty;
|
import org.eclipse.jetty.util.Jetty;
|
||||||
|
import org.eclipse.jetty.util.ProcessorUtils;
|
||||||
import org.eclipse.jetty.util.Promise;
|
import org.eclipse.jetty.util.Promise;
|
||||||
import org.eclipse.jetty.util.SocketAddressResolver;
|
import org.eclipse.jetty.util.SocketAddressResolver;
|
||||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||||
|
@ -213,7 +214,7 @@ public class HttpClient extends ContainerLifeCycle
|
||||||
byteBufferPool = new MappedByteBufferPool(2048,
|
byteBufferPool = new MappedByteBufferPool(2048,
|
||||||
executor instanceof ThreadPool.SizedThreadPool
|
executor instanceof ThreadPool.SizedThreadPool
|
||||||
? ((ThreadPool.SizedThreadPool)executor).getMaxThreads()/2
|
? ((ThreadPool.SizedThreadPool)executor).getMaxThreads()/2
|
||||||
: Runtime.getRuntime().availableProcessors()*2);
|
: ProcessorUtils.availableProcessors()*2);
|
||||||
addBean(byteBufferPool);
|
addBean(byteBufferPool);
|
||||||
|
|
||||||
if (scheduler == null)
|
if (scheduler == null)
|
||||||
|
|
|
@ -81,6 +81,17 @@ public class HttpContent implements Callback, Closeable
|
||||||
this.iterator = provider == null ? Collections.<ByteBuffer>emptyIterator() : provider.iterator();
|
this.iterator = provider == null ? Collections.<ByteBuffer>emptyIterator() : provider.iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param buffer
|
||||||
|
* @return true if the buffer is the sentinel instance {@link CLOSE}
|
||||||
|
*/
|
||||||
|
private static boolean isTheCloseBuffer(ByteBuffer buffer)
|
||||||
|
{
|
||||||
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean isTheCloseBuffer = (buffer == CLOSE);
|
||||||
|
return isTheCloseBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return whether there is any content at all
|
* @return whether there is any content at all
|
||||||
*/
|
*/
|
||||||
|
@ -177,6 +188,7 @@ public class HttpContent implements Callback, Closeable
|
||||||
/**
|
/**
|
||||||
* @return whether the cursor has been advanced past the {@link #isLast() last} position.
|
* @return whether the cursor has been advanced past the {@link #isLast() last} position.
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("ReferenceEquality")
|
||||||
public boolean isConsumed()
|
public boolean isConsumed()
|
||||||
{
|
{
|
||||||
return buffer == AFTER;
|
return buffer == AFTER;
|
||||||
|
@ -187,7 +199,7 @@ public class HttpContent implements Callback, Closeable
|
||||||
{
|
{
|
||||||
if (isConsumed())
|
if (isConsumed())
|
||||||
return;
|
return;
|
||||||
if (buffer == CLOSE)
|
if (isTheCloseBuffer(buffer))
|
||||||
return;
|
return;
|
||||||
if (iterator instanceof Callback)
|
if (iterator instanceof Callback)
|
||||||
((Callback)iterator).succeeded();
|
((Callback)iterator).succeeded();
|
||||||
|
@ -198,7 +210,7 @@ public class HttpContent implements Callback, Closeable
|
||||||
{
|
{
|
||||||
if (isConsumed())
|
if (isConsumed())
|
||||||
return;
|
return;
|
||||||
if (buffer == CLOSE)
|
if (isTheCloseBuffer(buffer))
|
||||||
return;
|
return;
|
||||||
if (iterator instanceof Callback)
|
if (iterator instanceof Callback)
|
||||||
((Callback)iterator).failed(x);
|
((Callback)iterator).failed(x);
|
||||||
|
|
|
@ -204,7 +204,10 @@ public class HttpRequest implements Request
|
||||||
{
|
{
|
||||||
if (uri == null)
|
if (uri == null)
|
||||||
uri = buildURI(true);
|
uri = buildURI(true);
|
||||||
return uri == NULL_URI ? null : uri;
|
|
||||||
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean isNullURI = (uri == NULL_URI);
|
||||||
|
return isNullURI ? null : uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -36,11 +36,12 @@ import org.eclipse.jetty.util.log.Log;
|
||||||
import org.eclipse.jetty.util.log.Logger;
|
import org.eclipse.jetty.util.log.Logger;
|
||||||
import org.eclipse.jetty.util.thread.Sweeper;
|
import org.eclipse.jetty.util.thread.Sweeper;
|
||||||
|
|
||||||
public class MultiplexConnectionPool extends AbstractConnectionPool implements Sweeper.Sweepable
|
public class MultiplexConnectionPool extends AbstractConnectionPool implements ConnectionPool.Multiplexable, Sweeper.Sweepable
|
||||||
{
|
{
|
||||||
private static final Logger LOG = Log.getLogger(MultiplexConnectionPool.class);
|
private static final Logger LOG = Log.getLogger(MultiplexConnectionPool.class);
|
||||||
|
|
||||||
private final ReentrantLock lock = new ReentrantLock();
|
private final ReentrantLock lock = new ReentrantLock();
|
||||||
|
private final HttpDestination destination;
|
||||||
private final Deque<Holder> idleConnections;
|
private final Deque<Holder> idleConnections;
|
||||||
private final Map<Connection, Holder> muxedConnections;
|
private final Map<Connection, Holder> muxedConnections;
|
||||||
private final Map<Connection, Holder> busyConnections;
|
private final Map<Connection, Holder> busyConnections;
|
||||||
|
@ -49,12 +50,26 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements S
|
||||||
public MultiplexConnectionPool(HttpDestination destination, int maxConnections, Callback requester, int maxMultiplex)
|
public MultiplexConnectionPool(HttpDestination destination, int maxConnections, Callback requester, int maxMultiplex)
|
||||||
{
|
{
|
||||||
super(destination, maxConnections, requester);
|
super(destination, maxConnections, requester);
|
||||||
|
this.destination = destination;
|
||||||
this.idleConnections = new ArrayDeque<>(maxConnections);
|
this.idleConnections = new ArrayDeque<>(maxConnections);
|
||||||
this.muxedConnections = new HashMap<>(maxConnections);
|
this.muxedConnections = new HashMap<>(maxConnections);
|
||||||
this.busyConnections = new HashMap<>(maxConnections);
|
this.busyConnections = new HashMap<>(maxConnections);
|
||||||
this.maxMultiplex = maxMultiplex;
|
this.maxMultiplex = maxMultiplex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connection acquire()
|
||||||
|
{
|
||||||
|
Connection connection = activate();
|
||||||
|
if (connection == null)
|
||||||
|
{
|
||||||
|
int maxPending = 1 + destination.getQueuedRequestCount() / getMaxMultiplex();
|
||||||
|
tryCreate(maxPending);
|
||||||
|
connection = activate();
|
||||||
|
}
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
protected void lock()
|
protected void lock()
|
||||||
{
|
{
|
||||||
lock.lock();
|
lock.lock();
|
||||||
|
@ -65,6 +80,7 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements S
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getMaxMultiplex()
|
public int getMaxMultiplex()
|
||||||
{
|
{
|
||||||
lock();
|
lock();
|
||||||
|
@ -78,6 +94,7 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements S
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setMaxMultiplex(int maxMultiplex)
|
public void setMaxMultiplex(int maxMultiplex)
|
||||||
{
|
{
|
||||||
lock();
|
lock();
|
||||||
|
|
|
@ -28,15 +28,15 @@ public abstract class MultiplexHttpDestination extends HttpDestination
|
||||||
public int getMaxRequestsPerConnection()
|
public int getMaxRequestsPerConnection()
|
||||||
{
|
{
|
||||||
ConnectionPool connectionPool = getConnectionPool();
|
ConnectionPool connectionPool = getConnectionPool();
|
||||||
if (connectionPool instanceof MultiplexConnectionPool)
|
if (connectionPool instanceof ConnectionPool.Multiplexable)
|
||||||
return ((MultiplexConnectionPool)connectionPool).getMaxMultiplex();
|
return ((ConnectionPool.Multiplexable)connectionPool).getMaxMultiplex();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaxRequestsPerConnection(int maxRequestsPerConnection)
|
public void setMaxRequestsPerConnection(int maxRequestsPerConnection)
|
||||||
{
|
{
|
||||||
ConnectionPool connectionPool = getConnectionPool();
|
ConnectionPool connectionPool = getConnectionPool();
|
||||||
if (connectionPool instanceof MultiplexConnectionPool)
|
if (connectionPool instanceof ConnectionPool.Multiplexable)
|
||||||
((MultiplexConnectionPool)connectionPool).setMaxMultiplex(maxRequestsPerConnection);
|
((ConnectionPool.Multiplexable)connectionPool).setMaxMultiplex(maxRequestsPerConnection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,42 @@ import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||||
import org.eclipse.jetty.util.component.ContainerLifeCycle;
|
import org.eclipse.jetty.util.component.ContainerLifeCycle;
|
||||||
|
|
||||||
@ManagedObject
|
@ManagedObject
|
||||||
public class RoundRobinConnectionPool extends AbstractConnectionPool
|
public class RoundRobinConnectionPool extends AbstractConnectionPool implements ConnectionPool.Multiplexable
|
||||||
{
|
{
|
||||||
private final List<Entry> entries;
|
private final List<Entry> entries;
|
||||||
|
private int maxMultiplex;
|
||||||
private int index;
|
private int index;
|
||||||
|
|
||||||
public RoundRobinConnectionPool(Destination destination, int maxConnections, Callback requester)
|
public RoundRobinConnectionPool(Destination destination, int maxConnections, Callback requester)
|
||||||
|
{
|
||||||
|
this(destination, maxConnections, requester, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RoundRobinConnectionPool(Destination destination, int maxConnections, Callback requester, int maxMultiplex)
|
||||||
{
|
{
|
||||||
super(destination, maxConnections, requester);
|
super(destination, maxConnections, requester);
|
||||||
entries = new ArrayList<>(maxConnections);
|
entries = new ArrayList<>(maxConnections);
|
||||||
for (int i = 0; i < maxConnections; ++i)
|
for (int i = 0; i < maxConnections; ++i)
|
||||||
entries.add(new Entry());
|
entries.add(new Entry());
|
||||||
|
this.maxMultiplex = maxMultiplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxMultiplex()
|
||||||
|
{
|
||||||
|
synchronized (this)
|
||||||
|
{
|
||||||
|
return maxMultiplex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMaxMultiplex(int maxMultiplex)
|
||||||
|
{
|
||||||
|
synchronized (this)
|
||||||
|
{
|
||||||
|
this.maxMultiplex = maxMultiplex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -78,10 +103,10 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool
|
||||||
if (entry.connection == null)
|
if (entry.connection == null)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!entry.active)
|
if (entry.active < getMaxMultiplex())
|
||||||
{
|
{
|
||||||
entry.active = true;
|
++entry.active;
|
||||||
entry.used++;
|
++entry.used;
|
||||||
connection = entry.connection;
|
connection = entry.connection;
|
||||||
index += offset + 1;
|
index += offset + 1;
|
||||||
if (index >= capacity)
|
if (index >= capacity)
|
||||||
|
@ -103,7 +128,7 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool
|
||||||
for (Entry entry : entries)
|
for (Entry entry : entries)
|
||||||
{
|
{
|
||||||
if (entry.connection == connection)
|
if (entry.connection == connection)
|
||||||
return entry.active;
|
return entry.active > 0;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -112,56 +137,60 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool
|
||||||
@Override
|
@Override
|
||||||
public boolean release(Connection connection)
|
public boolean release(Connection connection)
|
||||||
{
|
{
|
||||||
boolean active = false;
|
boolean found = false;
|
||||||
|
boolean idle = false;
|
||||||
synchronized (this)
|
synchronized (this)
|
||||||
{
|
{
|
||||||
for (Entry entry : entries)
|
for (Entry entry : entries)
|
||||||
{
|
{
|
||||||
if (entry.connection == connection)
|
if (entry.connection == connection)
|
||||||
{
|
{
|
||||||
entry.active = false;
|
found = true;
|
||||||
active = true;
|
int active = --entry.active;
|
||||||
|
idle = active == 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (active)
|
if (!found)
|
||||||
|
return false;
|
||||||
released(connection);
|
released(connection);
|
||||||
|
if (idle)
|
||||||
return idle(connection, isClosed());
|
return idle(connection, isClosed());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove(Connection connection)
|
public boolean remove(Connection connection)
|
||||||
{
|
{
|
||||||
boolean active = false;
|
boolean found = false;
|
||||||
boolean removed = false;
|
|
||||||
synchronized (this)
|
synchronized (this)
|
||||||
{
|
{
|
||||||
for (Entry entry : entries)
|
for (Entry entry : entries)
|
||||||
{
|
{
|
||||||
if (entry.connection == connection)
|
if (entry.connection == connection)
|
||||||
{
|
{
|
||||||
active = entry.active;
|
found = true;
|
||||||
entry.reset();
|
entry.reset();
|
||||||
removed = true;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (active)
|
if (found)
|
||||||
|
{
|
||||||
released(connection);
|
released(connection);
|
||||||
if (removed)
|
|
||||||
removed(connection);
|
removed(connection);
|
||||||
return removed;
|
}
|
||||||
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dump(Appendable out, String indent) throws IOException
|
public void dump(Appendable out, String indent) throws IOException
|
||||||
{
|
{
|
||||||
List<Entry> connections = new ArrayList<>();
|
List<Entry> connections;
|
||||||
synchronized (this)
|
synchronized (this)
|
||||||
{
|
{
|
||||||
connections.addAll(entries);
|
connections = new ArrayList<>(entries);
|
||||||
}
|
}
|
||||||
ContainerLifeCycle.dumpObject(out, this);
|
ContainerLifeCycle.dumpObject(out, this);
|
||||||
ContainerLifeCycle.dump(out, indent, connections);
|
ContainerLifeCycle.dump(out, indent, connections);
|
||||||
|
@ -179,7 +208,7 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool
|
||||||
if (entry.connection != null)
|
if (entry.connection != null)
|
||||||
{
|
{
|
||||||
++present;
|
++present;
|
||||||
if (entry.active)
|
if (entry.active > 0)
|
||||||
++active;
|
++active;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,13 +225,13 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool
|
||||||
private static class Entry
|
private static class Entry
|
||||||
{
|
{
|
||||||
private Connection connection;
|
private Connection connection;
|
||||||
private boolean active;
|
private int active;
|
||||||
private long used;
|
private long used;
|
||||||
|
|
||||||
private void reset()
|
private void reset()
|
||||||
{
|
{
|
||||||
connection = null;
|
connection = null;
|
||||||
active = false;
|
active = 0;
|
||||||
used = 0;
|
used = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.eclipse.jetty.client.HttpDestination;
|
||||||
import org.eclipse.jetty.client.Origin;
|
import org.eclipse.jetty.client.Origin;
|
||||||
import org.eclipse.jetty.client.api.Connection;
|
import org.eclipse.jetty.client.api.Connection;
|
||||||
import org.eclipse.jetty.io.EndPoint;
|
import org.eclipse.jetty.io.EndPoint;
|
||||||
|
import org.eclipse.jetty.util.ProcessorUtils;
|
||||||
import org.eclipse.jetty.util.Promise;
|
import org.eclipse.jetty.util.Promise;
|
||||||
import org.eclipse.jetty.util.annotation.ManagedObject;
|
import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ public class HttpClientTransportOverHTTP extends AbstractConnectorHttpClientTran
|
||||||
{
|
{
|
||||||
public HttpClientTransportOverHTTP()
|
public HttpClientTransportOverHTTP()
|
||||||
{
|
{
|
||||||
this(Math.max(1, Runtime.getRuntime().availableProcessors() / 2));
|
this(Math.max( 1, ProcessorUtils.availableProcessors() / 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpClientTransportOverHTTP(int selectors)
|
public HttpClientTransportOverHTTP(int selectors)
|
||||||
|
|
|
@ -26,7 +26,7 @@ import org.eclipse.jetty.client.HttpExchange;
|
||||||
import org.eclipse.jetty.client.HttpReceiver;
|
import org.eclipse.jetty.client.HttpReceiver;
|
||||||
import org.eclipse.jetty.client.HttpResponse;
|
import org.eclipse.jetty.client.HttpResponse;
|
||||||
import org.eclipse.jetty.client.HttpResponseException;
|
import org.eclipse.jetty.client.HttpResponseException;
|
||||||
import org.eclipse.jetty.http.HttpCompliance;
|
import org.eclipse.jetty.http.BadMessageException;
|
||||||
import org.eclipse.jetty.http.HttpField;
|
import org.eclipse.jetty.http.HttpField;
|
||||||
import org.eclipse.jetty.http.HttpMethod;
|
import org.eclipse.jetty.http.HttpMethod;
|
||||||
import org.eclipse.jetty.http.HttpParser;
|
import org.eclipse.jetty.http.HttpParser;
|
||||||
|
@ -42,6 +42,7 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
|
||||||
private final HttpParser parser;
|
private final HttpParser parser;
|
||||||
private ByteBuffer buffer;
|
private ByteBuffer buffer;
|
||||||
private boolean shutdown;
|
private boolean shutdown;
|
||||||
|
private boolean complete;
|
||||||
|
|
||||||
public HttpReceiverOverHTTP(HttpChannelOverHTTP channel)
|
public HttpReceiverOverHTTP(HttpChannelOverHTTP channel)
|
||||||
{
|
{
|
||||||
|
@ -168,13 +169,22 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Must parse even if the buffer is fully consumed, to allow the
|
|
||||||
// parser to advance from asynchronous content to response complete.
|
|
||||||
boolean handle = parser.parseNext(buffer);
|
boolean handle = parser.parseNext(buffer);
|
||||||
|
boolean complete = this.complete;
|
||||||
|
this.complete = false;
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Parsed {}, remaining {} {}", handle, buffer.remaining(), parser);
|
LOG.debug("Parsed {}, remaining {} {}", handle, buffer.remaining(), parser);
|
||||||
if (handle || !buffer.hasRemaining())
|
if (handle)
|
||||||
return handle;
|
return true;
|
||||||
|
if (!buffer.hasRemaining())
|
||||||
|
return false;
|
||||||
|
if (complete)
|
||||||
|
{
|
||||||
|
if (LOG.isDebugEnabled())
|
||||||
|
LOG.debug("Discarding unexpected content after response: {}", BufferUtil.toDetailString(buffer));
|
||||||
|
BufferUtil.clear(buffer);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,11 +308,15 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
|
||||||
if (exchange == null)
|
if (exchange == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
int status = exchange.getResponse().getStatus();
|
||||||
|
|
||||||
|
if (status != HttpStatus.CONTINUE_100)
|
||||||
|
complete = true;
|
||||||
|
|
||||||
boolean proceed = responseSuccess(exchange);
|
boolean proceed = responseSuccess(exchange);
|
||||||
if (!proceed)
|
if (!proceed)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int status = exchange.getResponse().getStatus();
|
|
||||||
if (status == HttpStatus.SWITCHING_PROTOCOLS_101)
|
if (status == HttpStatus.SWITCHING_PROTOCOLS_101)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -325,13 +339,13 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void badMessage(int status, String reason)
|
public void badMessage(BadMessageException failure)
|
||||||
{
|
{
|
||||||
HttpExchange exchange = getHttpExchange();
|
HttpExchange exchange = getHttpExchange();
|
||||||
if (exchange != null)
|
if (exchange != null)
|
||||||
{
|
{
|
||||||
HttpResponse response = exchange.getResponse();
|
HttpResponse response = exchange.getResponse();
|
||||||
response.status(status).reason(reason);
|
response.status(failure.getCode()).reason(failure.getReason());
|
||||||
failAndClose(new HttpResponseException("HTTP protocol violation: bad response on " + getHttpConnection(), response));
|
failAndClose(new HttpResponseException("HTTP protocol violation: bad response on " + getHttpConnection(), response));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -321,10 +321,10 @@ public class HttpSenderOverHTTP extends HttpSender
|
||||||
private void release()
|
private void release()
|
||||||
{
|
{
|
||||||
ByteBufferPool bufferPool = httpClient.getByteBufferPool();
|
ByteBufferPool bufferPool = httpClient.getByteBufferPool();
|
||||||
if (headerBuffer != BufferUtil.EMPTY_BUFFER)
|
if (!BufferUtil.isTheEmptyBuffer(headerBuffer))
|
||||||
bufferPool.release(headerBuffer);
|
bufferPool.release(headerBuffer);
|
||||||
headerBuffer = null;
|
headerBuffer = null;
|
||||||
if (chunkBuffer != BufferUtil.EMPTY_BUFFER)
|
if (!BufferUtil.isTheEmptyBuffer(chunkBuffer))
|
||||||
bufferPool.release(chunkBuffer);
|
bufferPool.release(chunkBuffer);
|
||||||
chunkBuffer = null;
|
chunkBuffer = null;
|
||||||
contentBuffer = null;
|
contentBuffer = null;
|
||||||
|
|
|
@ -589,6 +589,7 @@ public class HttpClientAuthenticationTest extends AbstractHttpClientServerTest
|
||||||
public ByteBuffer current;
|
public ByteBuffer current;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("ReferenceEquality")
|
||||||
public boolean hasNext()
|
public boolean hasNext()
|
||||||
{
|
{
|
||||||
if (current == null)
|
if (current == null)
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.client;
|
package org.eclipse.jetty.client;
|
||||||
|
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
@ -1297,8 +1295,8 @@ public class HttpClientTest extends AbstractHttpClientServerTest
|
||||||
}
|
}
|
||||||
catch(ExecutionException e)
|
catch(ExecutionException e)
|
||||||
{
|
{
|
||||||
assertThat(e.getCause(), Matchers.instanceOf(BadMessageException.class));
|
Assert.assertThat(e.getCause(), Matchers.instanceOf(BadMessageException.class));
|
||||||
assertThat(e.getCause().getMessage(), Matchers.containsString("Unknown content"));
|
Assert.assertThat(e.getCause().getMessage(), Matchers.containsString("Unknown content"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1311,8 +1309,8 @@ public class HttpClientTest extends AbstractHttpClientServerTest
|
||||||
}
|
}
|
||||||
catch(ExecutionException e)
|
catch(ExecutionException e)
|
||||||
{
|
{
|
||||||
assertThat(e.getCause(), Matchers.instanceOf(BadMessageException.class));
|
Assert.assertThat(e.getCause(), Matchers.instanceOf(BadMessageException.class));
|
||||||
assertThat(e.getCause().getMessage(), Matchers.containsString("Unknown content"));
|
Assert.assertThat(e.getCause().getMessage(), Matchers.containsString("Unknown content"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1650,6 +1648,70 @@ public class HttpClientTest extends AbstractHttpClientServerTest
|
||||||
Assert.assertEquals(200, response.getStatus());
|
Assert.assertEquals(200, response.getStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test204WithContent() throws Exception
|
||||||
|
{
|
||||||
|
// This test only works with clear-text HTTP.
|
||||||
|
Assume.assumeTrue(sslContextFactory == null);
|
||||||
|
|
||||||
|
try (ServerSocket server = new ServerSocket(0))
|
||||||
|
{
|
||||||
|
startClient();
|
||||||
|
client.setMaxConnectionsPerDestination(1);
|
||||||
|
int idleTimeout = 2000;
|
||||||
|
client.setIdleTimeout(idleTimeout);
|
||||||
|
|
||||||
|
Request request = client.newRequest("localhost", server.getLocalPort())
|
||||||
|
.scheme(scheme)
|
||||||
|
.timeout(5, TimeUnit.SECONDS);
|
||||||
|
FutureResponseListener listener = new FutureResponseListener(request);
|
||||||
|
request.send(listener);
|
||||||
|
|
||||||
|
try (Socket socket = server.accept())
|
||||||
|
{
|
||||||
|
socket.setSoTimeout(idleTimeout / 2);
|
||||||
|
|
||||||
|
InputStream input = socket.getInputStream();
|
||||||
|
consume(input, false);
|
||||||
|
|
||||||
|
// Send a bad response.
|
||||||
|
String httpResponse = "" +
|
||||||
|
"HTTP/1.1 204 No Content\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"No Content";
|
||||||
|
OutputStream output = socket.getOutputStream();
|
||||||
|
output.write(httpResponse.getBytes(StandardCharsets.UTF_8));
|
||||||
|
output.flush();
|
||||||
|
|
||||||
|
ContentResponse response = listener.get(5, TimeUnit.SECONDS);
|
||||||
|
Assert.assertEquals(204, response.getStatus());
|
||||||
|
|
||||||
|
byte[] responseContent = response.getContent();
|
||||||
|
Assert.assertNotNull(responseContent);
|
||||||
|
Assert.assertEquals(0, responseContent.length);
|
||||||
|
|
||||||
|
// Send another request to verify we have handled the wrong response correctly.
|
||||||
|
request = client.newRequest("localhost", server.getLocalPort())
|
||||||
|
.scheme(scheme)
|
||||||
|
.timeout(5, TimeUnit.SECONDS);
|
||||||
|
listener = new FutureResponseListener(request);
|
||||||
|
request.send(listener);
|
||||||
|
|
||||||
|
consume(input, false);
|
||||||
|
|
||||||
|
httpResponse = "" +
|
||||||
|
"HTTP/1.1 200 OK\r\n" +
|
||||||
|
"Content-Length: 0\r\n" +
|
||||||
|
"\r\n";
|
||||||
|
output.write(httpResponse.getBytes(StandardCharsets.UTF_8));
|
||||||
|
output.flush();
|
||||||
|
|
||||||
|
response = listener.get(5, TimeUnit.SECONDS);
|
||||||
|
Assert.assertEquals(200, response.getStatus());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void assertCopyRequest(Request original)
|
private void assertCopyRequest(Request original)
|
||||||
{
|
{
|
||||||
Request copy = client.copyRequest((HttpRequest) original, original.getURI());
|
Request copy = client.copyRequest((HttpRequest) original, original.getURI());
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
package org.eclipse.jetty.client;
|
package org.eclipse.jetty.client;
|
||||||
|
|
||||||
import java.nio.channels.Selector;
|
import java.nio.channels.Selector;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
@ -30,14 +32,37 @@ import org.eclipse.jetty.server.Handler;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.server.ServerConnector;
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
import org.eclipse.jetty.util.SocketAddressResolver;
|
import org.eclipse.jetty.util.SocketAddressResolver;
|
||||||
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
import org.eclipse.jetty.util.log.Logger;
|
||||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
|
||||||
|
@RunWith(Parameterized.class)
|
||||||
public class LivelockTest
|
public class LivelockTest
|
||||||
{
|
{
|
||||||
|
@Parameterized.Parameters(name = "server={0}, client={1}")
|
||||||
|
public static List<Object[]> data()
|
||||||
|
{
|
||||||
|
List<Object[]> data = new ArrayList<>();
|
||||||
|
// Server-live-lock, Client-live-lock
|
||||||
|
data.add(new Object[] { true, true });
|
||||||
|
data.add(new Object[] { true, false });
|
||||||
|
data.add(new Object[] { false, true });
|
||||||
|
data.add(new Object[] { false, false });
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameter(0)
|
||||||
|
public boolean serverLiveLock;
|
||||||
|
|
||||||
|
@Parameterized.Parameter(1)
|
||||||
|
public boolean clientLiveLock;
|
||||||
|
|
||||||
private Server server;
|
private Server server;
|
||||||
private ServerConnector connector;
|
private ServerConnector connector;
|
||||||
private HttpClient client;
|
private HttpClient client;
|
||||||
|
@ -73,7 +98,7 @@ public class LivelockTest
|
||||||
// ManagedSelectors that submit themselves in an attempt to cause a live lock
|
// ManagedSelectors that submit themselves in an attempt to cause a live lock
|
||||||
// as there will always be an action available to run.
|
// as there will always be an action available to run.
|
||||||
|
|
||||||
int count = 25;
|
int count = 5;
|
||||||
HttpClientTransport transport = new HttpClientTransportOverHTTP(1);
|
HttpClientTransport transport = new HttpClientTransportOverHTTP(1);
|
||||||
client = new HttpClient(transport, null);
|
client = new HttpClient(transport, null);
|
||||||
client.setMaxConnectionsPerDestination(2 * count);
|
client.setMaxConnectionsPerDestination(2 * count);
|
||||||
|
@ -88,34 +113,21 @@ public class LivelockTest
|
||||||
|
|
||||||
AtomicBoolean busy = new AtomicBoolean(true);
|
AtomicBoolean busy = new AtomicBoolean(true);
|
||||||
|
|
||||||
|
if (clientLiveLock)
|
||||||
|
{
|
||||||
ManagedSelector clientSelector = client.getContainedBeans(ManagedSelector.class).stream().findAny().get();
|
ManagedSelector clientSelector = client.getContainedBeans(ManagedSelector.class).stream().findAny().get();
|
||||||
ManagedSelector.SelectorUpdate clientLivelock = new ManagedSelector.SelectorUpdate()
|
busyLiveLock(busy, clientSelector);
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void update(Selector selector)
|
|
||||||
{
|
|
||||||
sleep(10);
|
|
||||||
if (busy.get())
|
|
||||||
clientSelector.submit(this);
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
clientSelector.submit(clientLivelock);
|
|
||||||
|
|
||||||
|
if (serverLiveLock)
|
||||||
|
{
|
||||||
ManagedSelector serverSelector = connector.getContainedBeans(ManagedSelector.class).stream().findAny().get();
|
ManagedSelector serverSelector = connector.getContainedBeans(ManagedSelector.class).stream().findAny().get();
|
||||||
ManagedSelector.SelectorUpdate serverLivelock = new ManagedSelector.SelectorUpdate()
|
busyLiveLock(busy, serverSelector);
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void update(Selector selector)
|
|
||||||
{
|
|
||||||
sleep(10);
|
|
||||||
if (busy.get())
|
|
||||||
serverSelector.submit(this);
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
serverSelector.submit(serverLivelock);
|
|
||||||
|
|
||||||
int requestRate = 5;
|
int requestRate = 5;
|
||||||
long pause = 1000 / requestRate;
|
long pause = 1000 / requestRate;
|
||||||
|
Logger clientLog = Log.getLogger("TESTClient");
|
||||||
CountDownLatch latch = new CountDownLatch(count);
|
CountDownLatch latch = new CountDownLatch(count);
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
|
@ -125,6 +137,13 @@ public class LivelockTest
|
||||||
{
|
{
|
||||||
if (result.isSucceeded() && result.getResponse().getStatus() == HttpStatus.OK_200)
|
if (result.isSucceeded() && result.getResponse().getStatus() == HttpStatus.OK_200)
|
||||||
latch.countDown();
|
latch.countDown();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(result.getRequestFailure() != null)
|
||||||
|
clientLog.warn(result.getRequestFailure());
|
||||||
|
if(result.getResponseFailure() != null)
|
||||||
|
clientLog.warn(result.getResponseFailure());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
sleep(pause);
|
sleep(pause);
|
||||||
}
|
}
|
||||||
|
@ -134,11 +153,26 @@ public class LivelockTest
|
||||||
busy.set(false);
|
busy.set(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sleep(long time)
|
private void busyLiveLock(AtomicBoolean busy, ManagedSelector managedSelector)
|
||||||
|
{
|
||||||
|
ManagedSelector.SelectorUpdate liveLock = new ManagedSelector.SelectorUpdate()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void update(Selector selector)
|
||||||
|
{
|
||||||
|
sleep(10);
|
||||||
|
if (busy.get())
|
||||||
|
managedSelector.submit(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
managedSelector.submit(liveLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sleep(long millis)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Thread.sleep(time);
|
TimeUnit.MILLISECONDS.sleep(millis);
|
||||||
}
|
}
|
||||||
catch (InterruptedException x)
|
catch (InterruptedException x)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
//
|
|
||||||
// ========================================================================
|
|
||||||
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// All rights reserved. This program and the accompanying materials
|
|
||||||
// are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
// and Apache License v2.0 which accompanies this distribution.
|
|
||||||
//
|
|
||||||
// The Eclipse Public License is available at
|
|
||||||
// http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
//
|
|
||||||
// The Apache License v2.0 is available at
|
|
||||||
// http://www.opensource.org/licenses/apache2.0.php
|
|
||||||
//
|
|
||||||
// You may elect to redistribute this code under either of these licenses.
|
|
||||||
// ========================================================================
|
|
||||||
//
|
|
||||||
|
|
||||||
package org.eclipse.jetty.client;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.eclipse.jetty.client.api.ContentResponse;
|
|
||||||
import org.eclipse.jetty.http.HttpStatus;
|
|
||||||
import org.eclipse.jetty.server.Request;
|
|
||||||
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
|
||||||
import org.hamcrest.Matchers;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class RoundRobinConnectionPoolTest extends AbstractHttpClientServerTest
|
|
||||||
{
|
|
||||||
public RoundRobinConnectionPoolTest(SslContextFactory sslContextFactory)
|
|
||||||
{
|
|
||||||
super(sslContextFactory);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRoundRobin() throws Exception
|
|
||||||
{
|
|
||||||
AtomicBoolean record = new AtomicBoolean();
|
|
||||||
List<Integer> remotePorts = new ArrayList<>();
|
|
||||||
start(new EmptyServerHandler()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
protected void service(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
if (record.get())
|
|
||||||
remotePorts.add(request.getRemotePort());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
int maxConnections = 3;
|
|
||||||
client.getTransport().setConnectionPoolFactory(destination -> new RoundRobinConnectionPool(destination, maxConnections, destination));
|
|
||||||
|
|
||||||
// Prime the connections, so that they are all opened
|
|
||||||
// before we actually test the round robin behavior.
|
|
||||||
String host = "localhost";
|
|
||||||
int port = connector.getLocalPort();
|
|
||||||
for (int i = 0; i < maxConnections; ++i)
|
|
||||||
{
|
|
||||||
ContentResponse response = client.newRequest(host, port)
|
|
||||||
.scheme(scheme)
|
|
||||||
.timeout(5, TimeUnit.SECONDS)
|
|
||||||
.send();
|
|
||||||
Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
record.set(true);
|
|
||||||
int requests = 2 * maxConnections - 1;
|
|
||||||
for (int i = 0; i < requests; ++i)
|
|
||||||
{
|
|
||||||
ContentResponse response = client.newRequest(host, port)
|
|
||||||
.scheme(scheme)
|
|
||||||
.timeout(5, TimeUnit.SECONDS)
|
|
||||||
.send();
|
|
||||||
Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert.assertThat(remotePorts.size(), Matchers.equalTo(requests));
|
|
||||||
for (int i = 0; i < requests; ++i)
|
|
||||||
{
|
|
||||||
int base = i % maxConnections;
|
|
||||||
int expected = remotePorts.get(base);
|
|
||||||
int candidate = remotePorts.get(i);
|
|
||||||
Assert.assertThat(client.dump() + System.lineSeparator() + remotePorts.toString(), expected, Matchers.equalTo(candidate));
|
|
||||||
if (i > 0)
|
|
||||||
Assert.assertThat(remotePorts.get(i - 1), Matchers.not(Matchers.equalTo(candidate)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
|
class=org.eclipse.jetty.util.log.StdErrLog
|
||||||
#org.eclipse.jetty.LEVEL=DEBUG
|
#org.eclipse.jetty.LEVEL=INFO
|
||||||
#org.eclipse.jetty.client.LEVEL=DEBUG
|
#org.eclipse.jetty.client.LEVEL=DEBUG
|
||||||
#org.eclipse.jetty.io.ChannelEndPoint.LEVEL=DEBUG
|
#org.eclipse.jetty.io.ChannelEndPoint.LEVEL=DEBUG
|
||||||
#org.eclipse.jetty.http.LEVEL=DEBUG
|
#org.eclipse.jetty.http.LEVEL=DEBUG
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables webapplication deployment from the webapps directory.
|
Enables webapplication deployment from the webapps directory.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
|
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
|
||||||
|
|
||||||
<Configure id="Server" class="org.eclipse.jetty.server.Server">
|
<Configure id="Server" class="org.eclipse.jetty.server.Server">
|
||||||
<Ref refid="DeploymentManager">
|
<Ref refid="DeploymentManager">
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables Deployer to apply common configuration to all webapp deployments
|
Enables Deployer to apply common configuration to all webapp deployments
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
|
||||||
|
@ -311,10 +312,12 @@ public class DeploymentManager extends ContainerLifeCycle
|
||||||
*/
|
*/
|
||||||
public Collection<App> getApps(Node node)
|
public Collection<App> getApps(Node node)
|
||||||
{
|
{
|
||||||
|
Objects.requireNonNull(node);
|
||||||
|
|
||||||
List<App> ret = new ArrayList<>();
|
List<App> ret = new ArrayList<>();
|
||||||
for (AppEntry entry : _apps)
|
for (AppEntry entry : _apps)
|
||||||
{
|
{
|
||||||
if (entry.lifecyleNode == node)
|
if (node.equals(entry.lifecyleNode))
|
||||||
{
|
{
|
||||||
ret.add(entry.app);
|
ret.add(entry.app);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,9 @@ public final class Edge
|
||||||
|
|
||||||
public Edge(Node from, Node to)
|
public Edge(Node from, Node to)
|
||||||
{
|
{
|
||||||
if (from==null || to==null || from==to)
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean sameObject = (from==to);
|
||||||
|
if (from==null || to==null || sameObject)
|
||||||
throw new IllegalArgumentException("from "+from+" to "+to);
|
throw new IllegalArgumentException("from "+from+" to "+to);
|
||||||
_from = from;
|
_from = from;
|
||||||
_to = to;
|
_to = to;
|
||||||
|
|
|
@ -40,7 +40,7 @@ public class Graph
|
||||||
addNode(toNode=edge.getTo());
|
addNode(toNode=edge.getTo());
|
||||||
|
|
||||||
// replace edge with normalized edge
|
// replace edge with normalized edge
|
||||||
if (edge.getFrom()!=fromNode || edge.getTo()!=toNode)
|
if (!edge.getFrom().equals(fromNode) || !edge.getTo().equals(toNode))
|
||||||
edge=new Edge(fromNode,toNode);
|
edge=new Edge(fromNode,toNode);
|
||||||
|
|
||||||
this._edges.add(edge);
|
this._edges.add(edge);
|
||||||
|
@ -129,7 +129,7 @@ public class Graph
|
||||||
|
|
||||||
for (Edge edge : this._edges)
|
for (Edge edge : this._edges)
|
||||||
{
|
{
|
||||||
if ((edge.getFrom() == node) || (edge.getTo() == node))
|
if (edge.getFrom().equals(node) || edge.getTo().equals(node))
|
||||||
{
|
{
|
||||||
fromedges.add(edge);
|
fromedges.add(edge);
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ public class Graph
|
||||||
|
|
||||||
for (Edge edge : this._edges)
|
for (Edge edge : this._edges)
|
||||||
{
|
{
|
||||||
if (edge.getFrom() == from)
|
if (edge.getFrom().equals(from))
|
||||||
{
|
{
|
||||||
fromedges.add(edge);
|
fromedges.add(edge);
|
||||||
}
|
}
|
||||||
|
@ -192,7 +192,9 @@ public class Graph
|
||||||
*/
|
*/
|
||||||
public Path getPath(Node from, Node to)
|
public Path getPath(Node from, Node to)
|
||||||
{
|
{
|
||||||
if (from == to)
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean sameObject = (from==to);
|
||||||
|
if (sameObject)
|
||||||
{
|
{
|
||||||
return new Path();
|
return new Path();
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ public class DeploymentManagerMBean extends ObjectMBean
|
||||||
List<String> ret = new ArrayList<>();
|
List<String> ret = new ArrayList<>();
|
||||||
for (DeploymentManager.AppEntry entry : _manager.getAppEntries())
|
for (DeploymentManager.AppEntry entry : _manager.getAppEntries())
|
||||||
{
|
{
|
||||||
if (entry.getLifecyleNode() == node)
|
if (node.equals(entry.getLifecyleNode()))
|
||||||
{
|
{
|
||||||
ret.add(toRef(entry.getApp()));
|
ret.add(toRef(entry.getApp()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,10 +59,6 @@ System Properties:
|
||||||
Properties:
|
Properties:
|
||||||
-----------
|
-----------
|
||||||
java.version = 1.8.0_92
|
java.version = 1.8.0_92
|
||||||
java.version.major = 1
|
|
||||||
java.version.minor = 8
|
|
||||||
java.version.revision = 0
|
|
||||||
java.version.update = 92
|
|
||||||
|
|
||||||
Jetty Server Classpath:
|
Jetty Server Classpath:
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
|
@ -59,10 +59,6 @@ System Properties:
|
||||||
Properties:
|
Properties:
|
||||||
-----------
|
-----------
|
||||||
java.version = 1.8.0_92
|
java.version = 1.8.0_92
|
||||||
java.version.major = 1
|
|
||||||
java.version.minor = 8
|
|
||||||
java.version.revision = 0
|
|
||||||
java.version.update = 92
|
|
||||||
|
|
||||||
Jetty Server Classpath:
|
Jetty Server Classpath:
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
|
@ -148,6 +148,14 @@ This is done by editing the associated ini file for the module.
|
||||||
If your server setup is using a centralized ini configuration, you will edit the `${jetty.base}/server.ini` file.
|
If your server setup is using a centralized ini configuration, you will edit the `${jetty.base}/server.ini` file.
|
||||||
If you have elected to manage each module within it's own ini file, you can find these files in the `${jetty.base}/start.d` directory.
|
If you have elected to manage each module within it's own ini file, you can find these files in the `${jetty.base}/start.d` directory.
|
||||||
|
|
||||||
|
____
|
||||||
|
[IMPORTANT]
|
||||||
|
It is important that you *do not* modify the module files in the `$JETTY_HOME/modules` directory.
|
||||||
|
$JETTY_HOME should always remain a standard of truth.
|
||||||
|
If you want to make a change to an actual module file (not the values in its `ini-template`), either edit its associated `ini` file in the `$JETTY_BASE/start.d` directory or make a copy of the desired module file and copy it to the `$JETTY_BASE` directory and edit it there.
|
||||||
|
The start.jar reads local `$JETTY_BASE/modules` files (if they exist) before scanning `$JETTY_HOME`.
|
||||||
|
____
|
||||||
|
|
||||||
When a module is activated, a number of properties are set by default.
|
When a module is activated, a number of properties are set by default.
|
||||||
To view these defaults, open up the associated ini file.
|
To view these defaults, open up the associated ini file.
|
||||||
Listed in the ini file is the associated module file and any properties that can be set.
|
Listed in the ini file is the associated module file and any properties that can be set.
|
||||||
|
|
|
@ -719,10 +719,10 @@ This is _not_ a recommended usage.
|
||||||
____
|
____
|
||||||
|
|
||||||
[[conscrypt]]
|
[[conscrypt]]
|
||||||
===== Conscrypt SSL
|
==== Conscrypt SSL
|
||||||
|
|
||||||
Jetty also includes support for Google's https://github.com/google/conscrypt/[Conscrypt SSL], which is built on their fork of https://www.openssl.org/[OpenSSL], https://boringssl.googlesource.com/boringssl/[BoringSSL].
|
Jetty includes support for Google's https://github.com/google/conscrypt/[Conscrypt SSL], which is built on their fork of https://www.openssl.org/[OpenSSL], https://boringssl.googlesource.com/boringssl/[BoringSSL].
|
||||||
Implementing Conscrypt is very straightforward process - simply instantiate an instance of Conscrypt's `OpenSSLProvider` and set `Conscrypt` as a provider for Jetty's `SslContextFactory`:
|
Implementing Conscrypt for the link:{GITBROWSEURL}/jetty-alpn/jetty-alpn-conscrypt-server/src/test/java/org/eclipse/jetty/alpn/conscrypt/server/ConscryptHTTP2Server.java[server] or link:{GITBROWSEURL}/jetty-alpn/jetty-alpn-conscrypt-client/src/test/java/org/eclipse/jetty/alpn/java/client/ConscryptHTTP2Client.java[client] is very straightforward process - simply instantiate an instance of Conscrypt's `OpenSSLProvider` and set `Conscrypt` as a provider for Jetty's `SslContextFactory`:
|
||||||
|
|
||||||
[source, java, subs="{sub-order}"]
|
[source, java, subs="{sub-order}"]
|
||||||
----
|
----
|
||||||
|
|
|
@ -75,6 +75,17 @@ URI uri = URI.create("http://domain.com/secure");
|
||||||
auth.addAuthenticationResult(new BasicAuthentication.BasicResult(uri, "username", "password"));
|
auth.addAuthenticationResult(new BasicAuthentication.BasicResult(uri, "username", "password"));
|
||||||
----
|
----
|
||||||
|
|
||||||
In this way, the original request is enriched by `HttpClient` immediately with the `Authorization` header, and the server should respond with a 200 and the resource content rather than with the 401 and the challenge.
|
In this way, requests for the given URI are enriched by `HttpClient` immediately with the `Authorization` header, and the server should respond with a 200 and the resource content rather than with the 401 and the challenge.
|
||||||
|
|
||||||
|
It is also possible to preempt the authentication for a single request only, in this way:
|
||||||
|
|
||||||
|
[source, java, subs="{sub-order}"]
|
||||||
|
----
|
||||||
|
URI uri = URI.create("http://domain.com/secure");
|
||||||
|
Authentication.Result authn = new BasicAuthentication.BasicResult(uri, "username", "password")
|
||||||
|
Request request = httpClient.newRequest(uri);
|
||||||
|
authn.apply(request);
|
||||||
|
request.send();
|
||||||
|
----
|
||||||
|
|
||||||
See also the link:#http-client-proxy-authentication[proxy authentication section] for further information about how authentication works with HTTP proxies.
|
See also the link:#http-client-proxy-authentication[proxy authentication section] for further information about how authentication works with HTTP proxies.
|
||||||
|
|
|
@ -35,7 +35,7 @@ _____
|
||||||
|Version |Year |Home |JVM |Protocols |Servlet |JSP |Status
|
|Version |Year |Home |JVM |Protocols |Servlet |JSP |Status
|
||||||
|9.4 |2016- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|
|9.4 |2016- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|
||||||
|9.3 |2015- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|
|9.3 |2015- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|
||||||
|9.2 |2014- |Eclipse |1.7 |HTTP/1.1 RFC2616, javax.websocket, SPDY v3 |3.1 |2.3 |Deprecated / *End of Life January 2018*
|
|9.2 |2014-2018 |Eclipse |1.7 |HTTP/1.1 RFC2616, javax.websocket, SPDY v3 |3.1 |2.3 |Deprecated / *End of Life January 2018*
|
||||||
|8 |2009-2014 |Eclipse/Codehaus |1.6 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |3.0 |2.2 |Deprecated / *End of Life November 2014*
|
|8 |2009-2014 |Eclipse/Codehaus |1.6 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |3.0 |2.2 |Deprecated / *End of Life November 2014*
|
||||||
|7 |2008-2014 |Eclipse/Codehaus |1.5 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |2.5 |2.1 |Deprecated / *End of Life November 2014*
|
|7 |2008-2014 |Eclipse/Codehaus |1.5 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |2.5 |2.1 |Deprecated / *End of Life November 2014*
|
||||||
|6 |2006-2010 |Codehaus |1.4-1.5 |HTTP/1.1 RFC2616 |2.5 |2.0 |Deprecated / *End of Life November 2010*
|
|6 |2006-2010 |Codehaus |1.4-1.5 |HTTP/1.1 RFC2616 |2.5 |2.0 |Deprecated / *End of Life November 2010*
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.eclipse.jetty.client.api.Request;
|
||||||
import org.eclipse.jetty.fcgi.FCGI;
|
import org.eclipse.jetty.fcgi.FCGI;
|
||||||
import org.eclipse.jetty.http.HttpFields;
|
import org.eclipse.jetty.http.HttpFields;
|
||||||
import org.eclipse.jetty.io.EndPoint;
|
import org.eclipse.jetty.io.EndPoint;
|
||||||
|
import org.eclipse.jetty.util.ProcessorUtils;
|
||||||
import org.eclipse.jetty.util.Promise;
|
import org.eclipse.jetty.util.Promise;
|
||||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||||
import org.eclipse.jetty.util.annotation.ManagedObject;
|
import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||||
|
@ -44,7 +45,7 @@ public class HttpClientTransportOverFCGI extends AbstractConnectorHttpClientTran
|
||||||
|
|
||||||
public HttpClientTransportOverFCGI(String scriptRoot)
|
public HttpClientTransportOverFCGI(String scriptRoot)
|
||||||
{
|
{
|
||||||
this(Math.max(1, Runtime.getRuntime().availableProcessors() / 2), false, scriptRoot);
|
this( Math.max( 1, ProcessorUtils.availableProcessors() / 2), false, scriptRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpClientTransportOverFCGI(int selectors, boolean multiplexed, String scriptRoot)
|
public HttpClientTransportOverFCGI(int selectors, boolean multiplexed, String scriptRoot)
|
||||||
|
|
|
@ -127,7 +127,9 @@ public class HttpConnectionOverFCGI extends AbstractConnection implements Connec
|
||||||
|
|
||||||
private void releaseBuffer(ByteBuffer buffer)
|
private void releaseBuffer(ByteBuffer buffer)
|
||||||
{
|
{
|
||||||
assert this.buffer == buffer;
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean isCurrentBuffer = (this.buffer == buffer);
|
||||||
|
assert(isCurrentBuffer);
|
||||||
HttpClient client = destination.getHttpClient();
|
HttpClient client = destination.getHttpClient();
|
||||||
ByteBufferPool bufferPool = client.getByteBufferPool();
|
ByteBufferPool bufferPool = client.getByteBufferPool();
|
||||||
bufferPool.release(buffer);
|
bufferPool.release(buffer);
|
||||||
|
|
|
@ -306,9 +306,9 @@ public class ResponseContentParser extends StreamContentParser
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void badMessage(int status, String reason)
|
public void badMessage(BadMessageException failure)
|
||||||
{
|
{
|
||||||
fail(new BadMessageException(status, reason));
|
fail(failure);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void fail(Throwable failure)
|
protected void fail(Throwable failure)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Adds the FastCGI implementation to the classpath.
|
Adds the FastCGI implementation to the classpath.
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,9 @@ import java.util.concurrent.ConcurrentMap;
|
||||||
import org.eclipse.jetty.fcgi.FCGI;
|
import org.eclipse.jetty.fcgi.FCGI;
|
||||||
import org.eclipse.jetty.fcgi.generator.Flusher;
|
import org.eclipse.jetty.fcgi.generator.Flusher;
|
||||||
import org.eclipse.jetty.fcgi.parser.ServerParser;
|
import org.eclipse.jetty.fcgi.parser.ServerParser;
|
||||||
|
import org.eclipse.jetty.http.BadMessageException;
|
||||||
import org.eclipse.jetty.http.HttpField;
|
import org.eclipse.jetty.http.HttpField;
|
||||||
|
import org.eclipse.jetty.http.HttpStatus;
|
||||||
import org.eclipse.jetty.io.AbstractConnection;
|
import org.eclipse.jetty.io.AbstractConnection;
|
||||||
import org.eclipse.jetty.io.ByteBufferPool;
|
import org.eclipse.jetty.io.ByteBufferPool;
|
||||||
import org.eclipse.jetty.io.EndPoint;
|
import org.eclipse.jetty.io.EndPoint;
|
||||||
|
@ -187,9 +189,7 @@ public class ServerFCGIConnection extends AbstractConnection
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Request {} failure on {}: {}", request, channel, failure);
|
LOG.debug("Request {} failure on {}: {}", request, channel, failure);
|
||||||
if (channel != null)
|
if (channel != null)
|
||||||
{
|
channel.onBadMessage(new BadMessageException(HttpStatus.BAD_REQUEST_400, null, failure));
|
||||||
channel.onBadMessage(400, failure.toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ import org.eclipse.jetty.http.HttpFields;
|
||||||
import org.eclipse.jetty.http.HttpHeader;
|
import org.eclipse.jetty.http.HttpHeader;
|
||||||
import org.eclipse.jetty.http.HttpScheme;
|
import org.eclipse.jetty.http.HttpScheme;
|
||||||
import org.eclipse.jetty.proxy.AsyncProxyServlet;
|
import org.eclipse.jetty.proxy.AsyncProxyServlet;
|
||||||
|
import org.eclipse.jetty.util.ProcessorUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specific implementation of {@link org.eclipse.jetty.proxy.AsyncProxyServlet.Transparent} for FastCGI.
|
* Specific implementation of {@link org.eclipse.jetty.proxy.AsyncProxyServlet.Transparent} for FastCGI.
|
||||||
|
@ -111,7 +112,7 @@ public class FastCGIProxyServlet extends AsyncProxyServlet.Transparent
|
||||||
String scriptRoot = config.getInitParameter(SCRIPT_ROOT_INIT_PARAM);
|
String scriptRoot = config.getInitParameter(SCRIPT_ROOT_INIT_PARAM);
|
||||||
if (scriptRoot == null)
|
if (scriptRoot == null)
|
||||||
throw new IllegalArgumentException("Mandatory parameter '" + SCRIPT_ROOT_INIT_PARAM + "' not configured");
|
throw new IllegalArgumentException("Mandatory parameter '" + SCRIPT_ROOT_INIT_PARAM + "' not configured");
|
||||||
int selectors = Math.max(1, Runtime.getRuntime().availableProcessors() / 2);
|
int selectors = Math.max( 1, ProcessorUtils.availableProcessors() / 2);
|
||||||
String value = config.getInitParameter("selectors");
|
String value = config.getInitParameter("selectors");
|
||||||
if (value != null)
|
if (value != null)
|
||||||
selectors = Integer.parseInt(value);
|
selectors = Integer.parseInt(value);
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.server.ServerConnector;
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
import org.eclipse.jetty.toolchain.test.TestTracker;
|
import org.eclipse.jetty.toolchain.test.TestTracker;
|
||||||
import org.eclipse.jetty.util.LeakDetector;
|
import org.eclipse.jetty.util.LeakDetector;
|
||||||
|
import org.eclipse.jetty.util.ProcessorUtils;
|
||||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
import org.hamcrest.Matchers;
|
import org.hamcrest.Matchers;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
@ -59,8 +60,8 @@ public abstract class AbstractHttpClientServerTest
|
||||||
|
|
||||||
ServerFCGIConnectionFactory fcgiConnectionFactory = new ServerFCGIConnectionFactory(new HttpConfiguration());
|
ServerFCGIConnectionFactory fcgiConnectionFactory = new ServerFCGIConnectionFactory(new HttpConfiguration());
|
||||||
serverBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged());
|
serverBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged());
|
||||||
connector = new ServerConnector(server, null, null, serverBufferPool,
|
connector = new ServerConnector( server, null, null, serverBufferPool,
|
||||||
1, Math.max(1, Runtime.getRuntime().availableProcessors() / 2), fcgiConnectionFactory);
|
1, Math.max( 1, ProcessorUtils.availableProcessors() / 2), fcgiConnectionFactory);
|
||||||
// connector.setPort(9000);
|
// connector.setPort(9000);
|
||||||
|
|
||||||
server.addConnector(connector);
|
server.addConnector(connector);
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables GCloud Datastore API and implementation
|
Enables GCloud Datastore API and implementation
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Control GCloud API classpath
|
Control GCloud API classpath
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables GCloudDatastore session management.
|
Enables GCloudDatastore session management.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables session data store in an embedded Hazelcast Map
|
Enables session data store in an embedded Hazelcast Map
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables session data store in a remote Hazelcast Map
|
Enables session data store in a remote Hazelcast Map
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Installs the Conscrypt JSSE provider
|
Installs the Conscrypt JSSE provider
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Deploys the Hawtio console as a webapplication.
|
Deploys the Hawtio console as a webapplication.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Deploys the JAMon webapplication
|
Deploys the JAMon webapplication
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Deploys the Jminix JMX Console within the server
|
Deploys the Jminix JMX Console within the server
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Deploys the Jolokia console as a web application.
|
Deploys the Jolokia console as a web application.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables JSP for all webapplications deployed on the server.
|
Enables JSP for all webapplications deployed on the server.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables JSTL for all webapplications deployed on the server
|
Enables JSTL for all webapplications deployed on the server
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Enables the unix setUID configuration so that the server
|
Enables the unix setUID configuration so that the server
|
||||||
may be started as root to open privileged ports/files before
|
may be started as root to open privileged ports/files before
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
This module causes jetty to stop immediately after starting. This is good for testing configuration and/or precompiling quickstart webapps
|
This module causes jetty to stop immediately after starting. This is good for testing configuration and/or precompiling quickstart webapps
|
||||||
|
|
||||||
|
|
|
@ -417,7 +417,9 @@ public class GZIPContentDecoder implements Destroyable
|
||||||
*/
|
*/
|
||||||
public void release(ByteBuffer buffer)
|
public void release(ByteBuffer buffer)
|
||||||
{
|
{
|
||||||
if (_pool!=null && buffer!=BufferUtil.EMPTY_BUFFER)
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean isTheEmptyBuffer = (buffer==BufferUtil.EMPTY_BUFFER);
|
||||||
|
if (_pool!=null && !isTheEmptyBuffer)
|
||||||
_pool.release(buffer);
|
_pool.release(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -276,9 +276,12 @@ public class HttpField
|
||||||
|
|
||||||
public boolean isSameName(HttpField field)
|
public boolean isSameName(HttpField field)
|
||||||
{
|
{
|
||||||
|
@SuppressWarnings("ReferenceEquality")
|
||||||
|
boolean sameObject = (field==this);
|
||||||
|
|
||||||
if (field==null)
|
if (field==null)
|
||||||
return false;
|
return false;
|
||||||
if (field==this)
|
if (sameObject)
|
||||||
return true;
|
return true;
|
||||||
if (_header!=null && _header==field.getHeader())
|
if (_header!=null && _header==field.getHeader())
|
||||||
return true;
|
return true;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue