Merged branch 'jetty-10.0.x' into 'jetty-10.0.x-3952-server_direct_heap_bytebuffers'.

This commit is contained in:
Simone Bordet 2019-09-16 12:26:26 +02:00
commit 1ef4a416b5
544 changed files with 19219 additions and 7545 deletions

118
Jenkinsfile vendored
View File

@ -14,62 +14,63 @@ pipeline {
mavenBuild("jdk11", "-Pmongodb install", "maven3", true) // -Pautobahn mavenBuild("jdk11", "-Pmongodb install", "maven3", true) // -Pautobahn
// Collect up the jacoco execution results (only on main build) // Collect up the jacoco execution results (only on main build)
jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class', jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class',
exclusionPattern: '' + exclusionPattern: '' +
// build tools // build tools
'**/org/eclipse/jetty/ant/**' + '**/org/eclipse/jetty/ant/**' +
',**/org/eclipse/jetty/maven/**' + ',**/org/eclipse/jetty/maven/**' +
',**/org/eclipse/jetty/jspc/**' + ',**/org/eclipse/jetty/jspc/**' +
// example code / documentation // example code / documentation
',**/org/eclipse/jetty/embedded/**' + ',**/org/eclipse/jetty/embedded/**' +
',**/org/eclipse/jetty/asyncrest/**' + ',**/org/eclipse/jetty/asyncrest/**' +
',**/org/eclipse/jetty/demo/**' + ',**/org/eclipse/jetty/demo/**' +
// special environments / late integrations // special environments / late integrations
',**/org/eclipse/jetty/gcloud/**' + ',**/org/eclipse/jetty/gcloud/**' +
',**/org/eclipse/jetty/infinispan/**' + ',**/org/eclipse/jetty/infinispan/**' +
',**/org/eclipse/jetty/osgi/**' + ',**/org/eclipse/jetty/osgi/**' +
',**/org/eclipse/jetty/spring/**' + ',**/org/eclipse/jetty/spring/**' +
',**/org/eclipse/jetty/http/spi/**' + ',**/org/eclipse/jetty/http/spi/**' +
// test classes // test classes
',**/org/eclipse/jetty/tests/**' + ',**/org/eclipse/jetty/tests/**' +
',**/org/eclipse/jetty/test/**', ',**/org/eclipse/jetty/test/**',
execPattern: '**/target/jacoco.exec', execPattern: '**/target/jacoco.exec',
classPattern: '**/target/classes', classPattern: '**/target/classes',
sourcePattern: '**/src/main/java' sourcePattern: '**/src/main/java'
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']] warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']]
junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml,**/target/autobahntestsuite-reports/*.xml' junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml,**/target/autobahntestsuite-reports/*.xml'
} }
} }
stage("Build / Test - JDK12") { stage("Build / Test - JDK12") {
agent { node { label 'linux' } } agent { node { label 'linux' } }
options { timeout(time: 120, unit: 'MINUTES') }
steps { steps {
mavenBuild("jdk12", "-Pmongodb install", "maven3", true) timeout(time: 120, unit: 'MINUTES') {
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']] mavenBuild("jdk12", "-Pmongodb install", "maven3", true)
junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml' warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']]
junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml'
}
} }
} }
stage("Build Javadoc") { stage("Build Javadoc") {
agent { node { label 'linux' } } agent { node { label 'linux' } }
options { timeout(time: 30, unit: 'MINUTES') }
steps { steps {
mavenBuild("jdk11", "install javadoc:javadoc -DskipTests", "maven3", true) timeout(time: 30, unit: 'MINUTES') {
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'JavaDoc'], [parserName: 'Java']] mavenBuild("jdk11", "install javadoc:javadoc -DskipTests", "maven3", true)
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'JavaDoc'], [parserName: 'Java']]
}
} }
} }
stage("Checkstyle ") { stage("Checkstyle ") {
agent { node { label 'linux' } } agent { node { label 'linux' } }
options { timeout(time: 30, unit: 'MINUTES') }
steps { steps {
mavenBuild("jdk11", "install -DskipTests", "maven3", true) timeout(time: 30, unit: 'MINUTES') {
mavenBuild("jdk11", "install -f build-resources", "maven3", true) mavenBuild("jdk11", "install -f build-resources", "maven3", true)
mavenBuild("jdk11", "install checkstyle:check -DskipTests", "maven3", true) mavenBuild("jdk11", "install checkstyle:check -DskipTests", "maven3", true)
recordIssues( recordIssues(
enabledForFailure: true, aggregatingResults: true, enabledForFailure: true, aggregatingResults: true,
tools: [java(), checkStyle(pattern: '**/target/checkstyle-result.xml', reportEncoding: 'UTF-8')] tools: [java(), checkStyle(pattern: '**/target/checkstyle-result.xml', reportEncoding: 'UTF-8')])
) }
} }
} }
} }
@ -88,28 +89,24 @@ pipeline {
} }
} }
def slackNotif() { def slackNotif() {
script { script {
try try {
{ if (env.BRANCH_NAME == 'jetty-10.0.x' || env.BRANCH_NAME == 'jetty-9.4.x') {
if ( env.BRANCH_NAME == 'jetty-10.0.x' || env.BRANCH_NAME == 'jetty-9.4.x' ) //BUILD_USER = currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
{ // by ${BUILD_USER}
//BUILD_USER = currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId() COLOR_MAP = ['SUCCESS': 'good', 'FAILURE': 'danger', 'UNSTABLE': 'danger', 'ABORTED': 'danger']
// by ${BUILD_USER} slackSend channel: '#jenkins',
COLOR_MAP = ['SUCCESS': 'good', 'FAILURE': 'danger', 'UNSTABLE': 'danger', 'ABORTED': 'danger'] color: COLOR_MAP[currentBuild.currentResult],
slackSend channel: '#jenkins', message: "*${currentBuild.currentResult}:* Job ${env.JOB_NAME} build ${env.BUILD_NUMBER} - ${env.BUILD_URL}"
color: COLOR_MAP[currentBuild.currentResult],
message: "*${currentBuild.currentResult}:* Job ${env.JOB_NAME} build ${env.BUILD_NUMBER} - ${env.BUILD_URL}"
}
} catch (Exception e) {
e.printStackTrace()
echo "skip failure slack notification: " + e.getMessage()
} }
} catch (Exception e) {
e.printStackTrace()
echo "skip failure slack notification: " + e.getMessage()
} }
}
} }
/** /**
* To other developers, if you are using this method above, please use the following syntax. * To other developers, if you are using this method above, please use the following syntax.
* *
@ -125,15 +122,16 @@ def mavenBuild(jdk, cmdline, mvnName, junitPublishDisabled) {
def mavenOpts = '-Xms1g -Xmx4g -Djava.awt.headless=true' def mavenOpts = '-Xms1g -Xmx4g -Djava.awt.headless=true'
withMaven( withMaven(
maven: mvnName, maven: mvnName,
jdk: "$jdk", jdk: "$jdk",
publisherStrategy: 'EXPLICIT', publisherStrategy: 'EXPLICIT',
options: [junitPublisher(disabled: junitPublishDisabled),mavenLinkerPublisher(disabled: false),pipelineGraphPublisher(disabled: false)], options: [junitPublisher(disabled: junitPublishDisabled), mavenLinkerPublisher(disabled: false), pipelineGraphPublisher(disabled: false)],
mavenOpts: mavenOpts, mavenOpts: mavenOpts,
mavenLocalRepo: localRepo) { mavenLocalRepo: localRepo) {
// Some common Maven command line + provided command line // Some common Maven command line + provided command line
sh "mvn -Pci -V -B -T3 -e -fae -Dmaven.test.failure.ignore=true -Djetty.testtracker.log=true $cmdline -Dunix.socket.tmp=" + env.JENKINS_HOME sh "mvn -Pci -V -B -T3 -e -fae -Dmaven.test.failure.ignore=true -Djetty.testtracker.log=true $cmdline -Dunix.socket.tmp=" + env.JENKINS_HOME
} }
} }
// vim: et:ts=2:sw=2:ft=groovy // vim: et:ts=2:sw=2:ft=groovy

View File

@ -2,6 +2,6 @@
Jan Bartel <janb@mortbay.com> AED5 EE6C 45D0 FE8D 5D1B 164F 27DE D4BF 6216 DB8F Jan Bartel <janb@mortbay.com> AED5 EE6C 45D0 FE8D 5D1B 164F 27DE D4BF 6216 DB8F
Jesse McConnell <jesse.mcconnell@gmail.com> 2A68 4B57 436A 81FA 8706 B53C 61C3 351A 438A 3B7D Jesse McConnell <jesse.mcconnell@gmail.com> 2A68 4B57 436A 81FA 8706 B53C 61C3 351A 438A 3B7D
Joakim Erdfelt <joakim.erdfelt@gmail.com> 5989 BAF7 6217 B843 D66B E55B 2D0E 1FB8 FE4B 68B4 Joakim Erdfelt <joakim.erdfelt@gmail.com> 5989 BAF7 6217 B843 D66B E55B 2D0E 1FB8 FE4B 68B4
Joakim Erdfelt <joakim@apache.org> B59B 67FD 7904 9843 67F9 3180 0818 D9D6 8FB6 7BAC Joakim Erdfelt <joakime@apache.org> B59B 67FD 7904 9843 67F9 3180 0818 D9D6 8FB6 7BAC
Joakim Erdfelt <joakim@erdfelt.com> BFBB 21C2 46D7 7768 3628 7A48 A04E 0C74 ABB3 5FEA Joakim Erdfelt <joakim@erdfelt.com> BFBB 21C2 46D7 7768 3628 7A48 A04E 0C74 ABB3 5FEA
Simone Bordet <simone.bordet@gmail.com> 8B09 6546 B1A8 F026 56B1 5D3B 1677 D141 BCF3 584D Simone Bordet <simone.bordet@gmail.com> 8B09 6546 B1A8 F026 56B1 5D3B 1677 D141 BCF3 584D

View File

@ -77,8 +77,9 @@ jetty-10.0.0-alpha0 - 11 July 2019
+ 2061 WebSocket hangs in blockingWrite + 2061 WebSocket hangs in blockingWrite
+ 2075 Deprecating MultiException + 2075 Deprecating MultiException
+ 2095 Remove FastCGI multiplexing + 2095 Remove FastCGI multiplexing
+ 2103 Server should open connectors early in start sequence + 2103 Server should open connectors early in start sequence
+ 2108 Update licence headers and plugin for 2018 + 2108 Update licence headers and plugin for 2018
+ 2140 Infinispan and hazelcast changes to scavenge zombie expired sessions.
+ 2172 Support javax.websocket 1.1 + 2172 Support javax.websocket 1.1
+ 2175 Refactor WebSocket close handling + 2175 Refactor WebSocket close handling
+ 2191 JPMS Support + 2191 JPMS Support
@ -191,8 +192,51 @@ jetty-10.0.0-alpha0 - 11 July 2019
+ 3840 Byte-range request performance problems with large files + 3840 Byte-range request performance problems with large files
+ 3849 ClosedChannelException from jetty-test-webapp javax websocket chat + 3849 ClosedChannelException from jetty-test-webapp javax websocket chat
example example
+ 467246 null
+ jetty-10 null jetty-9.4.20.v20190813 - 13 August 2019
+ 300 Implement Deflater / Inflater Object Pool
+ 2061 WebSocket hangs in blockingWrite
+ 3601 HTTP2 stall on reset streams
+ 3648 javax.websocket client container incorrectly creates Server
SslContextFactory
+ 3698 Missing WebSocket ServerContainer after server restart
+ 3700 stackoverflow in WebAppClassLoaderUrlStreamTest
+ 3708 Swap various java.lang.String replace() methods for better performant
ones
+ 3731 Add testing of CDI behaviors
+ 3736 NPE from WebAppClassLoader during CDI
+ 3746 ClassCastException in WriteFlusher.java - IdleState cannot be cast to
FailedState
+ 3749 Memory leak while processing AsyncListener annotations
+ 3755 ServerWithAnnotations doesn't do anything
+ 3758 Avoid sending empty trailer frames for http/2 requests
+ 3782 X-Forwarded-Port overrides X-Forwarded-For
+ 3786 ALPN support for Java 14
+ 3798 ClasspathPattern match method throws NPE. URI can be null
+ 3799 Programmatically added listeners from
ServletContextListener.contextInitialzed() are not called
+ 3804 Weld/CDI XML backwards compat
+ 3805 XmlConfiguration odd behavior for numbers
+ 3806 The error page handler didn't process correctly in proxy
+ 3815 PropertyFileLoginModule adds user principle as a role
+ 3822 trustAll will not work on some servers
+ 3829 Avoid sending empty trailer frames for http/2 responses
+ 3835 WebSocketSession are not being stopped properly
+ 3840 Byte-range request performance problems with large files
+ 3856 Different behaviour with maxFormContentSize=0 if Content-Length header
is present/missing
+ 3876 WebSocketPartialListener is only called for initial frames, not for
continuation frames
+ 3884 @WebSocket without @OnWebSocketMessage handler fails when receiving a
continuation frame
+ 3888 BufferUtil.toBuffer(Resource resource,boolean direct) does not like
large (4G+) Resources
+ 3906 Fix for #3840 breaks Path encapsulation in PathResource
+ 3929 Deadlock between new HTTP2Connection() and Server.stop()
+ 3940 Double initialization of Log
+ 3957 CustomRequestLog bad usage of MethodHandles.lookup()
+ 3960 Fix HttpConfiguration copy constructor
+ 3969 X-Forwarded-Port header customization isn't possible
jetty-9.4.19.v20190610 - 10 June 2019 jetty-9.4.19.v20190610 - 10 June 2019
+ 2909 Remove B64Code + 2909 Remove B64Code
@ -246,6 +290,7 @@ jetty-9.4.18.v20190429 - 29 April 2019
+ 3609 Fix infinispan start module dependencies + 3609 Fix infinispan start module dependencies
jetty-9.4.17.v20190418 - 18 April 2019 jetty-9.4.17.v20190418 - 18 April 2019
+ 2140 Infinispan and hazelcast changes to scavenge zombie expired sessions.
+ 3464 Split SslContextFactory into Client and Server + 3464 Split SslContextFactory into Client and Server
+ 3549 Directory Listing on Windows reveals Resource Base path + 3549 Directory Listing on Windows reveals Resource Base path
+ 3555 DefaultHandler Reveals Base Resource Path of each Context + 3555 DefaultHandler Reveals Base Resource Path of each Context

View File

@ -347,7 +347,7 @@
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/> <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="false"/> <setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/> <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="128"/> <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="512"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/> <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/> <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile> </profile>

View File

@ -1,4 +1,4 @@
<code_scheme name="Jetty-StyleChecked" version="173"> <code_scheme name="Jetty" version="173">
<option name="AUTODETECT_INDENTS" value="false" /> <option name="AUTODETECT_INDENTS" value="false" />
<option name="LINE_SEPARATOR" value="&#xA;" /> <option name="LINE_SEPARATOR" value="&#xA;" />
<option name="RIGHT_MARGIN" value="128" /> <option name="RIGHT_MARGIN" value="128" />
@ -9,7 +9,6 @@
<option name="HTML_ATTRIBUTE_WRAP" value="0" /> <option name="HTML_ATTRIBUTE_WRAP" value="0" />
</HTMLCodeStyleSettings> </HTMLCodeStyleSettings>
<JavaCodeStyleSettings> <JavaCodeStyleSettings>
<option name="FIELD_NAME_PREFIX" value="_" />
<option name="USE_EXTERNAL_ANNOTATIONS" value="true" /> <option name="USE_EXTERNAL_ANNOTATIONS" value="true" />
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" /> <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" /> <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
@ -67,9 +66,11 @@
<option name="WHILE_ON_NEW_LINE" value="true" /> <option name="WHILE_ON_NEW_LINE" value="true" />
<option name="CATCH_ON_NEW_LINE" value="true" /> <option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" /> <option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="true" />
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" />
<option name="SPACE_AFTER_TYPE_CAST" value="false" /> <option name="SPACE_AFTER_TYPE_CAST" value="false" />
<option name="RESOURCE_LIST_WRAP" value="2" /> <option name="RESOURCE_LIST_WRAP" value="2" />
<option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="false" />
<option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="true" /> <option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="true" /> <option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="true" />
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> <option name="ARRAY_INITIALIZER_WRAP" value="1" />
@ -80,6 +81,7 @@
<option name="FOR_BRACE_FORCE" value="3" /> <option name="FOR_BRACE_FORCE" value="3" />
<indentOptions> <indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</indentOptions> </indentOptions>
<arrangement> <arrangement>
<rules> <rules>

View File

@ -39,6 +39,11 @@
<property name="checkFormat" value="$1"/> <property name="checkFormat" value="$1"/>
</module> </module>
<!--
Eclipse Jetty Specific.
===========================================================================================
-->
<!-- Location of Annotations --> <!-- Location of Annotations -->
<module name="AnnotationLocation"> <module name="AnnotationLocation">
<property name="allowSamelineSingleParameterlessAnnotation" value="false"/> <property name="allowSamelineSingleParameterlessAnnotation" value="false"/>

View File

@ -132,7 +132,32 @@
<dependency> <dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>
<!-- scope>test</scope--> <scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>jetty-websocket-client</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-distribution</artifactId>
<version>${project.version}</version>
<type>tar.gz</type>
<scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useManifestOnlyJar>false</useManifestOnlyJar>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

View File

@ -22,7 +22,6 @@ import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ReadListener; import javax.servlet.ReadListener;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream; import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener; import javax.servlet.WriteListener;
@ -35,7 +34,7 @@ public class AsyncEchoServlet extends HttpServlet
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException
{ {
AsyncContext asyncContext = request.startAsync(request, response); AsyncContext asyncContext = request.startAsync(request, response);
asyncContext.setTimeout(0); asyncContext.setTimeout(0);

View File

@ -20,6 +20,8 @@ package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Collections;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -45,12 +47,28 @@ public class DumpServlet extends HttpServlet
out.println("pathInfo=" + request.getPathInfo()); out.println("pathInfo=" + request.getPathInfo());
out.println("session=" + request.getSession(true).getId()); out.println("session=" + request.getSession(true).getId());
ServletContext servletContext = getServletContext();
String r = request.getParameter("resource"); String r = request.getParameter("resource");
if (r != null) if (r != null)
{ {
out.println("resource(" + r + ")=" + getServletContext().getResource(r)); out.println("resource(" + r + ")=" + servletContext.getResource(r));
} }
Collections.list(request.getAttributeNames())
.stream()
.filter((name) -> name.startsWith("X-"))
.sorted()
.forEach((name) ->
out.println("request.attribute[" + name + "]=" + request.getAttribute(name)));
Collections.list(servletContext.getAttributeNames())
.stream()
.filter((name) -> name.startsWith("X-"))
.sorted()
.forEach((name) ->
out.println("servletContext.attribute[" + name + "]=" + servletContext.getAttribute(name)));
out.println("</pre>"); out.println("</pre>");
} }
} }

View File

@ -28,12 +28,12 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class ExampleServer public class ExampleServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8080); connector.setPort(port);
server.setConnectors(new Connector[]{connector}); server.setConnectors(new Connector[]{connector});
ServletContextHandler context = new ServletContextHandler(); ServletContextHandler context = new ServletContextHandler();
@ -45,6 +45,13 @@ public class ExampleServer
handlers.setHandlers(new Handler[]{context, new DefaultHandler()}); handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -18,21 +18,31 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.xml.XmlConfiguration; import org.eclipse.jetty.xml.XmlConfiguration;
/** /**
* Configures and Starts a Jetty server from an XML declaration. * Configures and Starts a Jetty server from an XML declaration.
* <p>
* See <a href="https://raw.githubusercontent.com/eclipse/jetty.project/master/examples/embedded/src/main/resources/exampleserver.xml">exampleserver.xml</a>
* </p>
*/ */
public class ExampleServerXml public class ExampleServerXml
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws Exception
{ {
// Find Jetty XML (in classpath) that configures and starts Server. // Find Jetty XML (in classpath) that configures and starts Server.
// See src/main/resources/exampleserver.xml
Resource serverXml = Resource.newSystemResource("exampleserver.xml"); Resource serverXml = Resource.newSystemResource("exampleserver.xml");
XmlConfiguration.main(serverXml.getFile().getAbsolutePath()); XmlConfiguration xml = new XmlConfiguration(serverXml);
xml.getProperties().put("http.port", Integer.toString(port));
Server server = (Server)xml.configure();
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start();
server.join();
} }
} }

View File

@ -0,0 +1,86 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import org.eclipse.jetty.util.StringUtil;
public class ExampleUtil
{
/**
* Get a port, possibly configured from Command line or System property.
*
* @param args the command line arguments
* @param propertyName the property name
* @param defValue the default value
* @return the configured port
*/
public static int getPort(String[] args, String propertyName, int defValue)
{
for (String arg : args)
{
if (arg.startsWith(propertyName + "="))
{
String value = arg.substring(propertyName.length() + 2);
int port = toInt(value);
if (isValidPort(port))
return port;
}
}
String value = System.getProperty(propertyName);
int port = toInt(value);
if (isValidPort(port))
return port;
return defValue;
}
/**
* Test if port is in the valid range to be used.
*
* @param port the port to test
* @return true if valid
*/
private static boolean isValidPort(int port)
{
return (port >= 0) && (port <= 65535);
}
/**
* Parse an int, ignoring any {@link NumberFormatException}
*
* @param value the string value to parse
* @return the int (if parsed), or -1 if not parsed.
*/
private static int toInt(String value)
{
if (StringUtil.isBlank(value))
return -1;
try
{
return Integer.parseInt(value);
}
catch (NumberFormatException ignored)
{
// ignored
return -1;
}
}
}

View File

@ -58,17 +58,24 @@ import org.eclipse.jetty.util.resource.Resource;
*/ */
public class FastFileServer public class FastFileServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, File resourceBase)
{ {
Server server = new Server(8080); Server server = new Server(port);
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{ handlers.setHandlers(new Handler[]{
new FastFileHandler(new File(System.getProperty("user.dir"))), new FastFileHandler(resourceBase),
new DefaultHandler() new DefaultHandler()
}); });
server.setHandler(handlers); server.setHandler(handlers);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
File directory = new File(System.getProperty("user.dir"));
Server server = createServer(port, directory);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -18,11 +18,16 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
/** /**
* Simple Jetty FileServer. * Simple Jetty FileServer.
@ -30,12 +35,12 @@ import org.eclipse.jetty.server.handler.ResourceHandler;
*/ */
public class FileServer public class FileServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, Resource baseResource) throws Exception
{ {
// Create a basic Jetty server object that will listen on port 8080. Note that if you set this to port 0 // Create a basic Jetty server object that will listen on port 8080. Note that if you set this to port 0
// then a randomly available port will be assigned that you can either look in the logs for the port, // then a randomly available port will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
final Server server = new Server(8080); Server server = new Server(port);
// Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is // Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is
// a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples. // a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples.
@ -45,13 +50,24 @@ public class FileServer
// In this example it is the current directory but it can be configured to anything that the jvm has access to. // In this example it is the current directory but it can be configured to anything that the jvm has access to.
resourceHandler.setDirectoriesListed(true); resourceHandler.setDirectoriesListed(true);
resourceHandler.setWelcomeFiles(new String[]{"index.html"}); resourceHandler.setWelcomeFiles(new String[]{"index.html"});
resourceHandler.setResourceBase("."); resourceHandler.setBaseResource(baseResource);
// Add the ResourceHandler to the server. // Add the ResourceHandler to the server.
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()}); handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Path userDir = Paths.get(System.getProperty("user.dir"));
PathResource pathResource = new PathResource(userDir);
Server server = createServer(port, pathResource);
// Start things up! By using the server.join() the server thread will join with the current thread. // Start things up! By using the server.join() the server thread will join with the current thread.
// See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details. // See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details.
server.start(); server.start();

View File

@ -18,6 +18,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.xml.XmlConfiguration; import org.eclipse.jetty.xml.XmlConfiguration;
@ -28,17 +31,25 @@ import org.eclipse.jetty.xml.XmlConfiguration;
* This server is identical to {@link FileServer}, except that it is configured * This server is identical to {@link FileServer}, except that it is configured
* via an {@link XmlConfiguration} config file that does the identical work. * via an {@link XmlConfiguration} config file that does the identical work.
* </p> * </p>
* <p>
* See <a href="https://raw.githubusercontent.com/eclipse/jetty.project/master/examples/embedded/src/main/resources/fileserver.xml">fileserver.xml</a>
* </p>
*/ */
public class FileServerXml public class FileServerXml
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, Path baseResource) throws Exception
{ {
// Find Jetty XML (in classpath) that configures and starts Server.
// See src/main/resources/fileserver.xml
Resource fileServerXml = Resource.newSystemResource("fileserver.xml"); Resource fileServerXml = Resource.newSystemResource("fileserver.xml");
XmlConfiguration configuration = new XmlConfiguration(fileServerXml); XmlConfiguration configuration = new XmlConfiguration(fileServerXml);
Server server = (Server)configuration.configure(); configuration.getProperties().put("http.port", Integer.toString(port));
configuration.getProperties().put("fileserver.baseresource", baseResource.toAbsolutePath().toString());
return (Server)configuration.configure();
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Path userDir = Paths.get(System.getProperty("user.dir"));
Server server = createServer(port, userDir);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -51,7 +51,8 @@ public class HelloWorld extends AbstractHandler
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = new Server(port);
server.setHandler(new HelloWorld()); server.setHandler(new HelloWorld());
server.start(); server.start();

View File

@ -18,9 +18,12 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.EnumSet; import java.util.EnumSet;
@ -56,12 +59,15 @@ import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.PushCacheFilter; import org.eclipse.jetty.servlets.PushCacheFilter;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.ssl.SslContextFactory;
public class Http2Server public class Http2Server
{ {
public static void main(String... args) throws Exception public static void main(String... args) throws Exception
{ {
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
int securePort = ExampleUtil.getPort(args, "jetty.https.port", 8443);
Server server = new Server(); Server server = new Server();
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
@ -69,10 +75,11 @@ public class Http2Server
server.addBean(mbContainer); server.addBean(mbContainer);
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
String docroot = "src/main/resources/docroot"; Path docroot = Paths.get("src/main/resources/docroot");
if (!new File(docroot).exists()) if (!Files.exists(docroot))
docroot = "examples/embedded/src/main/resources/docroot"; throw new FileNotFoundException(docroot.toString());
context.setResourceBase(docroot);
context.setBaseResource(new PathResource(docroot));
context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
// context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); // context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
context.addFilter(PushedTilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(PushedTilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
@ -83,21 +90,21 @@ public class Http2Server
// HTTP Configuration // HTTP Configuration
HttpConfiguration httpConfig = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https"); httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(8443); httpConfig.setSecurePort(securePort);
httpConfig.setSendXPoweredBy(true); httpConfig.setSendXPoweredBy(true);
httpConfig.setSendServerVersion(true); httpConfig.setSendServerVersion(true);
// HTTP Connector // HTTP Connector
ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig), new HTTP2CServerConnectionFactory(httpConfig)); ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig), new HTTP2CServerConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(port);
server.addConnector(http); server.addConnector(http);
// SSL Context Factory for HTTPS and HTTP/2 // SSL Context Factory for HTTPS and HTTP/2
String jettyDistro = System.getProperty("jetty.distro", "../../jetty-distribution/target/distribution"); Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
if (!new File(jettyDistro).exists()) if (!Files.exists(keystorePath))
jettyDistro = "jetty-distribution/target/distribution"; throw new FileNotFoundException(keystorePath.toString());
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(jettyDistro + "/demo-base/etc/keystore"); sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
@ -119,7 +126,7 @@ public class Http2Server
// HTTP/2 Connector // HTTP/2 Connector
ServerConnector http2Connector = ServerConnector http2Connector =
new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig)); new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
http2Connector.setPort(8443); http2Connector.setPort(securePort);
server.addConnector(http2Connector); server.addConnector(http2Connector);
server.start(); server.start();

View File

@ -18,7 +18,11 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Handler; import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
@ -28,24 +32,36 @@ import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
/** /**
* * Example of serving content from a JAR file.
* The JAR file in this example does not belong to any Classpath.
*/ */
public class JarServer public class JarServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws Exception
{ {
final Server server = new Server(8080); Server server = new Server(port);
Path jarFile = Paths.get("src/main/other/content.jar");
if (!Files.exists(jarFile))
throw new FileNotFoundException(jarFile.toString());
ServletContextHandler context = new ServletContextHandler(); ServletContextHandler context = new ServletContextHandler();
Resource.setDefaultUseCaches(true); Resource.setDefaultUseCaches(true);
Resource base = Resource.newResource("jar:file:src/main/resources/content.jar!/"); Resource base = Resource.newResource("jar:" + jarFile.toAbsolutePath().toUri().toASCIIString() + "!/");
context.setBaseResource(base); context.setBaseResource(base);
context.addServlet(new ServletHolder(new DefaultServlet()), "/"); context.addServlet(new ServletHolder(new DefaultServlet()), "/");
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{context, new DefaultHandler()}); handlers.addHandler(context);
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers); server.setHandler(handlers);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -18,8 +18,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
@ -41,54 +42,80 @@ public class JettyDistribution
static static
{ {
Path distro = asJettyDistribution(System.getProperty("jetty.home")); Path distro = asJettyDistribution(System.getProperty("jetty.home"));
LOG.debug("JettyDistribution(prop(jetty.home)) = " + distro);
if (distro == null) if (distro == null)
{
distro = asJettyDistribution(System.getenv().get("JETTY_HOME")); distro = asJettyDistribution(System.getenv().get("JETTY_HOME"));
LOG.debug("JettyDistribution(env(JETTY_HOME)) = " + distro);
}
if (distro == null) if (distro == null)
{ {
try try
{ {
Path working = new File(".").getAbsoluteFile().getCanonicalFile().toPath(); Path working = Paths.get(System.getProperty("user.dir"));
LOG.debug("JettyDistribution(prop(user.dir)) = " + working);
while (distro == null && working != null) while (distro == null && working != null)
{ {
distro = asJettyDistribution(working.resolve("jetty-distribution/target/distribution").toString()); distro = asJettyDistribution(working.resolve("jetty-distribution/target/distribution").toString());
working = working.getParent(); working = working.getParent();
} }
LOG.debug("JettyDistribution(working.resolve(...)) = " + distro);
} }
catch (Throwable th) catch (Throwable th)
{ {
LOG.warn(th); LOG.warn(th);
} }
} }
if (distro == null)
{
LOG.info("JettyDistribution() FAILURE: NOT FOUND");
}
else
{
LOG.debug("JettyDistribution() FOUND = " + distro);
}
DISTRIBUTION = distro; DISTRIBUTION = distro;
} }
private static Path asJettyDistribution(String test) private static Path asJettyDistribution(String jettyHome)
{ {
try try
{ {
if (StringUtil.isBlank(test)) if (jettyHome == null)
{ {
LOG.info("asJettyDistribution {} is blank", test);
return null; return null;
} }
File dir = new File(test); if (StringUtil.isBlank(jettyHome))
if (!dir.exists() || !dir.isDirectory())
{ {
LOG.info("asJettyDistribution {} is not a directory", test); LOG.debug("asJettyDistribution {} is blank", jettyHome);
return null; return null;
} }
File demoBase = new File(dir, "demo-base"); Path dir = Paths.get(jettyHome);
if (!demoBase.exists() || !demoBase.isDirectory()) if (!Files.exists(dir))
{ {
LOG.info("asJettyDistribution {} has no demo-base", test); LOG.debug("asJettyDistribution {} does not exist", jettyHome);
return null; return null;
} }
LOG.info("asJettyDistribution {}", dir); if (!Files.isDirectory(dir))
return dir.getAbsoluteFile().getCanonicalFile().toPath(); {
LOG.debug("asJettyDistribution {} is not a directory", jettyHome);
return null;
}
Path demoBase = dir.resolve("demo-base");
if (!Files.exists(demoBase) || !Files.isDirectory(demoBase))
{
LOG.debug("asJettyDistribution {} has no demo-base", jettyHome);
return null;
}
LOG.debug("asJettyDistribution {}", dir);
return dir.toAbsolutePath();
} }
catch (Exception e) catch (Exception e)
{ {
@ -97,9 +124,16 @@ public class JettyDistribution
return null; return null;
} }
public static Path get()
{
if (DISTRIBUTION == null)
throw new RuntimeException("jetty-distribution not found");
return DISTRIBUTION;
}
public static Path resolve(String path) public static Path resolve(String path)
{ {
return DISTRIBUTION.resolve(path); return get().resolve(path);
} }
public static void main(String... arg) public static void main(String... arg)

View File

@ -18,12 +18,16 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.annotations.AnnotationConfiguration; import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.deploy.DeploymentManager; import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.deploy.PropertiesConfigurationManager; import org.eclipse.jetty.deploy.PropertiesConfigurationManager;
import org.eclipse.jetty.deploy.bindings.DebugListenerBinding;
import org.eclipse.jetty.deploy.providers.WebAppProvider; import org.eclipse.jetty.deploy.providers.WebAppProvider;
import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.jmx.MBeanContainer;
@ -35,6 +39,7 @@ import org.eclipse.jetty.rewrite.handler.ValidUrlRule;
import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.AsyncRequestLogWriter; import org.eclipse.jetty.server.AsyncRequestLogWriter;
import org.eclipse.jetty.server.CustomRequestLog; import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.DebugListener;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.HttpConnectionFactory;
@ -59,21 +64,21 @@ import org.eclipse.jetty.webapp.Configurations;
*/ */
public class LikeJettyXml public class LikeJettyXml
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, int securePort, boolean addDebugListener) throws Exception
{ {
// Path to as-built jetty-distribution directory // Path to as-built jetty-distribution directory
String jettyHomeBuild = JettyDistribution.DISTRIBUTION.toString(); Path jettyHomeBuild = JettyDistribution.get();
// Find jetty home and base directories // Find jetty home and base directories
String homePath = System.getProperty("jetty.home", jettyHomeBuild); String homePath = System.getProperty("jetty.home", jettyHomeBuild.toString());
File homeDir = new File(homePath); Path homeDir = Paths.get(homePath);
String basePath = System.getProperty("jetty.base", homeDir + "/demo-base"); String basePath = System.getProperty("jetty.base", homeDir.resolve("demo-base").toString());
File baseDir = new File(basePath); Path baseDir = Paths.get(basePath);
// Configure jetty.home and jetty.base system properties // Configure jetty.home and jetty.base system properties
String jettyHome = homeDir.getAbsolutePath(); String jettyHome = homeDir.toAbsolutePath().toString();
String jettyBase = baseDir.getAbsolutePath(); String jettyBase = baseDir.toAbsolutePath().toString();
System.setProperty("jetty.home", jettyHome); System.setProperty("jetty.home", jettyHome);
System.setProperty("jetty.base", jettyBase); System.setProperty("jetty.base", jettyBase);
@ -91,7 +96,7 @@ public class LikeJettyXml
// HTTP Configuration // HTTP Configuration
HttpConfiguration httpConfig = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https"); httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(8443); httpConfig.setSecurePort(securePort);
httpConfig.setOutputBufferSize(32768); httpConfig.setOutputBufferSize(32768);
httpConfig.setRequestHeaderSize(8192); httpConfig.setRequestHeaderSize(8192);
httpConfig.setResponseHeaderSize(8192); httpConfig.setResponseHeaderSize(8192);
@ -105,11 +110,6 @@ public class LikeJettyXml
handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()}); handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
// Extra options
server.setDumpAfterStart(true);
server.setDumpBeforeStop(false);
server.setStopAtShutdown(true);
// === jetty-jmx.xml === // === jetty-jmx.xml ===
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
@ -118,24 +118,21 @@ public class LikeJettyXml
// === jetty-http.xml === // === jetty-http.xml ===
ServerConnector http = new ServerConnector(server, ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(httpConfig)); new HttpConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(port);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
server.addConnector(http); server.addConnector(http);
// === jetty-https.xml === // === jetty-https.xml ===
// SSL Context Factory // SSL Context Factory
Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
if (!Files.exists(keystorePath))
throw new FileNotFoundException(keystorePath.toString());
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore"); sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setTrustStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore"); sslContextFactory.setTrustStorePath(keystorePath.toString());
sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
"SSL_RSA_EXPORT_WITH_RC4_40_MD5",
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
// SSL HTTP Configuration // SSL HTTP Configuration
HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig); HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
@ -145,14 +142,17 @@ public class LikeJettyXml
ServerConnector sslConnector = new ServerConnector(server, ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfig)); new HttpConnectionFactory(httpsConfig));
sslConnector.setPort(8443); sslConnector.setPort(securePort);
server.addConnector(sslConnector); server.addConnector(sslConnector);
// === jetty-deploy.xml === // === jetty-deploy.xml ===
DeploymentManager deployer = new DeploymentManager(); DeploymentManager deployer = new DeploymentManager();
//DebugListener debug = new DebugListener(System.out,true,true,true); if (addDebugListener)
// server.addBean(debug); {
// deployer.addLifeCycleBinding(new DebugListenerBinding(debug)); DebugListener debug = new DebugListener(System.err, true, true, true);
server.addBean(debug);
deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
}
deployer.setContexts(contexts); deployer.setContexts(contexts);
deployer.setContextAttribute( deployer.setContextAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
@ -208,6 +208,20 @@ public class LikeJettyXml
login.setHotReload(false); login.setHotReload(false);
server.addBean(login); server.addBean(login);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
int securePort = ExampleUtil.getPort(args, "jetty.https.port", 8443);
Server server = createServer(port, securePort, true);
// Extra options
server.setDumpAfterStart(true);
server.setDumpBeforeStop(false);
server.setStopAtShutdown(true);
// Start the server // Start the server
server.start(); server.start();
server.join(); server.join();

View File

@ -18,8 +18,10 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Connector;
@ -36,23 +38,13 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
*/ */
public class ManyConnectors public class ManyConnectors
{ {
public static void main(String[] args) throws Exception public static Server createServer(int plainPort, int securePort) throws Exception
{ {
// Since this example shows off SSL configuration, we need a keystore // Since this example shows off SSL configuration, we need a keystore
// with the appropriate key. These lookup of jetty.home is purely a hack // with the appropriate key.
// to get access to a keystore that we use in many unit tests and should Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
// probably be a direct path to your own keystore. if (!Files.exists(keystorePath))
throw new FileNotFoundException(keystorePath.toString());
String jettyDistKeystore = "../../jetty-distribution/target/distribution/demo-base/etc/test-keystore";
String keystorePath = System.getProperty("example.keystore", jettyDistKeystore);
File keystoreFile = new File(keystorePath);
if (!keystoreFile.exists())
{
keystorePath = "jetty-distribution/target/distribution/demo-base/etc/keystore";
keystoreFile = new File(keystorePath);
if (!keystoreFile.exists())
throw new FileNotFoundException(keystoreFile.getAbsolutePath());
}
// Create a basic jetty server object without declaring the port. Since // Create a basic jetty server object without declaring the port. Since
// we are configuring connectors directly we'll be setting ports on // we are configuring connectors directly we'll be setting ports on
@ -67,7 +59,7 @@ public class ManyConnectors
// done. The port for secured communication is also set here. // done. The port for secured communication is also set here.
HttpConfiguration httpConfig = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https"); httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(8443); httpConfig.setSecurePort(securePort);
httpConfig.setOutputBufferSize(32768); httpConfig.setOutputBufferSize(32768);
// HTTP connector // HTTP connector
@ -77,7 +69,7 @@ public class ManyConnectors
// configure an idle timeout. // configure an idle timeout.
ServerConnector http = new ServerConnector(server, ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(httpConfig)); new HttpConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(plainPort);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
// SSL Context Factory for HTTPS // SSL Context Factory for HTTPS
@ -88,7 +80,7 @@ public class ManyConnectors
// keystore to be used. // keystore to be used.
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath()); sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
@ -118,7 +110,7 @@ public class ManyConnectors
ServerConnector https = new ServerConnector(server, ServerConnector https = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfig)); new HttpConnectionFactory(httpsConfig));
https.setPort(8443); https.setPort(securePort);
https.setIdleTimeout(500000); https.setIdleTimeout(500000);
// Here you see the server having multiple connectors registered with // Here you see the server having multiple connectors registered with
@ -132,7 +124,14 @@ public class ManyConnectors
// Set a handler // Set a handler
server.setHandler(new HelloHandler()); server.setHandler(new HelloHandler());
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
int securePort = ExampleUtil.getPort(args, "jetty.https.port", 8443);
Server server = createServer(port, securePort);
// Start the server // Start the server
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();

View File

@ -18,39 +18,42 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
public class ManyContexts public class ManyContexts
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
final Server server = new Server(8080); Server server = new Server(port);
ContextHandler context = new ContextHandler("/"); ContextHandler context = new ContextHandler("/");
context.setContextPath("/"); context.setContextPath("/");
context.setHandler(new HelloHandler("Root Hello")); context.setHandler(new HelloHandler("Root Hello"));
ContextHandler contextFR = new ContextHandler("/fr"); ContextHandler contextFR = new ContextHandler("/fr");
contextFR.setHandler(new HelloHandler("Bonjoir")); contextFR.setHandler(new HelloHandler("Bonjour"));
ContextHandler contextIT = new ContextHandler("/it"); ContextHandler contextIT = new ContextHandler("/it");
contextIT.setHandler(new HelloHandler("Bongiorno")); contextIT.setHandler(new HelloHandler("Buongiorno"));
ContextHandler contextV = new ContextHandler("/"); ContextHandler contextV = new ContextHandler("/");
contextV.setVirtualHosts(new String[]{"127.0.0.2"}); contextV.setVirtualHosts(new String[]{"127.0.0.2"});
contextV.setHandler(new HelloHandler("Virtual Hello")); contextV.setHandler(new HelloHandler("Virtual Hello"));
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection(
contexts.setHandlers(new Handler[]{ context, contextFR, contextIT, contextV
context, contextFR, contextIT, );
contextV
});
server.setHandler(contexts); server.setHandler(contexts);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -30,6 +30,8 @@ import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
@ -99,20 +101,23 @@ public class ManyHandlers
HttpServletResponse response) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
request.setAttribute("welcome", "Hello"); response.setHeader("X-Welcome", "Greetings from WelcomeWrapHandler");
super.handle(target, baseRequest, request, response); super.handle(target, baseRequest, request, response);
} }
} }
public static void main(String[] args) throws Exception public static Server createServer(int port) throws IOException
{ {
final Server server = new Server(8080); Server server = new Server(port);
// create the handlers // create the handlers
final Handler param = new ParamHandler(); Handler param = new ParamHandler();
final HandlerWrapper wrapper = new WelcomeWrapHandler(); HandlerWrapper wrapper = new WelcomeWrapHandler();
final Handler hello = new HelloHandler(); Handler hello = new HelloHandler();
final Handler dft = new DefaultHandler(); GzipHandler gzipHandler = new GzipHandler();
gzipHandler.setMinGzipSize(10);
gzipHandler.addIncludedMimeTypes("text/plain");
gzipHandler.addIncludedMimeTypes("text/html");
// configure request logging // configure request logging
File requestLogFile = File.createTempFile("demo", "log"); File requestLogFile = File.createTempFile("demo", "log");
@ -120,16 +125,47 @@ public class ManyHandlers
server.setRequestLog(ncsaLog); server.setRequestLog(ncsaLog);
// create the handler collections // create the handler collections
HandlerCollection handlers = new HandlerCollection(); HandlerList handlers = new HandlerList();
HandlerList list = new HandlerList();
// link them all together // wrap contexts around specific handlers
wrapper.setHandler(hello); wrapper.setHandler(hello);
list.setHandlers(new Handler[]{param, new GzipHandler()}); ContextHandler helloContext = new ContextHandler("/hello");
handlers.setHandlers(new Handler[]{list, dft}); helloContext.setHandler(wrapper);
ContextHandler paramContext = new ContextHandler("/params");
paramContext.setHandler(param);
ContextHandlerCollection contexts = new ContextHandlerCollection(helloContext, paramContext);
// Wrap Contexts with GZIP
gzipHandler.setHandler(contexts);
// Set the top level Handler List
handlers.addHandler(gzipHandler);
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers); server.setHandler(handlers);
/* At this point you have the following handler hierarchy.
*
* Server.handler:
* HandlerList
* \- GzipHandler
* | \- ContextHandlerCollection
* | \- ContextHandler ("/hello")
* | | \- WelcomeWrapHandler
* | | \- HelloHandler
* | \- ContextHandler ("/params")
* | \- ParamHandler
* \- DefaultHandler
*/
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -29,9 +29,9 @@ import org.eclipse.jetty.servlet.ServletHolder;
public class ManyServletContexts public class ManyServletContexts
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(8080); Server server = new Server(port);
// Setup JMX // Setup JMX
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
@ -48,7 +48,7 @@ public class ManyServletContexts
// Add servlets to root context // Add servlets to root context
root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/"); root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/");
root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/it/*"); root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/it/*");
root.addServlet(new ServletHolder(new HelloServlet("Bonjoir")), "/fr/*"); root.addServlet(new ServletHolder(new HelloServlet("Bonjour")), "/fr/*");
// Configure context "/other" for servlets // Configure context "/other" for servlets
ServletContextHandler other = new ServletContextHandler(contexts, ServletContextHandler other = new ServletContextHandler(contexts,
@ -57,6 +57,13 @@ public class ManyServletContexts
other.addServlet(DefaultServlet.class.getCanonicalName(), "/"); other.addServlet(DefaultServlet.class.getCanonicalName(), "/");
other.addServlet(new ServletHolder(new HelloServlet("YO!")), "*.yo"); other.addServlet(new ServletHolder(new HelloServlet("YO!")), "*.yo");
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -29,13 +28,13 @@ import org.eclipse.jetty.servlet.ServletHandler;
public class MinimalServlets public class MinimalServlets
{ {
public static void main(String[] args) throws Exception
public static Server createServer(int port)
{ {
// Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port // Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port, // will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server(8080); Server server = new Server(port);
// The ServletHandler is a dead simple way to create a context handler // The ServletHandler is a dead simple way to create a context handler
// that is backed by an instance of a Servlet. // that is backed by an instance of a Servlet.
@ -51,13 +50,20 @@ public class MinimalServlets
// through a web.xml @WebServlet annotation, or anything similar. // through a web.xml @WebServlet annotation, or anything similar.
handler.addServletWithMapping(HelloServlet.class, "/*"); handler.addServletWithMapping(HelloServlet.class, "/*");
return server;
}
public static void main(String[] args) throws Exception
{
// Create a basic jetty server object that will listen on port 8080.
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
// Start things up! // Start things up!
server.start(); server.start();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server thread is done executing.
// See
// http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
@ -66,11 +72,11 @@ public class MinimalServlets
{ {
@Override @Override
protected void doGet(HttpServletRequest request, protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, HttpServletResponse response) throws IOException
IOException
{ {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().println("<h1>Hello from HelloServlet</h1>"); response.getWriter().println("<h1>Hello from HelloServlet</h1>");
} }
} }

View File

@ -26,7 +26,7 @@ import org.eclipse.jetty.server.ServerConnector;
*/ */
public class OneConnector public class OneConnector
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws Exception
{ {
// The Server // The Server
Server server = new Server(); Server server = new Server();
@ -34,7 +34,7 @@ public class OneConnector
// HTTP connector // HTTP connector
ServerConnector http = new ServerConnector(server); ServerConnector http = new ServerConnector(server);
http.setHost("localhost"); http.setHost("localhost");
http.setPort(8080); http.setPort(port);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
// Set the connector // Set the connector
@ -42,6 +42,13 @@ public class OneConnector
// Set a handler // Set a handler
server.setHandler(new HelloHandler()); server.setHandler(new HelloHandler());
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
// Start the server // Start the server
server.start(); server.start();

View File

@ -23,9 +23,9 @@ import org.eclipse.jetty.server.handler.ContextHandler;
public class OneContext public class OneContext
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(8080); Server server = new Server(port);
// Add a single handler on context "/hello" // Add a single handler on context "/hello"
ContextHandler context = new ContextHandler(); ContextHandler context = new ContextHandler();
@ -35,6 +35,13 @@ public class OneContext
// Can be accessed using http://localhost:8080/hello // Can be accessed using http://localhost:8080/hello
server.setHandler(context); server.setHandler(context);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
// Start the server // Start the server
server.start(); server.start();

View File

@ -22,11 +22,17 @@ import org.eclipse.jetty.server.Server;
public class OneHandler public class OneHandler
{ {
public static Server createServer(int port)
{
Server server = new Server(port);
server.setHandler(new HelloHandler());
return server;
}
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
server.setHandler(new HelloHandler()); Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -19,8 +19,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet; import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; import javax.servlet.FilterConfig;
@ -31,38 +32,59 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; import javax.servlet.ServletRequestListener;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ListenerHolder; import org.eclipse.jetty.servlet.ListenerHolder;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
import static javax.servlet.DispatcherType.ASYNC;
import static javax.servlet.DispatcherType.REQUEST;
public class OneServletContext public class OneServletContext
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, Resource baseResource)
{ {
Server server = new Server(8080); Server server = new Server(port);
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
context.setResourceBase(System.getProperty("java.io.tmpdir")); context.setBaseResource(baseResource);
server.setHandler(context); server.setHandler(context);
// Add dump servlet // add hello servlet
context.addServlet(
context.addServlet(DumpServlet.class, "/dump/*"),
"*.dump");
context.addServlet(HelloServlet.class, "/hello/*"); context.addServlet(HelloServlet.class, "/hello/*");
// Add dump servlet on multiple url-patterns
ServletHolder debugHolder = new ServletHolder("debug", DumpServlet.class);
context.addServlet(debugHolder, "/dump/*");
context.addServlet(debugHolder, "*.dump");
// add default servlet (for error handling and static resources)
context.addServlet(DefaultServlet.class, "/"); context.addServlet(DefaultServlet.class, "/");
context.addFilter(TestFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); // sprinkle in a few filters to demonstrate behaviors
context.addFilter(TestFilter.class, "/test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); context.addFilter(TestFilter.class, "/test/*", EnumSet.of(REQUEST));
context.addFilter(TestFilter.class, "*.test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.INCLUDE, DispatcherType.FORWARD)); context.addFilter(TestFilter.class, "*.test", EnumSet.of(REQUEST, ASYNC));
// and a few listeners to show other ways of working with servlets
context.getServletHandler().addListener(new ListenerHolder(InitListener.class)); context.getServletHandler().addListener(new ListenerHolder(InitListener.class));
context.getServletHandler().addListener(new ListenerHolder(RequestListener.class)); context.getServletHandler().addListener(new ListenerHolder(RequestListener.class));
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"));
Server server = createServer(port, new PathResource(tempDir));
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();
@ -71,14 +93,18 @@ public class OneServletContext
public static class TestFilter implements Filter public static class TestFilter implements Filter
{ {
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException public void init(FilterConfig filterConfig)
{ {
} }
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{ {
if (response instanceof HttpServletResponse)
{
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
httpServletResponse.setHeader("X-TestFilter", "true");
}
chain.doFilter(request, response); chain.doFilter(request, response);
} }
@ -94,6 +120,7 @@ public class OneServletContext
@Override @Override
public void contextInitialized(ServletContextEvent sce) public void contextInitialized(ServletContextEvent sce)
{ {
sce.getServletContext().setAttribute("X-Init", "true");
} }
@Override @Override
@ -105,15 +132,14 @@ public class OneServletContext
public static class RequestListener implements ServletRequestListener public static class RequestListener implements ServletRequestListener
{ {
@Override @Override
public void requestDestroyed(ServletRequestEvent sre) public void requestInitialized(ServletRequestEvent sre)
{ {
sre.getServletRequest().setAttribute("X-ReqListener", "true");
} }
@Override @Override
public void requestInitialized(ServletRequestEvent sre) public void requestDestroyed(ServletRequestEvent sre)
{ {
} }
} }
} }

View File

@ -28,9 +28,10 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class OneServletContextJmxStats public class OneServletContextJmxStats
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(8080); Server server = new Server(port);
// Add JMX tracking to Server // Add JMX tracking to Server
server.addBean(new MBeanContainer(ManagementFactory server.addBean(new MBeanContainer(ManagementFactory
.getPlatformMBeanServer())); .getPlatformMBeanServer()));
@ -45,6 +46,13 @@ public class OneServletContextJmxStats
// Add Connector Statistics tracking to all connectors // Add Connector Statistics tracking to all connectors
ServerConnectionStatistics.addToAllConnectors(server); ServerConnectionStatistics.addToAllConnectors(server);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();

View File

@ -18,24 +18,29 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.session.DefaultSessionCache; import org.eclipse.jetty.server.session.DefaultSessionCache;
import org.eclipse.jetty.server.session.NullSessionDataStore; import org.eclipse.jetty.server.session.NullSessionDataStore;
import org.eclipse.jetty.server.session.SessionCache; import org.eclipse.jetty.server.session.SessionCache;
import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
public class OneServletContextWithSession public class OneServletContextWithSession
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, Resource baseResource)
{ {
Server server = new Server(8080); Server server = new Server(port);
// Create a ServletContext, with a session handler enabled. // Create a ServletContext, with a session handler enabled.
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
context.setResourceBase(System.getProperty("java.io.tmpdir")); context.setBaseResource(baseResource);
server.setHandler(context); server.setHandler(context);
// Access the SessionHandler from the context. // Access the SessionHandler from the context.
@ -55,6 +60,15 @@ public class OneServletContextWithSession
// Servlet to read/set the greeting stored in the session. // Servlet to read/set the greeting stored in the session.
// Can be accessed using http://localhost:8080/hello // Can be accessed using http://localhost:8080/hello
context.addServlet(HelloSessionServlet.class, "/"); context.addServlet(HelloSessionServlet.class, "/");
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Path dir = Paths.get(System.getProperty("user.dir"));
PathResource baseResource = new PathResource(dir);
Server server = createServer(port, baseResource);
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();

View File

@ -19,27 +19,20 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import java.lang.management.ManagementFactory;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.Configurations; import org.eclipse.jetty.webapp.Configurations;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebApp public class OneWebApp
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port // Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port, // will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server(8080); Server server = new Server(port);
// Setup JMX
MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer);
// The WebAppContext is the entity that controls the environment in // The WebAppContext is the entity that controls the environment in
// which a web application lives and breathes. In this example the // which a web application lives and breathes. In this example the
@ -56,6 +49,13 @@ public class OneWebApp
// A WebAppContext is a ContextHandler as well so it needs to be set to // A WebAppContext is a ContextHandler as well so it needs to be set to
// the server so it is aware of where to send the appropriate requests. // the server so it is aware of where to send the appropriate requests.
server.setHandler(webapp); server.setHandler(webapp);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
Configurations.setServerDefault(server); Configurations.setServerDefault(server);
@ -66,7 +66,6 @@ public class OneWebApp
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -18,49 +18,45 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory; import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jetty.annotations.AnnotationConfiguration; import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebAppWithJsp public class OneWebAppWithJsp
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws FileNotFoundException
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then // Note that if you set this to port 0 then
// a randomly available port will be assigned that you can either look // a randomly available port will be assigned that you can either look
// in the logs for the port, // in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server(8080); Server server = new Server(port);
// Setup JMX
MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer);
// The WebAppContext is the entity that controls the environment in // The WebAppContext is the entity that controls the environment in
// which a web application lives and // which a web application lives and breathes.
// breathes. In this example the context path is being set to "/" so it // In this example the context path is being set to "/" so it
// is suitable for serving root context // is suitable for serving root context
// requests and then we see it setting the location of the war. A whole // requests and then we see it setting the location of the war.
// host of other configurations are // A whole host of other configurations are
// available, ranging from configuring to support annotation scanning in // available, ranging from configuring to support annotation scanning in
// the webapp (through // the webapp (through PlusConfiguration), to choosing where
// PlusConfiguration) to choosing where the webapp will unpack itself. // the webapp will unpack itself.
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( Path warFile = JettyDistribution.resolve("demo-base/webapps/test.war");
"jetty-distribution/target/distribution/demo-base/webapps/test.war"); if (!Files.exists(warFile))
if (!warFile.exists())
{ {
throw new RuntimeException("Unable to find WAR File: " + warFile.getAbsolutePath()); throw new FileNotFoundException(warFile.toString());
} }
webapp.setWar(warFile.getAbsolutePath()); webapp.setWarResource(new PathResource(warFile));
webapp.setExtractWAR(true); webapp.setExtractWAR(true);
// This webapp will use jsps and jstl. We need to enable the // This webapp will use jsps and jstl. We need to enable the
@ -89,19 +85,32 @@ public class OneWebAppWithJsp
// its own we register it as a bean with the Jetty server object so it // its own we register it as a bean with the Jetty server object so it
// can be started and stopped according to the lifecycle of the server // can be started and stopped according to the lifecycle of the server
// itself. // itself.
String realmResourceName = "etc/realm.properties";
ClassLoader classLoader = OneWebAppWithJsp.class.getClassLoader();
URL realmProps = classLoader.getResource(realmResourceName);
if (realmProps == null)
throw new FileNotFoundException("Unable to find " + realmResourceName);
HashLoginService loginService = new HashLoginService(); HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm"); loginService.setName("Test Realm");
loginService.setConfig("examples/embedded/src/test/resources/realm.properties"); loginService.setConfig(realmProps.toExternalForm());
server.addBean(loginService); server.addBean(loginService);
// Start things up! return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
// Start things up!
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -27,11 +27,13 @@ import org.eclipse.jetty.servlet.ServletHolder;
public class ProxyServer public class ProxyServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(); Server server = new Server();
// Establish listening connector
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8888); connector.setPort(port);
server.addConnector(connector); server.addConnector(connector);
// Setup proxy handler to handle CONNECT methods // Setup proxy handler to handle CONNECT methods
@ -45,6 +47,15 @@ public class ProxyServer
proxyServlet.setInitParameter("blackList", "www.eclipse.org"); proxyServlet.setInitParameter("blackList", "www.eclipse.org");
context.addServlet(proxyServlet, "/*"); context.addServlet(proxyServlet, "/*");
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join();
} }
} }

View File

@ -18,27 +18,29 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.util.Arrays;
import org.eclipse.jetty.rewrite.RewriteCustomizer; import org.eclipse.jetty.rewrite.RewriteCustomizer;
import org.eclipse.jetty.rewrite.handler.CompactPathRule; import org.eclipse.jetty.rewrite.handler.CompactPathRule;
import org.eclipse.jetty.rewrite.handler.RewriteRegexRule; import org.eclipse.jetty.rewrite.handler.RewriteRegexRule;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
public class RewriteServer public class RewriteServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(8080); Server server = new Server(port);
HttpConfiguration config = server.getConnectors()[0].getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();
RewriteCustomizer rewrite = new RewriteCustomizer(); RewriteCustomizer rewrite = new RewriteCustomizer();
config.addCustomizer(rewrite);
rewrite.addRule(new CompactPathRule()); rewrite.addRule(new CompactPathRule());
rewrite.addRule(new RewriteRegexRule("(.*)foo(.*)", "$1FOO$2")); rewrite.addRule(new RewriteRegexRule("(.*)foo(.*)", "$1FOO$2"));
Arrays.stream(server.getConnectors())
.forEach((connector) -> connector.getConnectionFactory(HttpConnectionFactory.class)
.getHttpConfiguration().addCustomizer(rewrite));
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
@ -46,6 +48,14 @@ public class RewriteServer
context.addServlet(DumpServlet.class, "/*"); context.addServlet(DumpServlet.class, "/*");
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -18,6 +18,8 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.FileNotFoundException;
import java.net.URL;
import java.util.Collections; import java.util.Collections;
import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintMapping;
@ -30,13 +32,13 @@ import org.eclipse.jetty.util.security.Constraint;
public class SecuredHelloHandler public class SecuredHelloHandler
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws FileNotFoundException
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port // Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port, // will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server(8080); Server server = new Server(port);
// Since this example is for our test webapp, we need to setup a // Since this example is for our test webapp, we need to setup a
// LoginService so this shows how to create a very simple hashmap based // LoginService so this shows how to create a very simple hashmap based
@ -46,8 +48,14 @@ public class SecuredHelloHandler
// started and stopped according to the lifecycle of the server itself. // started and stopped according to the lifecycle of the server itself.
// In this example the name can be whatever you like since we are not // In this example the name can be whatever you like since we are not
// dealing with webapp realms. // dealing with webapp realms.
String realmResourceName = "etc/realm.properties";
ClassLoader classLoader = SecuredHelloHandler.class.getClassLoader();
URL realmProps = classLoader.getResource(realmResourceName);
if (realmProps == null)
throw new FileNotFoundException("Unable to find " + realmResourceName);
LoginService loginService = new HashLoginService("MyRealm", LoginService loginService = new HashLoginService("MyRealm",
"src/test/resources/realm.properties"); realmProps.toExternalForm());
server.addBean(loginService); server.addBean(loginService);
// A security handler is a jetty handler that secures content behind a // A security handler is a jetty handler that secures content behind a
@ -68,7 +76,7 @@ public class SecuredHelloHandler
constraint.setRoles(new String[]{"user", "admin"}); constraint.setRoles(new String[]{"user", "admin"});
// Binds a url pattern with the previously created constraint. The roles // Binds a url pattern with the previously created constraint. The roles
// for this constraing mapping are mined from the Constraint itself // for this constraint mapping are mined from the Constraint itself
// although methods exist to declare and bind roles separately as well. // although methods exist to declare and bind roles separately as well.
ConstraintMapping mapping = new ConstraintMapping(); ConstraintMapping mapping = new ConstraintMapping();
mapping.setPathSpec("/*"); mapping.setPathSpec("/*");
@ -92,13 +100,19 @@ public class SecuredHelloHandler
// chain the hello handler into the security handler // chain the hello handler into the security handler
security.setHandler(hh); security.setHandler(hh);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
// Start things up! // Start things up!
server.start(); server.start();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See
// http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -19,6 +19,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.net.URL;
import javax.naming.NamingException;
import org.eclipse.jetty.annotations.AnnotationConfiguration; import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.plus.jndi.EnvEntry; import org.eclipse.jetty.plus.jndi.EnvEntry;
@ -36,10 +39,10 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/ */
public class ServerWithAnnotations public class ServerWithAnnotations
{ {
public static final void main(String[] args) throws Exception public static Server createServer(int port) throws NamingException, FileNotFoundException
{ {
// Create the server // Create the server
final Server server = new Server(8080); Server server = new Server(port);
// Create a WebApp // Create a WebApp
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
@ -60,7 +63,7 @@ public class ServerWithAnnotations
new Transaction(new com.acme.MockUserTransaction()); new Transaction(new com.acme.MockUserTransaction());
// Define an env entry with webapp scope. // Define an env entry with webapp scope.
// THIS ENTRY IS OVERRIDEN BY THE ENTRY IN jetty-env.xml // THIS ENTRY IS OVERRIDDEN BY THE ENTRY IN jetty-env.xml
new EnvEntry(webapp, "maxAmount", 100d, true); new EnvEntry(webapp, "maxAmount", 100d, true);
// Register a mock DataSource scoped to the webapp // Register a mock DataSource scoped to the webapp
@ -70,10 +73,23 @@ public class ServerWithAnnotations
server.addBean(new NamingDump()); server.addBean(new NamingDump());
// Configure a LoginService // Configure a LoginService
String realmResourceName = "etc/realm.properties";
ClassLoader classLoader = ServerWithAnnotations.class.getClassLoader();
URL realmProps = classLoader.getResource(realmResourceName);
if (realmProps == null)
throw new FileNotFoundException("Unable to find " + realmResourceName);
HashLoginService loginService = new HashLoginService(); HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm"); loginService.setName("Test Realm");
loginService.setConfig("examples/embedded/src/test/resources/realm.properties"); loginService.setConfig(realmProps.toExternalForm());
server.addBean(loginService); server.addBean(loginService);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();

View File

@ -19,6 +19,7 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import javax.management.remote.JMXServiceURL; import javax.management.remote.JMXServiceURL;
import org.eclipse.jetty.jmx.ConnectorServer; import org.eclipse.jetty.jmx.ConnectorServer;
@ -26,17 +27,16 @@ import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
/** /**
* The simplest possible Jetty server. * A Jetty Server with JMX enabled for remote connections
*/ */
public class ServerWithJMX public class ServerWithJMX
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws MalformedURLException
{ {
// === jetty-jmx.xml === Server server = new Server(port);
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
Server server = new Server(8080);
server.addBean(mbContainer); server.addBean(mbContainer);
ConnectorServer jmx = new ConnectorServer( ConnectorServer jmx = new ConnectorServer(
@ -48,6 +48,14 @@ public class ServerWithJMX
"org.eclipse.jetty.jmx:name=rmiconnectorserver"); "org.eclipse.jetty.jmx:name=rmiconnectorserver");
server.addBean(jmx); server.addBean(jmx);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -18,12 +18,14 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.nio.file.Path;
import java.util.Properties; import java.util.Properties;
import javax.naming.NamingException;
import org.eclipse.jetty.plus.webapp.EnvConfiguration; import org.eclipse.jetty.plus.webapp.EnvConfiguration;
import org.eclipse.jetty.plus.webapp.PlusConfiguration; import org.eclipse.jetty.plus.webapp.PlusConfiguration;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
/** /**
@ -31,18 +33,16 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/ */
public class ServerWithJNDI public class ServerWithJNDI
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws NamingException
{ {
// Create the server // Create the server
Server server = new Server(8080); Server server = new Server(port);
// Create a WebApp // Create a WebApp
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( Path testJndiWar = JettyDistribution.resolve("demo-base/webapps/test-jndi.war");
"../../jetty-distribution/target/distribution/demo-base/webapps/test-jndi.war"); webapp.setWarResource(new PathResource(testJndiWar));
webapp.setWar(warFile.getAbsolutePath());
server.setHandler(webapp); server.setHandler(webapp);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
@ -74,7 +74,7 @@ public class ServerWithJNDI
// Note that the last arg of "true" means that this definition for // Note that the last arg of "true" means that this definition for
// "wiggle" would override an entry of the // "wiggle" would override an entry of the
// same name in web.xml // same name in web.xml
new org.eclipse.jetty.plus.jndi.EnvEntry(webapp, "wiggle", 100D, true); new org.eclipse.jetty.plus.jndi.EnvEntry(webapp, "wiggle", 100d, true);
// Register a reference to a mail service scoped to the webapp. // Register a reference to a mail service scoped to the webapp.
// This must be linked to the webapp by an entry in web.xml: // This must be linked to the webapp by an entry in web.xml:
@ -84,7 +84,8 @@ public class ServerWithJNDI
// <res-auth>Container</res-auth> // <res-auth>Container</res-auth>
// </resource-ref> // </resource-ref>
// At runtime the webapp accesses this as java:comp/env/mail/Session // At runtime the webapp accesses this as java:comp/env/mail/Session
org.eclipse.jetty.jndi.factories.MailSessionReference mailref = new org.eclipse.jetty.jndi.factories.MailSessionReference(); org.eclipse.jetty.jndi.factories.MailSessionReference mailref =
new org.eclipse.jetty.jndi.factories.MailSessionReference();
mailref.setUser("CHANGE-ME"); mailref.setUser("CHANGE-ME");
mailref.setPassword("CHANGE-ME"); mailref.setPassword("CHANGE-ME");
Properties props = new Properties(); Properties props = new Properties();
@ -106,6 +107,13 @@ public class ServerWithJNDI
// java:comp/env/jdbc/mydatasource // java:comp/env/jdbc/mydatasource
new org.eclipse.jetty.plus.jndi.Resource( new org.eclipse.jetty.plus.jndi.Resource(
webapp, "jdbc/mydatasource", new com.acme.MockDataSource()); webapp, "jdbc/mydatasource", new com.acme.MockDataSource());
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();

View File

@ -25,11 +25,20 @@ import org.eclipse.jetty.server.Server;
*/ */
public class SimplestServer public class SimplestServer
{ {
public static Server createServer(int port)
{
Server server = new Server(port);
// This has a connector listening on port specified
// and no handlers, meaning all requests will result
// in a 404 response
return server;
}
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -18,16 +18,14 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.nio.file.Paths;
import org.eclipse.jetty.server.Connector;
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.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
/** /**
@ -37,59 +35,68 @@ import org.eclipse.jetty.util.resource.Resource;
*/ */
public class SplitFileServer public class SplitFileServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port, Resource baseResource0, Resource baseResource1)
{ {
// Create the Server object and a corresponding ServerConnector and then // Create the Server object and a corresponding ServerConnector and then
// set the port for the connector. In this example the server will // set the port for the connector. In this example the server will
// listen on port 8090. If you set this to port 0 then when the server // listen on port 8080. If you set this to port 0 then when the server
// has been started you can called connector.getLocalPort() to // has been started you can called connector.getLocalPort() to
// programmatically get the port the server started on. // programmatically get the port the server started on.
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8090); connector.setPort(port);
server.setConnectors(new Connector[]{connector}); server.addConnector(connector);
// Create a Context Handler and ResourceHandler. The ContextHandler is // Create a Context Handler and ResourceHandler. The ContextHandler is
// getting set to "/" path but this could be anything you like for // getting set to "/" path but this could be anything you like for
// builing out your url. Note how we are setting the ResourceBase using // building out your url. Note how we are setting the ResourceBase using
// our jetty maven testing utilities to get the proper resource // our jetty maven testing utilities to get the proper resource
// directory, you needn't use these, you simply need to supply the paths // directory, you needn't use these, you simply need to supply the paths
// you are looking to serve content from. // you are looking to serve content from.
ResourceHandler rh0 = new ResourceHandler(); ResourceHandler rh0 = new ResourceHandler();
rh0.setDirectoriesListed(false);
ContextHandler context0 = new ContextHandler(); ContextHandler context0 = new ContextHandler();
context0.setContextPath("/"); context0.setContextPath("/");
File dir0 = MavenTestingUtils.getTestResourceDir("dir0"); context0.setBaseResource(baseResource0);
context0.setBaseResource(Resource.newResource(dir0));
context0.setHandler(rh0); context0.setHandler(rh0);
// Rinse and repeat the previous item, only specifying a different // Rinse and repeat the previous item, only specifying a different
// resource base. // resource base.
ResourceHandler rh1 = new ResourceHandler(); ResourceHandler rh1 = new ResourceHandler();
rh1.setDirectoriesListed(false);
ContextHandler context1 = new ContextHandler(); ContextHandler context1 = new ContextHandler();
context1.setContextPath("/"); context1.setContextPath("/");
File dir1 = MavenTestingUtils.getTestResourceDir("dir1"); context1.setBaseResource(baseResource1);
context1.setBaseResource(Resource.newResource(dir1));
context1.setHandler(rh1); context1.setHandler(rh1);
// Create a ContextHandlerCollection and set the context handlers to it. // Create a ContextHandlerCollection and set the context handlers to it.
// This will let jetty process urls against the declared contexts in // This will let jetty process urls against the declared contexts in
// order to match up content. // order to match up content.
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection(
contexts.setHandlers(new Handler[]{context0, context1}); context0, context1
);
server.setHandler(contexts); server.setHandler(contexts);
return server;
}
// Start things up! public static void main(String[] args) throws Exception
server.start(); {
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Resource resource0 = new PathResource(Paths.get("src/test/resources/dir0"));
Resource resource1 = new PathResource(Paths.get("src/test/resources/dir1"));
Server server = createServer(port, resource0, resource1);
// Dump the server state // Dump the server state
System.out.println(server.dump()); server.setDumpAfterStart(true);
// Start things up!
server.start();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -26,7 +26,7 @@ import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServletContainerInitializer; import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer;
/** /**
* Example of setting up a javax.websocket server with Jetty embedded * Example of setting up a javax.websocket server with Jetty embedded
@ -46,25 +46,37 @@ public class WebSocketJsrServer
} }
} }
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
final Server server = new Server(8080); Server server = new Server(port);
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
ServletContextHandler contextHandler = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler();
ServletContextHandler.SESSIONS); context.setContextPath("/");
contextHandler.setContextPath("/"); handlers.addHandler(context);
handlers.addHandler(contextHandler);
// Enable javax.websocket configuration for the context
JavaxWebSocketServletContainerInitializer.configure(context,
(servletContext, serverContainer) ->
{
// Add your websocket to the javax.websocket.server.ServerContainer
serverContainer.addEndpoint(EchoJsrSocket.class);
}
);
handlers.addHandler(new DefaultHandler()); handlers.addHandler(new DefaultHandler());
server.setHandler(handlers); server.setHandler(handlers);
// Enable javax.websocket configuration for the context return server;
JavaxWebSocketServletContainerInitializer.configure(contextHandler, (context, container) -> }
container.addEndpoint(EchoJsrSocket.class));
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
contextHandler.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -20,13 +20,13 @@ package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WriteCallback; import org.eclipse.jetty.websocket.api.WriteCallback;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.server.JettyWebSocketServlet; import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory; import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
/** /**
* Example of setting up a Jetty WebSocket server * Example of setting up a Jetty WebSocket server
@ -61,20 +61,29 @@ public class WebSocketServer
} }
} }
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(8080); Server server = new Server(port);
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler();
ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
server.setHandler(context); server.setHandler(context);
// Add the echo socket servlet to the /echo path map // Add the echo socket servlet to the /echo path map
context.addServlet(new ServletHolder(EchoServlet.class), "/echo"); context.addServlet(EchoServlet.class, "/echo");
// Configure context to support WebSocket
JettyWebSocketServletContainerInitializer.configure(context, null);
return server;
}
public static void main(String[] args) throws Exception
{
int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
Server server = createServer(port);
server.start(); server.start();
context.dumpStdErr();
server.join(); server.join();
} }
} }

Binary file not shown.

View File

@ -0,0 +1,20 @@
Bag Attributes
friendlyName: jetty
localKeyID: 54 69 6D 65 20 31 34 32 33 31 39 38 30 39 33 31 31 35
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIPh4Q0t4xklXTzX
N2VAb47r5n7idAupp4CTNEhhT6lS70iA+A8i4+0lSEHWAogvd9jl3H7SvScr30QM
4ieC0JCGSOwGc8f+yqKrO56PPd5OuqW380BJ0r74jJczU9CcsuavHD7e6mRLUnmj
xM20NSxrcicMiPUHY1mJZtN9swtxAgMBAAECgYADS9P6Jll0uXBZIu/pgfDH27GJ
HlPULstW9VbrMDNzgfUlFMQebLrRpIrnyleJ29Xc//HA4beEkR4lb0T/w88+pEkt
7fhYeqRLPIfpDOgzloynnsoPcd8f/PypbimQrNLmBiG1178nVcy4Yoh5lYVIJwtU
3VriqDlvAfTLrrx8AQJBAMLWuh27Hb8xs3LRg4UD7hcv8tJejstm08Y+czRz7cO0
RENa3aDjGFSegc+IUfdez7BP8uDw+PwE+jybmTvaliECQQCtR/anCY1WS28/bKvy
lmIwoI15eraBdVFkN0Hfxh+9PfR3rMD5uyvukT5GgTtY/XxADyafSTaipDJiZHJI
EitRAkBjeCBYYVjUbVlBuvi8Bb+dktsSzzdzXDGtueAy3SR7jyJyiIcxRf775Fg9
TUkbUwoQ5yAF+sACWcAvBPj796JBAkAEZEeHEkHnxv+pztpIyrDwZJFRW9/WRh/q
90+PGVlilXhltBYr/idt43Z9mPblGX+VrAyhitx8oMa6IauX0gYRAkEAgnyVeXrD
jDLUZRA3P8Gu27k1k6GjbTYiUz3HKCz2/6+MZ2MK2qqwafgqocji029Q6dHdPD7a
4QnRlvraUnyQLA==
-----END PRIVATE KEY-----

View File

@ -0,0 +1,20 @@
#
# This file defines users passwords and roles for a HashUserRealm
#
# The format is
# <username>: <password>[,<rolename> ...]
#
# Passwords may be clear text, obfuscated or checksummed. The class
# org.eclipse.jetty.util.security.Password should be used to generate obfuscated
# passwords or password checksums
#
# If DIGEST Authentication is used, the password must be in a recoverable
# format, either plain text or OBF:.
#
jetty:MD5:164c88b302622e17050af52c89945d44,user
admin:CRYPT:adpexzg3FUZAk,server-administrator,content-administrator,admin,user
other:OBF:1xmk1w261u9r1w1c1xmq,user
plain:plain,user
user:password,user
# This entry is for digest auth. The credential is a MD5 hash of username:realmname:password
digest:MD5:6e120743ad67abfbc385bc2bb754e297,user

View File

@ -8,7 +8,9 @@
<Item> <Item>
<New class="org.eclipse.jetty.server.ServerConnector"> <New class="org.eclipse.jetty.server.ServerConnector">
<Arg><Ref refid="ExampleServer"/></Arg> <Arg><Ref refid="ExampleServer"/></Arg>
<Set name="port">8080</Set> <Set name="port">
<Property name="http.port" default="8080" />
</Set>
</New> </New>
</Item> </Item>
</Array> </Array>

View File

@ -7,7 +7,9 @@
<Arg> <Arg>
<New class="org.eclipse.jetty.server.ServerConnector"> <New class="org.eclipse.jetty.server.ServerConnector">
<Arg><Ref refid="FileServer"/></Arg> <Arg><Ref refid="FileServer"/></Arg>
<Set name="port">8080</Set> <Set name="port">
<Property name="http.port" default="8080" />
</Set>
</New> </New>
</Arg> </Arg>
</Call> </Call>
@ -22,7 +24,9 @@
<Set name="welcomeFiles"> <Set name="welcomeFiles">
<Array type="String"><Item>index.html</Item></Array> <Array type="String"><Item>index.html</Item></Array>
</Set> </Set>
<Set name="resourceBase">.</Set> <Set name="resourceBase">
<Property name="fileserver.baseresource" default="." />
</Set>
</New> </New>
</Item> </Item>
<Item> <Item>

View File

@ -0,0 +1,64 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
public abstract class AbstractEmbeddedTest
{
public HttpClient client;
@BeforeEach
public void startClient() throws Exception
{
SslContextFactory.Client sslContextFactory = new SslContextFactory.Client();
sslContextFactory.setTrustAll(true);
ClientConnector clientConnector = new ClientConnector();
clientConnector.setSelectors(1);
clientConnector.setSslContextFactory(sslContextFactory);
QueuedThreadPool clientThreads = new QueuedThreadPool();
clientThreads.setName("client");
clientConnector.setExecutor(clientThreads);
client = new HttpClient(new HttpClientTransportOverHTTP(clientConnector));
client.start();
}
@AfterEach
public void stopClient() throws Exception
{
client.stop();
}
protected void dumpResponseHeaders(ContentResponse response)
{
System.out.printf("%s %s %s%n", response.getVersion(), response.getStatus(), response.getReason());
System.out.println(response.getHeaders());
}
}

View File

@ -0,0 +1,90 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.util.StringContentProvider;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ExampleServerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ExampleServer.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
@Test
public void testGetEcho() throws Exception
{
URI uri = server.getURI().resolve("/echo/a/greeting");
String postBody = "Greetings from " + ExampleServerTest.class;
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.POST)
.content(new StringContentProvider(postBody))
.send();
// Check the response status code
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString(postBody));
}
}

View File

@ -0,0 +1,67 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ExampleServerXmlTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ExampleServerXml.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,92 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.io.BufferedWriter;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@ExtendWith(WorkDirExtension.class)
public class FastFileServerTest extends AbstractEmbeddedTest
{
private static final String TEXT_CONTENT = "I am an old man and I have known a great " +
"many troubles, but most of them never happened. - Mark Twain";
public WorkDir workDir;
private Server server;
@BeforeEach
public void startServer() throws Exception
{
Path baseDir = workDir.getEmptyPathDir();
Path textFile = baseDir.resolve("simple.txt");
try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
{
writer.write(TEXT_CONTENT);
}
server = FastFileServer.createServer(0, baseDir.toFile());
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetSimpleText() throws Exception
{
URI uri = server.getURI().resolve("/simple.txt");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
HttpFields responseHeaders = response.getHeaders();
assertThat("Content-Type", responseHeaders.get("Content-Type"), is("text/plain"));
assertThat("Content-Length", responseHeaders.getLongField("Content-Length"),
is((long)TEXT_CONTENT.length()));
// test response content
String responseBody = response.getContentAsString();
assertThat("Response body", responseBody, is(TEXT_CONTENT));
}
}

View File

@ -0,0 +1,93 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.io.BufferedWriter;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.eclipse.jetty.util.resource.PathResource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@ExtendWith(WorkDirExtension.class)
public class FileServerTest extends AbstractEmbeddedTest
{
private static final String TEXT_CONTENT = "I am an old man and I have known a great " +
"many troubles, but most of them never happened. - Mark Twain";
public WorkDir workDir;
private Server server;
@BeforeEach
public void startServer() throws Exception
{
Path baseDir = workDir.getEmptyPathDir();
Path textFile = baseDir.resolve("simple.txt");
try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
{
writer.write(TEXT_CONTENT);
}
server = FileServer.createServer(0, new PathResource(baseDir));
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetSimpleText() throws Exception
{
URI uri = server.getURI().resolve("/simple.txt");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
HttpFields responseHeaders = response.getHeaders();
assertThat("Content-Type", responseHeaders.get("Content-Type"), is("text/plain"));
assertThat("Content-Length", responseHeaders.getLongField("Content-Length"),
is((long)TEXT_CONTENT.length()));
// test response content
String responseBody = response.getContentAsString();
assertThat("Response body", responseBody, is(TEXT_CONTENT));
}
}

View File

@ -0,0 +1,92 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.io.BufferedWriter;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@ExtendWith(WorkDirExtension.class)
public class FileServerXmlTest extends AbstractEmbeddedTest
{
private static final String TEXT_CONTENT = "I am an old man and I have known a great " +
"many troubles, but most of them never happened. - Mark Twain";
public WorkDir workDir;
private Server server;
@BeforeEach
public void startServer() throws Exception
{
Path baseDir = workDir.getEmptyPathDir();
Path textFile = baseDir.resolve("simple.txt");
try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
{
writer.write(TEXT_CONTENT);
}
server = FileServerXml.createServer(0, baseDir);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetSimpleText() throws Exception
{
URI uri = server.getURI().resolve("/simple.txt");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
HttpFields responseHeaders = response.getHeaders();
assertThat("Content-Type", responseHeaders.get("Content-Type"), is("text/plain"));
assertThat("Content-Length", responseHeaders.getLongField("Content-Length"),
is((long)TEXT_CONTENT.length()));
// test response content
String responseBody = response.getContentAsString();
assertThat("Response body", responseBody, is(TEXT_CONTENT));
}
}

View File

@ -0,0 +1,83 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class JarServerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = JarServer.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetDir0Test0() throws Exception
{
URI uri = server.getURI().resolve("/dir0/test0.txt");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("test0"));
}
@Test
public void testGetDir1Test1() throws Exception
{
URI uri = server.getURI().resolve("/dir1/test1.txt");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("test1"));
}
}

View File

@ -0,0 +1,97 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.util.Map;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class LikeJettyXmlTest extends AbstractEmbeddedTest
{
private Server server;
private URI serverPlainUri;
private URI serverSslUri;
@BeforeEach
public void startServer() throws Exception
{
assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
server = LikeJettyXml.createServer(0, 0, false);
server.start();
Map<String, Integer> ports = ServerUtil.fixDynamicPortConfigurations(server);
// Establish base URI's that use "localhost" to prevent tripping over
// the "REMOTE ACCESS" warnings in demo-base
serverPlainUri = URI.create("http://localhost:" + ports.get("plain") + "/");
serverSslUri = URI.create("https://localhost:" + ports.get("secure") + "/");
}
@AfterEach
public void stopServer() throws Exception
{
LifeCycle.stop(server);
}
@Test
public void testGetTest() throws Exception
{
URI uri = serverPlainUri.resolve("/test/");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
@Test
public void testGetTestSsl() throws Exception
{
URI uri = serverSslUri.resolve("/test/");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,95 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.util.Map;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ManyConnectorsTest extends AbstractEmbeddedTest
{
private Server server;
private URI serverPlainUri;
private URI serverSslUri;
@BeforeEach
public void startServer() throws Exception
{
server = ManyConnectors.createServer(0, 0);
server.start();
Map<String, Integer> ports = ServerUtil.fixDynamicPortConfigurations(server);
// Establish base URI's that use "localhost" to prevent tripping over
// the "REMOTE ACCESS" warnings in demo-base
serverPlainUri = URI.create("http://localhost:" + ports.get("plain") + "/");
serverSslUri = URI.create("https://localhost:" + ports.get("secure") + "/");
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testPlainGetHello() throws Exception
{
URI uri = serverPlainUri.resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
@Test
public void testSecureGetHello() throws Exception
{
URI uri = serverSslUri.resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,117 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ManyContextsTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ManyContexts.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetRootHello() throws Exception
{
URI uri = server.getURI().resolve("/");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Root Hello"));
}
@Test
public void testGetFrenchHello() throws Exception
{
URI uri = server.getURI().resolve("/fr");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Bonjour"));
}
@Test
public void testGetItalianGoodMorning() throws Exception
{
URI uri = server.getURI().resolve("/it");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Buongiorno"));
}
@Test
public void testGetVirtualHostHello() throws Exception
{
int port = server.getURI().getPort();
URI uri = URI.create("http://127.0.0.2:" + port + "/");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Virtual Hello"));
}
}

View File

@ -0,0 +1,105 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.util.Map;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.ajax.JSON;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ManyHandlersTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ManyHandlers.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetParams() throws Exception
{
URI uri = server.getURI().resolve("/params?a=b&foo=bar");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.header(HttpHeader.ACCEPT_ENCODING, "gzip")
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test gzip
// Test that Gzip was used to produce the response
String contentEncoding = response.getHeaders().get(HttpHeader.CONTENT_ENCODING);
assertThat("Content-Encoding", contentEncoding, containsString("gzip"));
// test response content
String responseBody = response.getContentAsString();
Object jsonObj = JSON.parse(responseBody);
Map jsonMap = (Map)jsonObj;
assertThat("Response JSON keys.size", jsonMap.keySet().size(), is(2));
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.header(HttpHeader.ACCEPT_ENCODING, "gzip")
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test gzip
// Test that Gzip was used to produce the response
String contentEncoding = response.getHeaders().get(HttpHeader.CONTENT_ENCODING);
assertThat("Content-Encoding", contentEncoding, containsString("gzip"));
// test expected header from wrapper
String welcome = response.getHeaders().get("X-Welcome");
assertThat("X-Welcome header", welcome, containsString("Greetings from WelcomeWrapHandler"));
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,115 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ManyServletContextsTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ManyServletContexts.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
@Test
public void testGetItalianHello() throws Exception
{
URI uri = server.getURI().resolve("/it/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Ciao"));
}
@Test
public void testGetFrenchHello() throws Exception
{
URI uri = server.getURI().resolve("/fr/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Bonjour"));
}
@Test
public void testGetOtherYo() throws Exception
{
URI uri = server.getURI().resolve("/other/hello.yo");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("YO!"));
}
}

View File

@ -0,0 +1,67 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class MinimalServletsTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = MinimalServlets.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,67 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class OneConnectorTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = OneConnector.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,67 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class OneContextTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = OneContext.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,67 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class OneHandlerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = OneHandler.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
}

View File

@ -0,0 +1,101 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.io.ConnectionStatistics;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.opentest4j.AssertionFailedError;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
@ExtendWith(WorkDirExtension.class)
public class OneServletContextJmxStatsTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = OneServletContextJmxStats.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetDumpViaPathInfo() throws Exception
{
URI uri = server.getURI().resolve("/dump/something");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody,
allOf(
containsString("DumpServlet"),
containsString("servletPath=/dump"),
containsString("pathInfo=/something")
)
);
}
@Test
public void testJmxConnectStatsPresent() throws Exception
{
MBeanContainer mbeanContainer = server.getBean(MBeanContainer.class);
MBeanServer mbeanServer = mbeanContainer.getMBeanServer();
String domain = ConnectionStatistics.class.getPackage().getName();
Set<ObjectName> mbeanNames = mbeanServer.queryNames(ObjectName.getInstance(domain + ":type=connectionstatistics,*"), null);
ObjectName connStatsName = mbeanNames.stream().findFirst().orElseThrow(AssertionFailedError::new);
ObjectInstance mbeanConnStats = mbeanServer.getObjectInstance(connStatsName);
Number connections = (Number)mbeanServer.getAttribute(connStatsName, "connections");
assertThat("stats[connections]", connections, is(notNullValue()));
assertThat("stats[connections]", connections.longValue(), greaterThanOrEqualTo(0L));
}
}

View File

@ -0,0 +1,158 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.io.BufferedWriter;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.eclipse.jetty.util.resource.PathResource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
@ExtendWith(WorkDirExtension.class)
public class OneServletContextTest extends AbstractEmbeddedTest
{
private static final String TEXT_CONTENT = "The secret of getting ahead is getting started. - Mark Twain";
public WorkDir workDir;
private Server server;
@BeforeEach
public void startServer() throws Exception
{
Path baseDir = workDir.getEmptyPathDir();
Path textFile = baseDir.resolve("simple.txt");
try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
{
writer.write(TEXT_CONTENT);
}
server = OneServletContext.createServer(0, new PathResource(baseDir));
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/hello/there");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hello"));
}
@Test
public void testGetDumpViaPathInfo() throws Exception
{
URI uri = server.getURI().resolve("/dump/something");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody,
allOf(
containsString("DumpServlet"),
containsString("servletPath=/dump"),
containsString("pathInfo=/something")
)
);
}
@Test
public void testGetDumpSuffix() throws Exception
{
URI uri = server.getURI().resolve("/another.dump");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody,
allOf(
containsString("DumpServlet"),
containsString("servletPath=/another.dump"),
containsString("pathInfo=null")
)
);
}
@Test
public void testGetTestDumpSuffix() throws Exception
{
URI uri = server.getURI().resolve("/test/another.dump");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
String filterResponseHeader = response.getHeaders().get("X-TestFilter");
assertThat("X-TestFilter header", filterResponseHeader, is("true"));
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody,
allOf(
containsString("DumpServlet"),
containsString("servletPath=/test/another.dump"),
containsString("pathInfo=null"),
containsString("request.attribute[X-ReqListener]=true"),
containsString("servletContext.attribute[X-Init]=true")
)
);
}
}

View File

@ -0,0 +1,95 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.io.BufferedWriter;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.eclipse.jetty.util.resource.PathResource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
@ExtendWith(WorkDirExtension.class)
public class OneServletContextWithSessionTest extends AbstractEmbeddedTest
{
private static final String TEXT_CONTENT = "Do the right thing. It will gratify some people and astonish the rest. - Mark Twain";
public WorkDir workDir;
private Server server;
@BeforeEach
public void startServer() throws Exception
{
Path baseDir = workDir.getEmptyPathDir();
Path textFile = baseDir.resolve("simple.txt");
try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
{
writer.write(TEXT_CONTENT);
}
server = OneServletContextWithSession.createServer(0, new PathResource(baseDir));
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetHello() throws Exception
{
URI uri = server.getURI().resolve("/");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
String setCookieValue = response.getHeaders().get(HttpHeader.SET_COOKIE);
assertThat("Set-Cookie value", setCookieValue, containsString("JSESSIONID="));
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody,
allOf(
containsString("session.getId() = "),
containsString("session.isNew() = true")
)
);
}
}

View File

@ -0,0 +1,71 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class OneWebAppTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
server = OneWebApp.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
LifeCycle.stop(server);
}
@Test
public void testGetAsyncRest() throws Exception
{
URI uri = server.getURI().resolve("/testAsync?items=mouse,beer,gnome");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Asynchronous: mouse,beer,gnome"));
}
}

View File

@ -0,0 +1,112 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class OneWebAppWithJspTest extends AbstractEmbeddedTest
{
private Server server;
private URI serverLocalUri;
@BeforeEach
public void startServer() throws Exception
{
assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
server = OneWebAppWithJsp.createServer(0);
server.start();
// Use URI based on "localhost" to get past "REMOTE ACCESS!" protection of demo war
serverLocalUri = URI.create("http://localhost:" + server.getURI().getPort() + "/");
}
@AfterEach
public void stopServer() throws Exception
{
LifeCycle.stop(server);
}
@Test
public void testGetDumpInfo() throws Exception
{
URI uri = serverLocalUri.resolve("/dump/info");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("getProtocol:&nbsp;</th><td>HTTP/1.1"));
}
@Test
public void testGetJspExpr() throws Exception
{
URI uri = serverLocalUri.resolve("/jsp/expr.jsp?A=1");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
String userAgent = client.getUserAgentField().getValue();
assertThat("Response Content", responseBody, containsString("<td>" + userAgent + "</td>"));
}
@Test
public void testGetJstlExpr() throws Exception
{
URI uri = serverLocalUri.resolve("/jsp/jstl.jsp");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("<h1>JSTL Example</h1>"));
for (int i = 1; i <= 10; i++)
{
assertThat("Reponse content (counting)", responseBody, containsString("" + i));
}
}
}

View File

@ -0,0 +1,72 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.HttpProxy;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class ProxyServerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ProxyServer.createServer(0);
server.start();
URI uri = server.getURI();
client.getProxyConfiguration().getProxies().add(new HttpProxy("localhost", uri.getPort()));
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetProxiedRFC() throws Exception
{
URI uri = URI.create("https://tools.ietf.org/rfc/rfc7230.txt");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing"));
}
}

View File

@ -0,0 +1,83 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class RewriteServerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = RewriteServer.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetRewriteFooInName() throws Exception
{
URI uri = server.getURI().resolve("/do-be-foo-be-do");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("requestURI=/do-be-FOO-be-do"));
}
@Test
public void testGetRewriteFooInPath() throws Exception
{
URI uri = server.getURI().resolve("/do/be/foo/be/do.it");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("requestURI=/do/be/FOO/be/do.it"));
}
}

View File

@ -0,0 +1,85 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.util.Base64;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class SecuredHelloHandlerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = SecuredHelloHandler.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetWithoutAuth() throws Exception
{
URI uri = server.getURI().resolve("/hello");
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.UNAUTHORIZED_401));
// dumpResponseHeaders(response);
}
@Test
public void testGetWithAuth() throws Exception
{
URI uri = server.getURI().resolve("/hello");
String authEncoded = Base64.getEncoder().encodeToString("user:password".getBytes(UTF_8));
ContentResponse response = client.newRequest(uri)
.method(HttpMethod.GET)
.header(HttpHeader.AUTHORIZATION, "Basic " + authEncoded)
.send();
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("<h1>Hello World</h1>"));
}
}

View File

@ -0,0 +1,88 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
public class ServerUtil
{
/**
* Fix the HttpConfiguration entries for securePort after the dynamic ports have been bound.
*
* @param server the server to correct.
*/
public static Map<String, Integer> fixDynamicPortConfigurations(Server server)
{
// Fix ports in HttpConfiguration (since we are using dynamic port assignment for this testcase)
HttpConfiguration plainHttpConfiguration = null;
HttpConfiguration secureHttpConfiguration = null;
int plainHttpPort = -1;
int secureHttpPort = -1;
for (Connector connector : server.getConnectors())
{
if (connector instanceof ServerConnector)
{
ServerConnector serverConnector = (ServerConnector)connector;
SslConnectionFactory sslConnectionFactory = serverConnector.getConnectionFactory(SslConnectionFactory.class);
HttpConnectionFactory httpConnectionFactory = serverConnector.getConnectionFactory(HttpConnectionFactory.class);
if (httpConnectionFactory != null)
{
HttpConfiguration configuration = httpConnectionFactory.getHttpConfiguration();
if (sslConnectionFactory != null)
{
secureHttpConfiguration = configuration;
secureHttpPort = serverConnector.getLocalPort();
}
else
{
plainHttpConfiguration = configuration;
plainHttpPort = serverConnector.getLocalPort();
}
}
}
}
assertNotNull(plainHttpConfiguration, "Plain HTTP Configuration");
assertNotEquals(plainHttpPort, -1, "Dynamic Plain HTTP Port");
assertNotNull(secureHttpConfiguration, "Secure HTTP Configuration");
assertNotEquals(secureHttpPort, -1, "Dynamic Secure Port");
plainHttpConfiguration.setSecurePort(secureHttpPort);
secureHttpConfiguration.setSecurePort(secureHttpPort);
Map<String, Integer> ports = new HashMap<>();
ports.put("plain", plainHttpPort);
ports.put("secure", secureHttpPort);
return ports;
}
}

View File

@ -0,0 +1,70 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class ServerWithAnnotationsTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
server = ServerWithAnnotations.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
LifeCycle.stop(server);
}
@Test
public void testGetTest() throws Exception
{
URI uri = server.getURI().resolve("/test");
ContentResponse response = client.GET(uri);
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("maxAmount=55.0"));
assertThat("Response Content", responseBody, not(containsString("<span class=\"fail\">")));
}
}

View File

@ -0,0 +1,62 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.util.Optional;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ServerWithJMXTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = ServerWithJMX.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetTest() throws Exception
{
MBeanContainer mbeanContainer = server.getBean(MBeanContainer.class);
MBeanServer mbeanServer = mbeanContainer.getMBeanServer();
String name = "org.eclipse.jetty.jmx:name=rmiconnectorserver,*";
Set<ObjectName> mbeanNames = mbeanServer.queryNames(ObjectName.getInstance(name), null);
Optional<ObjectName> rmiConnectorNameOptional = mbeanNames.stream().findFirst();
assertTrue(rmiConnectorNameOptional.isPresent(), "Has RMI Connector Server");
}
}

View File

@ -0,0 +1,78 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class ServerWithJNDITest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
server = ServerWithJNDI.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
LifeCycle.stop(server);
}
@Test
public void testGetTest() throws Exception
{
URI uri = server.getURI().resolve("/test");
ContentResponse response = client.GET(uri);
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody,
allOf(
containsString("java:comp/env/woggle"),
containsString("java:comp/env/gargle"),
containsString("java:comp/env/wiggle")
)
);
assertThat("Response Content", responseBody, not(containsString("<span class=\"fail\">")));
}
}

View File

@ -16,46 +16,42 @@
// ======================================================================== // ========================================================================
// //
package org.eclipse.jetty.websocket.javax.server; package org.eclipse.jetty.embedded;
import javax.websocket.DeploymentException; import java.net.URI;
import javax.websocket.OnMessage;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
public class PathParamTest import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public class SimplestServerTest extends AbstractEmbeddedTest
{ {
private JavaxWebSocketServerContainer container; private Server server;
@BeforeEach @BeforeEach
public void startContainer() throws Exception public void startServer() throws Exception
{ {
container = new DummyServerContainer(); server = SimplestServer.createServer(0);
container.start(); server.start();
} }
@AfterEach @AfterEach
public void stopContainer() throws Exception public void stopServer() throws Exception
{ {
container.stop(); server.stop();
}
@ServerEndpoint("/pathparam/basic/{name}")
public static class BasicPathParamSocket
{
@OnMessage
public void onMessage(String message, @PathParam("name") String name)
{
}
} }
@Test @Test
public void testBasicPathParamSocket() throws DeploymentException public void testGetTest() throws Exception
{ {
container.addEndpoint(BasicPathParamSocket.class); URI uri = server.getURI().resolve("/test");
ContentResponse response = client.GET(uri);
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.NOT_FOUND_404));
} }
} }

View File

@ -0,0 +1,95 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class SplitFileServerTest extends AbstractEmbeddedTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
Path path0 = Paths.get("src/test/resources/dir0");
Path path1 = Paths.get("src/test/resources/dir1");
Resource resource0 = new PathResource(path0);
Resource resource1 = new PathResource(path1);
server = SplitFileServer.createServer(0, resource0, resource1);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetTest0() throws Exception
{
URI uri = server.getURI().resolve("/test0.txt");
ContentResponse response = client.GET(uri);
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("test0"));
}
@Test
public void testGetTest1() throws Exception
{
URI uri = server.getURI().resolve("/test1.txt");
ContentResponse response = client.GET(uri);
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
// dumpResponseHeaders(response);
// test response content
String responseBody = response.getContentAsString();
assertThat("Response Content", responseBody, containsString("test1"));
}
@Test
public void testGetTest2() throws Exception
{
URI uri = server.getURI().resolve("/test2.txt");
ContentResponse response = client.GET(uri);
assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.NOT_FOUND_404));
}
}

View File

@ -0,0 +1,110 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.util.concurrent.LinkedBlockingQueue;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.websocket.api.util.WSURI;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public class WebSocketJsrServerTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = WebSocketJsrServer.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetEcho() throws Exception
{
WebSocketContainer javaxWebSocketClient = ContainerProvider.getWebSocketContainer();
javaxWebSocketClient.setDefaultMaxSessionIdleTimeout(2000);
try
{
URI wsUri = WSURI.toWebsocket(server.getURI().resolve("/echo"));
TrackingClientEndpoint clientEndpoint = new TrackingClientEndpoint();
Session session = javaxWebSocketClient.connectToServer(clientEndpoint, wsUri);
session.getBasicRemote().sendText("Hello World");
String response = clientEndpoint.messages.poll(2, SECONDS);
assertThat("Response", response, is("Hello World"));
}
finally
{
LifeCycle.stop(javaxWebSocketClient);
}
}
public static class TrackingClientEndpoint extends Endpoint implements MessageHandler.Whole<String>
{
public LinkedBlockingQueue<String> messages = new LinkedBlockingQueue<>();
@Override
public void onMessage(String message)
{
messages.offer(message);
}
@Override
public void onOpen(Session session, EndpointConfig config)
{
session.addMessageHandler(this);
}
@Override
public void onError(Session session, Throwable thr)
{
super.onError(session, thr);
}
@Override
public void onClose(Session session, CloseReason closeReason)
{
super.onClose(session, closeReason);
}
}
}

View File

@ -0,0 +1,111 @@
//
// ========================================================================
// Copyright (c) 1995-2019 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.embedded;
import java.net.URI;
import java.time.Duration;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.api.util.WSURI;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public class WebSocketServerTest
{
private Server server;
@BeforeEach
public void startServer() throws Exception
{
server = WebSocketServer.createServer(0);
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
server.stop();
}
@Test
public void testGetEcho() throws Exception
{
WebSocketClient webSocketClient = new WebSocketClient();
webSocketClient.setIdleTimeout(Duration.ofSeconds(2));
try
{
webSocketClient.start();
URI wsUri = WSURI.toWebsocket(server.getURI().resolve("/echo"));
TrackingClientEndpoint clientEndpoint = new TrackingClientEndpoint();
Future<Session> sessionFut = webSocketClient.connect(clientEndpoint, wsUri);
Session session = sessionFut.get(2, SECONDS);
session.getRemote().sendString("Hello World");
String response = clientEndpoint.messages.poll(2, SECONDS);
assertThat("Response", response, is("Hello World"));
}
finally
{
LifeCycle.stop(webSocketClient);
}
}
@WebSocket
public static class TrackingClientEndpoint
{
private static final Logger LOG = Log.getLogger(TrackingClientEndpoint.class);
public LinkedBlockingQueue<String> messages = new LinkedBlockingQueue<>();
@OnWebSocketMessage
public void onMessage(String message)
{
messages.offer(message);
}
@OnWebSocketError
public void onError(Throwable cause)
{
LOG.warn(cause);
}
@OnWebSocketClose
public void onClose(int statusCode, String reason)
{
LOG.debug("Closed({}, {})", statusCode, reason);
}
}
}

View File

@ -0,0 +1,11 @@
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
org.eclipse.jetty.LEVEL=WARN
org.eclipse.jetty.embedded.JettyDistribution.LEVEL=DEBUG
#org.eclipse.jetty.STACKS=true
#org.eclipse.jetty.STACKS=false
#org.eclipse.jetty.io.LEVEL=DEBUG
#org.eclipse.jetty.io.ssl.LEVEL=DEBUG
#org.eclipse.jetty.server.LEVEL=DEBUG
#org.eclipse.jetty.servlets.LEVEL=DEBUG
#org.eclipse.jetty.alpn.LEVEL=DEBUG
#org.eclipse.jetty.jmx.LEVEL=DEBUG

View File

@ -38,7 +38,7 @@ import javax.servlet.http.HttpSession;
@WebFilter(filterName = "CFilter", dispatcherTypes = {DispatcherType.REQUEST}, urlPatterns = {"/*"}, initParams = { @WebFilter(filterName = "CFilter", dispatcherTypes = {DispatcherType.REQUEST}, urlPatterns = {"/*"}, initParams = {
@WebInitParam(name = "a", value = "99") @WebInitParam(name = "a", value = "99")
}, asyncSupported = false) }, asyncSupported = false)
@RunAs("admin") @RunAs("admin")
public class FilterC implements Filter public class FilterC implements Filter
{ {

View File

@ -38,7 +38,7 @@ import javax.servlet.http.HttpServletResponse;
@DeclareRoles({"alice"}) @DeclareRoles({"alice"})
@WebServlet(urlPatterns = {"/foo/*", "/bah/*"}, name = "CServlet", initParams = { @WebServlet(urlPatterns = {"/foo/*", "/bah/*"}, name = "CServlet", initParams = {
@WebInitParam(name = "x", value = "y") @WebInitParam(name = "x", value = "y")
}, loadOnStartup = 2, asyncSupported = false) }, loadOnStartup = 2, asyncSupported = false)
@MultipartConfig(fileSizeThreshold = 1000, maxFileSize = 2000, maxRequestSize = 3000) @MultipartConfig(fileSizeThreshold = 1000, maxFileSize = 2000, maxRequestSize = 3000)
@RunAs("admin") @RunAs("admin")
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"fred", "bill", "dorothy"}), httpMethodConstraints = { @ServletSecurity(value = @HttpConstraint(rolesAllowed = {"fred", "bill", "dorothy"}), httpMethodConstraints = {

View File

@ -24,8 +24,8 @@ import javax.servlet.http.HttpServlet;
@WebServlet(urlPatterns = {"/", "/bah/*"}, name = "DServlet", initParams = { @WebServlet(urlPatterns = {"/", "/bah/*"}, name = "DServlet", initParams = {
@WebInitParam(name = "x", value = "y") @WebInitParam(name = "x", value = "y")
}, loadOnStartup = 1, asyncSupported = false) }, loadOnStartup = 1, asyncSupported = false)
public class ServletD extends HttpServlet public class ServletD extends HttpServlet
{ {
// no op
} }

View File

@ -63,16 +63,14 @@ public class TestSecurityAnnotationConversions
@ServletSecurity(value = @HttpConstraint(value = EmptyRoleSemantic.PERMIT, transportGuarantee = TransportGuarantee.CONFIDENTIAL, rolesAllowed = { @ServletSecurity(value = @HttpConstraint(value = EmptyRoleSemantic.PERMIT, transportGuarantee = TransportGuarantee.CONFIDENTIAL, rolesAllowed = {
"tom", "dick", "harry" "tom", "dick", "harry"
}), httpMethodConstraints = }), httpMethodConstraints = {@HttpMethodConstraint(value = "GET")})
{@HttpMethodConstraint(value = "GET")})
public static class Method1Servlet extends HttpServlet public static class Method1Servlet extends HttpServlet
{ {
} }
@ServletSecurity(value = @HttpConstraint(value = EmptyRoleSemantic.PERMIT, transportGuarantee = TransportGuarantee.CONFIDENTIAL, rolesAllowed = { @ServletSecurity(value = @HttpConstraint(value = EmptyRoleSemantic.PERMIT, transportGuarantee = TransportGuarantee.CONFIDENTIAL, rolesAllowed = {
"tom", "dick", "harry" "tom", "dick", "harry"
}), httpMethodConstraints = }), httpMethodConstraints = {@HttpMethodConstraint(value = "GET", transportGuarantee = TransportGuarantee.CONFIDENTIAL)})
{@HttpMethodConstraint(value = "GET", transportGuarantee = TransportGuarantee.CONFIDENTIAL)})
public static class Method2Servlet extends HttpServlet public static class Method2Servlet extends HttpServlet
{ {
} }
@ -175,7 +173,7 @@ public class TestSecurityAnnotationConversions
public void testMethodAnnotation() throws Exception public void testMethodAnnotation() throws Exception
{ {
//ServletSecurity annotation with HttpConstraint of TransportGuarantee.CONFIDENTIAL, and a list of rolesAllowed, and //ServletSecurity annotation with HttpConstraint of TransportGuarantee.CONFIDENTIAL, and a list of rolesAllowed, and
//a HttpMethodConstraint for GET method that permits all and has TransportGuarantee.NONE (ie is default) //an HttpMethodConstraint for GET method that permits all and has TransportGuarantee.NONE (ie is default)
WebAppContext wac = makeWebAppContext(Method1Servlet.class.getCanonicalName(), "method1Servlet", new String[]{ WebAppContext wac = makeWebAppContext(Method1Servlet.class.getCanonicalName(), "method1Servlet", new String[]{
"/foo/*", "*.foo" "/foo/*", "*.foo"

View File

@ -171,7 +171,8 @@ public class AntBuild
Matcher mat = pat.getMatcher(line); Matcher mat = pat.getMatcher(line);
if (mat.find()) if (mat.find())
{ {
int num = 0, count = mat.groupCount(); int num = 0;
int count = mat.groupCount();
String[] match = new String[count]; String[] match = new String[count];
while (num++ < count) while (num++ < count)
{ {

View File

@ -284,6 +284,11 @@
<artifactId>jetty-security</artifactId> <artifactId>jetty-security</artifactId>
<version>10.0.0-SNAPSHOT</version> <version>10.0.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-openid</artifactId>
<version>10.0.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId> <artifactId>jetty-server</artifactId>

View File

@ -28,7 +28,7 @@ import org.eclipse.jetty.io.ClientConnectionFactory;
* in order to plug-in a different transport for {@link HttpClient}. * in order to plug-in a different transport for {@link HttpClient}.
* <p> * <p>
* While the {@link HttpClient} APIs define the HTTP semantic (request, response, headers, etc.) * While the {@link HttpClient} APIs define the HTTP semantic (request, response, headers, etc.)
* <em>how</em> a HTTP exchange is carried over the network depends on implementations of this class. * <em>how</em> an HTTP exchange is carried over the network depends on implementations of this class.
* <p> * <p>
* The default implementation uses the HTTP protocol to carry over the network the HTTP exchange, * The default implementation uses the HTTP protocol to carry over the network the HTTP exchange,
* but the HTTP exchange may also be carried using the FCGI protocol, the HTTP/2 protocol or, * but the HTTP exchange may also be carried using the FCGI protocol, the HTTP/2 protocol or,

View File

@ -32,7 +32,7 @@ import org.eclipse.jetty.util.log.Logger;
/** /**
* {@link HttpContent} is a stateful, linear representation of the request content provided * {@link HttpContent} is a stateful, linear representation of the request content provided
* by a {@link ContentProvider} that can be traversed one-way to obtain content buffers to * by a {@link ContentProvider} that can be traversed one-way to obtain content buffers to
* send to a HTTP server. * send to an HTTP server.
* <p> * <p>
* {@link HttpContent} offers the notion of a one-way cursor to traverse the content. * {@link HttpContent} offers the notion of a one-way cursor to traverse the content.
* The cursor starts in a virtual "before" position and can be advanced using {@link #advance()} * The cursor starts in a virtual "before" position and can be advanced using {@link #advance()}

View File

@ -50,7 +50,7 @@ import org.eclipse.jetty.util.log.Logger;
* <ol> * <ol>
* <li>{@link #responseBegin(HttpExchange)}, when the HTTP response data containing the HTTP status code * <li>{@link #responseBegin(HttpExchange)}, when the HTTP response data containing the HTTP status code
* is available</li> * is available</li>
* <li>{@link #responseHeader(HttpExchange, HttpField)}, when a HTTP field is available</li> * <li>{@link #responseHeader(HttpExchange, HttpField)}, when an HTTP field is available</li>
* <li>{@link #responseHeaders(HttpExchange)}, when all HTTP headers are available</li> * <li>{@link #responseHeaders(HttpExchange)}, when all HTTP headers are available</li>
* <li>{@link #responseContent(HttpExchange, ByteBuffer, Callback)}, when HTTP content is available</li> * <li>{@link #responseContent(HttpExchange, ByteBuffer, Callback)}, when HTTP content is available</li>
* <li>{@link #responseSuccess(HttpExchange)}, when the response is successful</li> * <li>{@link #responseSuccess(HttpExchange)}, when the response is successful</li>

View File

@ -82,7 +82,7 @@ public class HttpRedirector
/** /**
* @param response the response to check for redirects * @param response the response to check for redirects
* @return whether the response code is a HTTP redirect code * @return whether the response code is an HTTP redirect code
*/ */
public boolean isRedirect(Response response) public boolean isRedirect(Response response)
{ {

View File

@ -876,7 +876,7 @@ public class HttpRequest implements Request
} }
catch (URISyntaxException x) catch (URISyntaxException x)
{ {
// The "path" of a HTTP request may not be a URI, // The "path" of an HTTP request may not be a URI,
// for example for CONNECT 127.0.0.1:8080. // for example for CONNECT 127.0.0.1:8080.
return null; return null;
} }

View File

@ -40,7 +40,7 @@ import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Fields;
/** /**
* <p>{@link Request} represents a HTTP request, and offers a fluent interface to customize * <p>{@link Request} represents an HTTP request, and offers a fluent interface to customize
* various attributes such as the path, the headers, the content, etc.</p> * various attributes such as the path, the headers, the content, etc.</p>
* <p>You can create {@link Request} objects via {@link HttpClient#newRequest(String)} and * <p>You can create {@link Request} objects via {@link HttpClient#newRequest(String)} and
* you can send them using either {@link #send()} for a blocking semantic, or * you can send them using either {@link #send()} for a blocking semantic, or

View File

@ -29,7 +29,7 @@ import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Callback;
/** /**
* <p>{@link Response} represents a HTTP response and offers methods to retrieve status code, HTTP version * <p>{@link Response} represents an HTTP response and offers methods to retrieve status code, HTTP version
* and headers.</p> * and headers.</p>
* <p>{@link Response} objects are passed as parameters to {@link Response.Listener} callbacks, or as * <p>{@link Response} objects are passed as parameters to {@link Response.Listener} callbacks, or as
* future result of {@link Request#send()}.</p> * future result of {@link Request#send()}.</p>

View File

@ -161,7 +161,7 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
} }
/** /**
* Parses a HTTP response in the receivers buffer. * Parses an HTTP response in the receivers buffer.
* *
* @return true to indicate that parsing should be interrupted (and will be resumed by another thread). * @return true to indicate that parsing should be interrupted (and will be resumed by another thread).
*/ */
@ -173,10 +173,10 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
boolean complete = this.complete; boolean complete = this.complete;
this.complete = false; this.complete = false;
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Parsed {}, remaining {} {}", handle, buffer.remaining(), parser); LOG.debug("Parsed {}, remaining {} {}", handle, BufferUtil.length(buffer), parser);
if (handle) if (handle)
return true; return true;
if (!buffer.hasRemaining()) if (!BufferUtil.hasContent(buffer))
return false; return false;
if (complete) if (complete)
{ {

View File

@ -106,7 +106,7 @@ public class HostnameVerificationTest
/** /**
* This test is supposed to verify that hostname verification works as described in: * This test is supposed to verify that hostname verification works as described in:
* http://www.ietf.org/rfc/rfc2818.txt section 3.1. It uses a certificate with a common name different to localhost * http://www.ietf.org/rfc/rfc2818.txt section 3.1. It uses a certificate with a common name different to localhost
* and sends a request to localhost. This should fail with a SSLHandshakeException. * and sends a request to localhost. This should fail with an SSLHandshakeException.
* *
* @throws Exception on test failure * @throws Exception on test failure
*/ */

View File

@ -657,10 +657,10 @@ public class HttpClientAuthenticationTest extends AbstractHttpClientServerTest
assertEquals("1523430383", headerInfo.getParameter("nonce")); assertEquals("1523430383", headerInfo.getParameter("nonce"));
// test multiple authentications // test multiple authentications
List<HeaderInfo> headerInfoList = aph.getHeaderInfo("Digest qop=\"auth\", realm=\"thermostat\", nonce=\"1523430383\", " List<HeaderInfo> headerInfoList = aph.getHeaderInfo("Digest qop=\"auth\", realm=\"thermostat\", nonce=\"1523430383\", " +
+ "Digest realm=\"thermostat2\", qop=\"auth2\", nonce=\"4522530354\", " "Digest realm=\"thermostat2\", qop=\"auth2\", nonce=\"4522530354\", " +
+ "Digest qop=\"auth3\", nonce=\"9523570528\", realm=\"thermostat3\", " "Digest qop=\"auth3\", nonce=\"9523570528\", realm=\"thermostat3\", " +
+ "Digest qop=\"auth4\", nonce=\"3526435321\""); "Digest qop=\"auth4\", nonce=\"3526435321\"");
assertTrue(headerInfoList.get(0).getType().equalsIgnoreCase("Digest")); assertTrue(headerInfoList.get(0).getType().equalsIgnoreCase("Digest"));
assertEquals("auth", headerInfoList.get(0).getParameter("qop")); assertEquals("auth", headerInfoList.get(0).getParameter("qop"));
@ -744,8 +744,8 @@ public class HttpClientAuthenticationTest extends AbstractHttpClientServerTest
assertTrue(headerInfo.getType().equalsIgnoreCase("Negotiate")); assertTrue(headerInfo.getType().equalsIgnoreCase("Negotiate"));
assertEquals("TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==", headerInfo.getBase64()); assertEquals("TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==", headerInfo.getBase64());
headerInfos = aph.getHeaderInfo("Negotiate TlRMTVNTUAABAAAAAAAAAFAs4OAAAADw==, " headerInfos = aph.getHeaderInfo("Negotiate TlRMTVNTUAABAAAAAAAAAFAs4OAAAADw==, " +
+ "Negotiate YIIJvwYGKwYBBQUCoIIJszCCCa+gJDAi="); "Negotiate YIIJvwYGKwYBBQUCoIIJszCCCa+gJDAi=");
assertTrue(headerInfos.get(0).getType().equalsIgnoreCase("Negotiate")); assertTrue(headerInfos.get(0).getType().equalsIgnoreCase("Negotiate"));
assertEquals("TlRMTVNTUAABAAAAAAAAAFAs4OAAAADw==", headerInfos.get(0).getBase64()); assertEquals("TlRMTVNTUAABAAAAAAAAAFAs4OAAAADw==", headerInfos.get(0).getBase64());
@ -766,9 +766,9 @@ public class HttpClientAuthenticationTest extends AbstractHttpClientServerTest
assertEquals("=1523430383=", headerInfo.getParameter("nonce")); assertEquals("=1523430383=", headerInfo.getParameter("nonce"));
// test multiple authentications // test multiple authentications
List<HeaderInfo> headerInfoList = aph.getHeaderInfo("Digest qop=\"=au=th=\", realm=\"=ther=mostat=\", nonce=\"=152343=0383=\", " List<HeaderInfo> headerInfoList = aph.getHeaderInfo("Digest qop=\"=au=th=\", realm=\"=ther=mostat=\", nonce=\"=152343=0383=\", " +
+ "Digest realm=\"=thermostat2\", qop=\"=auth2\", nonce=\"=4522530354\", " "Digest realm=\"=thermostat2\", qop=\"=auth2\", nonce=\"=4522530354\", " +
+ "Digest qop=\"auth3=\", nonce=\"9523570528=\", realm=\"thermostat3=\", "); "Digest qop=\"auth3=\", nonce=\"9523570528=\", realm=\"thermostat3=\", ");
assertTrue(headerInfoList.get(0).getType().equalsIgnoreCase("Digest")); assertTrue(headerInfoList.get(0).getType().equalsIgnoreCase("Digest"));
assertEquals("=au=th=", headerInfoList.get(0).getParameter("qop")); assertEquals("=au=th=", headerInfoList.get(0).getParameter("qop"));

View File

@ -68,6 +68,7 @@ public class HttpClientTLSTest
private Server server; private Server server;
private ServerConnector connector; private ServerConnector connector;
private HttpClient client; private HttpClient client;
private SSLSocket sslSocket;
private void startServer(SslContextFactory.Server sslContextFactory, Handler handler) throws Exception private void startServer(SslContextFactory.Server sslContextFactory, Handler handler) throws Exception
{ {
@ -424,7 +425,7 @@ public class HttpClientTLSTest
String host = "localhost"; String host = "localhost";
int port = connector.getLocalPort(); int port = connector.getLocalPort();
Socket socket = new Socket(host, port); Socket socket = new Socket(host, port);
SSLSocket sslSocket = (SSLSocket)clientTLSFactory.getSslContext().getSocketFactory().createSocket(socket, host, port, true); sslSocket = (SSLSocket)clientTLSFactory.getSslContext().getSocketFactory().createSocket(socket, host, port, true);
CountDownLatch handshakeLatch1 = new CountDownLatch(1); CountDownLatch handshakeLatch1 = new CountDownLatch(1);
AtomicReference<byte[]> session1 = new AtomicReference<>(); AtomicReference<byte[]> session1 = new AtomicReference<>();
sslSocket.addHandshakeCompletedListener(event -> sslSocket.addHandshakeCompletedListener(event ->
@ -437,14 +438,12 @@ public class HttpClientTLSTest
// In TLS 1.3 the server sends a NewSessionTicket post-handshake message // In TLS 1.3 the server sends a NewSessionTicket post-handshake message
// to enable session resumption and without a read, the message is not processed. // to enable session resumption and without a read, the message is not processed.
try
assertThrows(SocketTimeoutException.class, () ->
{ {
sslSocket.setSoTimeout(1000); sslSocket.setSoTimeout(1000);
sslSocket.getInputStream().read(); sslSocket.getInputStream().read();
} });
catch (SocketTimeoutException expected)
{
}
// The client closes abruptly. // The client closes abruptly.
socket.close(); socket.close();

View File

@ -485,7 +485,7 @@ public class HttpConnectionLifecycleTest extends AbstractHttpClientServerTest
ContentResponse response = request ContentResponse response = request
.onResponseBegin(response1 -> .onResponseBegin(response1 ->
{ {
// Simulate a HTTP 1.0 response has been received. // Simulate an HTTP 1.0 response has been received.
((HttpResponse)response1).version(HttpVersion.HTTP_1_0); ((HttpResponse)response1).version(HttpVersion.HTTP_1_0);
}) })
.send(); .send();

Some files were not shown because too many files have changed in this diff Show More