Merge remote-tracking branch 'eclipse/jetty-9.4.x' into jetty-9.4.x-stackTraceRemoval
This commit is contained in:
commit
f9d474ad66
|
@ -182,12 +182,12 @@ public class Http2Server
|
|||
content+="uri="+request.getRequestURI()+"\n";
|
||||
content+="session="+session.getId()+(session.isNew()?"(New)\n":"\n");
|
||||
content+="date="+new Date()+"\n";
|
||||
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies!=null && cookies.length>0)
|
||||
for (Cookie c : cookies)
|
||||
content+="cookie "+c.getName()+"="+c.getValue()+"\n";
|
||||
|
||||
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies!=null && cookies.length>0)
|
||||
for (Cookie c : cookies)
|
||||
content+="cookie "+c.getName()+"="+c.getValue()+"\n";
|
||||
|
||||
response.setContentLength(content.length());
|
||||
response.getOutputStream().print(content);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
This chapter discusses various ways to deploy applications with Jetty.
|
||||
Topics range from deployment bindings to deploying third party products.
|
||||
It also includes information about the Deployment Manager, WebApp Provider, and Overlay Deployer.
|
||||
It also includes information about the Deployment Manager and WebApp Provider.
|
||||
|
||||
include::anatomy-of-a-webapp.adoc[]
|
||||
include::automatic-webapp-deployment.adoc[]
|
||||
|
|
|
@ -32,8 +32,8 @@ image:images/Jetty_DeployManager_DeploymentManager_Roles.png[image,width=195]
|
|||
[[udm-application-providers]]
|
||||
==== Application Providers
|
||||
|
||||
Before Jetty deploys an application, an link:{JDURL}/org/eclipse/jetty/deploy/AppProvider.html[AppProvider] identifies the App and then provides it to the `DeploymentManager`.
|
||||
The main `AppProvider` with the Jetty distribution is the link:{JDURL}/org/eclipse/jetty/deploy/providers/WebAppProvider.html[WebAppProvider.]
|
||||
Before Jetty deploys an application, an link:{JDURL}/org/eclipse/jetty/deploy/AppProvider.html[`AppProvider`] identifies the App and then provides it to the `DeploymentManager`.
|
||||
The main `AppProvider` with the Jetty distribution is the link:{JDURL}/org/eclipse/jetty/deploy/providers/WebAppProvider.html[`WebAppProvider`.]
|
||||
|
||||
[[udm-application-lifecycle-graph]]
|
||||
==== Application LifeCycle Graph
|
||||
|
@ -63,15 +63,35 @@ Examples of new `AppLifeCycle.Binding` implementations that can be developed inc
|
|||
|
||||
There are four default bindings:
|
||||
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardDeployer.html[StandardDeployer] — Deploys the ContextHandler into Jetty in the appropriate place.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardStarter.html[StandardStarter] — Sets the ContextHandler to started and start accepting incoming requests.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardStopper.html[StandardStopper] — Stops the ContextHandler and stops accepting incoming requests.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardUndeployer.html[StandardUndeployer] — Removes the ContextHandler from Jetty.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardDeployer.html[`StandardDeployer`] — Deploys the ContextHandler into Jetty in the appropriate place.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardStarter.html[`StandardStarter`] — Sets the ContextHandler to started and start accepting incoming requests.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardStopper.html[`StandardStopper`] — Stops the ContextHandler and stops accepting incoming requests.
|
||||
* link:{JDURL}/org/eclipse/jetty/deploy/bindings/StandardUndeployer.html[`StandardUndeployer`] — Removes the ContextHandler from Jetty.
|
||||
|
||||
image:images/Jetty_DeployManager_DefaultAppLifeCycleBindings.png[image,width=851]
|
||||
|
||||
A fifth, non-standard binding, called link:{JDURL}/org/eclipse/jetty/deploy/bindings/DebugBinding.html[DebugBinding], is also available for debugging reasons; it logs the various transitions through the Application LifeCycle.
|
||||
|
||||
===== Using GlobalWebappConfigBinding
|
||||
|
||||
In addition to the LifeCycle bindings discussed above, there is also the link:https://www.eclipse.org/jetty/javadoc/current/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBinding.html[`GlobalWebappConfigBinding`] which, when added to the `DeploymentManager` will apply an additional configuration XML file to each webapp that it deploys.
|
||||
This can useful when setting server or system classes, or when defining link:#override-web-xml[override descriptors.]
|
||||
This configuration XML file will be _in addition to_ any context XML file that exists for the webapp; it will be applied _after_ any context XML files but _before_ the webapp is started.
|
||||
The format for the XML file is the same as any context XML file and can be used to same parameters for a webapp.
|
||||
|
||||
To use this binding, you can either modify the existing `jetty-deploy.xml` which comes with the Jetty distribution (be sure to link:#startup-base-and-home[copy it to your $JETTY_BASE/etc directory first]), or by link:#custom-modules[creating a new module] file which calls to an additional XML file.
|
||||
|
||||
[source, xml, subs="{sub-order}"]
|
||||
----
|
||||
<Call name="addLifeCycleBinding">
|
||||
<Arg>
|
||||
<New class="org.eclipse.jetty.deploy.bindings.GlobalWebappConfigBinding" >
|
||||
<Set name="jettyXml"><Property name="jetty.home" default="." />/etc/global-webapp-config.xml</Set>
|
||||
</New>
|
||||
</Arg>
|
||||
</Call>
|
||||
----
|
||||
|
||||
[[default-web-app-provider]]
|
||||
==== Understanding the Default WebAppProvider
|
||||
|
||||
|
@ -119,7 +139,7 @@ monitoredDirName::
|
|||
The file path or URL to the directory to scan for web applications.
|
||||
|
||||
Scanning follows these rules:
|
||||
|
||||
|
||||
1. A base directory must exist.
|
||||
2. Hidden Files (starting with `"."`) are ignored.
|
||||
3. Directories with names ending in `".d"` are ignored.
|
||||
|
|
|
@ -1,44 +0,0 @@
|
|||
//
|
||||
// ========================================================================
|
||||
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
|
||||
// ========================================================================
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
//
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
//
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
//
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
//
|
||||
|
||||
[[setting-deployment-bindings]]
|
||||
=== Setting Deployment Bindings
|
||||
|
||||
Jetty provides __deployment bindings__, which allows access to the application lifecycle of `DeploymentManager`.
|
||||
|
||||
There are a handful of bindings that exist within the core distribution of Jetty:
|
||||
|
||||
* `StandardDeployer` (deploying)–Standard binding that deals with deploying a webapp.
|
||||
* `StandardStarter` (starting)–Standard binding that deals with starting a webapp.
|
||||
* `StandardStopper` (stopping)–Standard binding that deals with stopping a webapp.
|
||||
* `StandardUndeployer` (undeploying)–Standard undeployer that deals with undeploying a webapp.
|
||||
* `DebugBinding` (any specified)–Attaches a binding and prints logging information of a context going through the specified binding target.
|
||||
* `GlobalWebappConfigBinding` (deploying)–Allows the user to override various settings of a webapp's context globally for all contexts.
|
||||
+
|
||||
[source, xml, subs="{sub-order}"]
|
||||
----
|
||||
<Call name="addLifeCycleBinding">
|
||||
<Arg>
|
||||
<New class="org.eclipse.jetty.deploy.bindings.GlobalWebappConfigBinding" >
|
||||
<Set name="jettyXml">file://<Property name="jetty.home" default="." />/etc/global-webapp-context-config.xml</Set>
|
||||
</New>
|
||||
</Arg>
|
||||
</Call>
|
||||
|
||||
----
|
||||
* OrderedGroupBinding (any specified)–Allows the user to set a specific order for bindings to process in a given binding target.
|
|
@ -24,20 +24,17 @@ Create a file called `scratch.xml` in the `${jetty.base}/webapps` directory and
|
|||
|
||||
[source, xml, subs="{sub-order}"]
|
||||
----
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
|
||||
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
|
||||
<Set name="contextPath">/scratch</Set>
|
||||
<Set name="handler">
|
||||
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
|
||||
<Set name="resourceBase">/home/jesse/scratch</Set>
|
||||
<Set name="resourceBase">/home/scratch</Set>
|
||||
<Set name="directoriesListed">true</Set>
|
||||
</New>
|
||||
</Set>
|
||||
</Configure>
|
||||
|
||||
|
||||
----
|
||||
|
||||
This is a very basic setup for serving static files.
|
||||
|
|
|
@ -76,7 +76,7 @@ public class WebAppMarshaller extends AbstractJBossMarshaller
|
|||
|
||||
public WebAppMarshaller ()
|
||||
{
|
||||
super();
|
||||
super();
|
||||
baseCfg.setClassResolver(new WebAppContextClassResolver());
|
||||
}
|
||||
|
||||
|
|
|
@ -47,130 +47,130 @@ public class App implements EntryPoint {
|
|||
+ "attempting to contact the server. Please check your network "
|
||||
+ "connection and try again.";
|
||||
|
||||
/**
|
||||
* Create a remote service proxy to talk to the server-side Greeting service.
|
||||
*/
|
||||
private final GreetingServiceAsync greetingService = GWT
|
||||
.create(GreetingService.class);
|
||||
/**
|
||||
* Create a remote service proxy to talk to the server-side Greeting service.
|
||||
*/
|
||||
private final GreetingServiceAsync greetingService = GWT
|
||||
.create(GreetingService.class);
|
||||
|
||||
/**
|
||||
* This is the entry point method.
|
||||
*/
|
||||
public void onModuleLoad() {
|
||||
final Button sendButton = new Button("Send");
|
||||
final TextBox nameField = new TextBox();
|
||||
nameField.setText("GWT User");
|
||||
final Label errorLabel = new Label();
|
||||
/**
|
||||
* This is the entry point method.
|
||||
*/
|
||||
public void onModuleLoad() {
|
||||
final Button sendButton = new Button("Send");
|
||||
final TextBox nameField = new TextBox();
|
||||
nameField.setText("GWT User");
|
||||
final Label errorLabel = new Label();
|
||||
|
||||
// We can add style names to widgets
|
||||
sendButton.addStyleName("sendButton");
|
||||
// We can add style names to widgets
|
||||
sendButton.addStyleName("sendButton");
|
||||
|
||||
// Add the nameField and sendButton to the RootPanel
|
||||
// Use RootPanel.get() to get the entire body element
|
||||
RootPanel.get("nameFieldContainer").add(nameField);
|
||||
RootPanel.get("sendButtonContainer").add(sendButton);
|
||||
RootPanel.get("errorLabelContainer").add(errorLabel);
|
||||
// Add the nameField and sendButton to the RootPanel
|
||||
// Use RootPanel.get() to get the entire body element
|
||||
RootPanel.get("nameFieldContainer").add(nameField);
|
||||
RootPanel.get("sendButtonContainer").add(sendButton);
|
||||
RootPanel.get("errorLabelContainer").add(errorLabel);
|
||||
|
||||
// Focus the cursor on the name field when the app loads
|
||||
nameField.setFocus(true);
|
||||
nameField.selectAll();
|
||||
// Focus the cursor on the name field when the app loads
|
||||
nameField.setFocus(true);
|
||||
nameField.selectAll();
|
||||
|
||||
// Create the popup dialog box
|
||||
final DialogBox dialogBox = new DialogBox();
|
||||
dialogBox.setText("Remote Procedure Call");
|
||||
dialogBox.setAnimationEnabled(true);
|
||||
final Button closeButton = new Button("Close");
|
||||
// We can set the id of a widget by accessing its Element
|
||||
closeButton.getElement().setId("closeButton");
|
||||
final Label textToServerLabel = new Label();
|
||||
final HTML serverResponseLabel = new HTML();
|
||||
VerticalPanel dialogVPanel = new VerticalPanel();
|
||||
dialogVPanel.addStyleName("dialogVPanel");
|
||||
dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));
|
||||
dialogVPanel.add(textToServerLabel);
|
||||
dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
|
||||
dialogVPanel.add(serverResponseLabel);
|
||||
dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
|
||||
dialogVPanel.add(closeButton);
|
||||
dialogBox.setWidget(dialogVPanel);
|
||||
// Create the popup dialog box
|
||||
final DialogBox dialogBox = new DialogBox();
|
||||
dialogBox.setText("Remote Procedure Call");
|
||||
dialogBox.setAnimationEnabled(true);
|
||||
final Button closeButton = new Button("Close");
|
||||
// We can set the id of a widget by accessing its Element
|
||||
closeButton.getElement().setId("closeButton");
|
||||
final Label textToServerLabel = new Label();
|
||||
final HTML serverResponseLabel = new HTML();
|
||||
VerticalPanel dialogVPanel = new VerticalPanel();
|
||||
dialogVPanel.addStyleName("dialogVPanel");
|
||||
dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));
|
||||
dialogVPanel.add(textToServerLabel);
|
||||
dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
|
||||
dialogVPanel.add(serverResponseLabel);
|
||||
dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
|
||||
dialogVPanel.add(closeButton);
|
||||
dialogBox.setWidget(dialogVPanel);
|
||||
|
||||
// Add a handler to close the DialogBox
|
||||
closeButton.addClickHandler(new ClickHandler() {
|
||||
public void onClick(ClickEvent event) {
|
||||
dialogBox.hide();
|
||||
sendButton.setEnabled(true);
|
||||
sendButton.setFocus(true);
|
||||
}
|
||||
});
|
||||
// Add a handler to close the DialogBox
|
||||
closeButton.addClickHandler(new ClickHandler() {
|
||||
public void onClick(ClickEvent event) {
|
||||
dialogBox.hide();
|
||||
sendButton.setEnabled(true);
|
||||
sendButton.setFocus(true);
|
||||
}
|
||||
});
|
||||
|
||||
// Create a handler for the sendButton and nameField
|
||||
class MyHandler implements ClickHandler, KeyUpHandler {
|
||||
/**
|
||||
* Fired when the user clicks on the sendButton.
|
||||
*/
|
||||
public void onClick(ClickEvent event) {
|
||||
sendNameToServer();
|
||||
}
|
||||
// Create a handler for the sendButton and nameField
|
||||
class MyHandler implements ClickHandler, KeyUpHandler {
|
||||
/**
|
||||
* Fired when the user clicks on the sendButton.
|
||||
*/
|
||||
public void onClick(ClickEvent event) {
|
||||
sendNameToServer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fired when the user types in the nameField.
|
||||
*/
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
|
||||
sendNameToServer();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Fired when the user types in the nameField.
|
||||
*/
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
|
||||
sendNameToServer();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the name from the nameField to the server and wait for a response.
|
||||
*/
|
||||
private void sendNameToServer() {
|
||||
// First, we validate the input.
|
||||
errorLabel.setText("");
|
||||
String textToServer = nameField.getText();
|
||||
if (!FieldVerifier.isValidName(textToServer)) {
|
||||
errorLabel.setText("Please enter at least four characters");
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* Send the name from the nameField to the server and wait for a response.
|
||||
*/
|
||||
private void sendNameToServer() {
|
||||
// First, we validate the input.
|
||||
errorLabel.setText("");
|
||||
String textToServer = nameField.getText();
|
||||
if (!FieldVerifier.isValidName(textToServer)) {
|
||||
errorLabel.setText("Please enter at least four characters");
|
||||
return;
|
||||
}
|
||||
|
||||
// Then, we send the input to the server.
|
||||
sendButton.setEnabled(false);
|
||||
textToServerLabel.setText(textToServer);
|
||||
serverResponseLabel.setText("");
|
||||
greetingService.greetServer(textToServer,
|
||||
new AsyncCallback<GreetingResponse>() {
|
||||
public void onFailure(Throwable caught) {
|
||||
// Show the RPC error message to the user
|
||||
dialogBox
|
||||
.setText("Remote Procedure Call - Failure");
|
||||
serverResponseLabel
|
||||
.addStyleName("serverResponseLabelError");
|
||||
serverResponseLabel.setHTML(SERVER_ERROR);
|
||||
dialogBox.center();
|
||||
closeButton.setFocus(true);
|
||||
}
|
||||
// Then, we send the input to the server.
|
||||
sendButton.setEnabled(false);
|
||||
textToServerLabel.setText(textToServer);
|
||||
serverResponseLabel.setText("");
|
||||
greetingService.greetServer(textToServer,
|
||||
new AsyncCallback<GreetingResponse>() {
|
||||
public void onFailure(Throwable caught) {
|
||||
// Show the RPC error message to the user
|
||||
dialogBox
|
||||
.setText("Remote Procedure Call - Failure");
|
||||
serverResponseLabel
|
||||
.addStyleName("serverResponseLabelError");
|
||||
serverResponseLabel.setHTML(SERVER_ERROR);
|
||||
dialogBox.center();
|
||||
closeButton.setFocus(true);
|
||||
}
|
||||
|
||||
public void onSuccess(GreetingResponse result) {
|
||||
dialogBox.setText("Remote Procedure Call");
|
||||
serverResponseLabel
|
||||
.removeStyleName("serverResponseLabelError");
|
||||
serverResponseLabel.setHTML(new SafeHtmlBuilder()
|
||||
.appendEscaped(result.getGreeting())
|
||||
.appendHtmlConstant("<br><br>I am running ")
|
||||
.appendEscaped(result.getServerInfo())
|
||||
.appendHtmlConstant(".<br><br>It looks like you are using:<br>")
|
||||
.appendEscaped(result.getUserAgent())
|
||||
.toSafeHtml());
|
||||
dialogBox.center();
|
||||
closeButton.setFocus(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
public void onSuccess(GreetingResponse result) {
|
||||
dialogBox.setText("Remote Procedure Call");
|
||||
serverResponseLabel
|
||||
.removeStyleName("serverResponseLabelError");
|
||||
serverResponseLabel.setHTML(new SafeHtmlBuilder()
|
||||
.appendEscaped(result.getGreeting())
|
||||
.appendHtmlConstant("<br><br>I am running ")
|
||||
.appendEscaped(result.getServerInfo())
|
||||
.appendHtmlConstant(".<br><br>It looks like you are using:<br>")
|
||||
.appendEscaped(result.getUserAgent())
|
||||
.toSafeHtml());
|
||||
dialogBox.center();
|
||||
closeButton.setFocus(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Add a handler to send the name to the server
|
||||
MyHandler handler = new MyHandler();
|
||||
sendButton.addClickHandler(handler);
|
||||
nameField.addKeyUpHandler(handler);
|
||||
}
|
||||
// Add a handler to send the name to the server
|
||||
MyHandler handler = new MyHandler();
|
||||
sendButton.addClickHandler(handler);
|
||||
nameField.addKeyUpHandler(handler);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,24 +25,24 @@ import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
|||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class GreetingServiceImpl extends RemoteServiceServlet implements
|
||||
GreetingService {
|
||||
GreetingService {
|
||||
|
||||
public GreetingResponse greetServer(String input) throws IllegalArgumentException {
|
||||
// Verify that the input is valid.
|
||||
if (!FieldVerifier.isValidName(input)) {
|
||||
// If the input is not valid, throw an IllegalArgumentException back to
|
||||
// the client.
|
||||
throw new IllegalArgumentException(
|
||||
"Name must be at least 4 characters long");
|
||||
}
|
||||
public GreetingResponse greetServer(String input) throws IllegalArgumentException {
|
||||
// Verify that the input is valid.
|
||||
if (!FieldVerifier.isValidName(input)) {
|
||||
// If the input is not valid, throw an IllegalArgumentException back to
|
||||
// the client.
|
||||
throw new IllegalArgumentException(
|
||||
"Name must be at least 4 characters long");
|
||||
}
|
||||
|
||||
GreetingResponse response = new GreetingResponse();
|
||||
GreetingResponse response = new GreetingResponse();
|
||||
|
||||
response.setServerInfo(getServletContext().getServerInfo());
|
||||
response.setUserAgent(getThreadLocalRequest().getHeader("User-Agent"));
|
||||
response.setServerInfo(getServletContext().getServerInfo());
|
||||
response.setUserAgent(getThreadLocalRequest().getHeader("User-Agent"));
|
||||
|
||||
response.setGreeting("Hello, " + input + "!");
|
||||
response.setGreeting("Hello, " + input + "!");
|
||||
|
||||
return response;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,21 +40,21 @@ package org.olamy;
|
|||
*/
|
||||
public class FieldVerifier {
|
||||
|
||||
/**
|
||||
* Verifies that the specified name is valid for our service.
|
||||
*
|
||||
* In this example, we only require that the name is at least four
|
||||
* characters. In your application, you can use more complex checks to ensure
|
||||
* that usernames, passwords, email addresses, URLs, and other fields have the
|
||||
* proper syntax.
|
||||
*
|
||||
* @param name the name to validate
|
||||
* @return true if valid, false if invalid
|
||||
*/
|
||||
public static boolean isValidName(String name) {
|
||||
if (name == null) {
|
||||
return false;
|
||||
}
|
||||
return name.length() > 3;
|
||||
}
|
||||
/**
|
||||
* Verifies that the specified name is valid for our service.
|
||||
*
|
||||
* In this example, we only require that the name is at least four
|
||||
* characters. In your application, you can use more complex checks to ensure
|
||||
* that usernames, passwords, email addresses, URLs, and other fields have the
|
||||
* proper syntax.
|
||||
*
|
||||
* @param name the name to validate
|
||||
* @return true if valid, false if invalid
|
||||
*/
|
||||
public static boolean isValidName(String name) {
|
||||
if (name == null) {
|
||||
return false;
|
||||
}
|
||||
return name.length() > 3;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,31 +22,31 @@ import java.io.Serializable;
|
|||
|
||||
@SuppressWarnings("serial")
|
||||
public class GreetingResponse implements Serializable {
|
||||
private String greeting;
|
||||
private String serverInfo;
|
||||
private String userAgent;
|
||||
private String greeting;
|
||||
private String serverInfo;
|
||||
private String userAgent;
|
||||
|
||||
public String getGreeting() {
|
||||
return greeting;
|
||||
}
|
||||
public String getGreeting() {
|
||||
return greeting;
|
||||
}
|
||||
|
||||
public void setGreeting(String greeting) {
|
||||
this.greeting = greeting;
|
||||
}
|
||||
public void setGreeting(String greeting) {
|
||||
this.greeting = greeting;
|
||||
}
|
||||
|
||||
public String getServerInfo() {
|
||||
return serverInfo;
|
||||
}
|
||||
public String getServerInfo() {
|
||||
return serverInfo;
|
||||
}
|
||||
|
||||
public void setServerInfo(String serverInfo) {
|
||||
this.serverInfo = serverInfo;
|
||||
}
|
||||
public void setServerInfo(String serverInfo) {
|
||||
this.serverInfo = serverInfo;
|
||||
}
|
||||
|
||||
public String getUserAgent() {
|
||||
return userAgent;
|
||||
}
|
||||
public String getUserAgent() {
|
||||
return userAgent;
|
||||
}
|
||||
|
||||
public void setUserAgent(String userAgent) {
|
||||
this.userAgent = userAgent;
|
||||
}
|
||||
}
|
||||
public void setUserAgent(String userAgent) {
|
||||
this.userAgent = userAgent;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,5 +26,5 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
|
|||
*/
|
||||
@RemoteServiceRelativePath("greet")
|
||||
public interface GreetingService extends RemoteService {
|
||||
GreetingResponse greetServer(String name) throws IllegalArgumentException;
|
||||
GreetingResponse greetServer(String name) throws IllegalArgumentException;
|
||||
}
|
||||
|
|
|
@ -24,6 +24,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
|
|||
* The async counterpart of <code>GreetingService</code>.
|
||||
*/
|
||||
public interface GreetingServiceAsync {
|
||||
void greetServer(String input, AsyncCallback<GreetingResponse> callback)
|
||||
throws IllegalArgumentException;
|
||||
void greetServer(String input, AsyncCallback<GreetingResponse> callback)
|
||||
throws IllegalArgumentException;
|
||||
}
|
||||
|
|
|
@ -142,42 +142,42 @@ public class ServerInstanceWrapper
|
|||
|
||||
for (URL jettyConfiguration : jettyConfigurations)
|
||||
{
|
||||
try(Resource r = Resource.newResource(jettyConfiguration))
|
||||
{
|
||||
// Execute a Jetty configuration file
|
||||
if (!r.exists())
|
||||
{
|
||||
LOG.warn("File does not exist "+r);
|
||||
throw new IllegalStateException("No such jetty server config file: "+r);
|
||||
}
|
||||
try(Resource r = Resource.newResource(jettyConfiguration))
|
||||
{
|
||||
// Execute a Jetty configuration file
|
||||
if (!r.exists())
|
||||
{
|
||||
LOG.warn("File does not exist "+r);
|
||||
throw new IllegalStateException("No such jetty server config file: "+r);
|
||||
}
|
||||
|
||||
XmlConfiguration config = new XmlConfiguration(r.getURI().toURL());
|
||||
XmlConfiguration config = new XmlConfiguration(r.getURI().toURL());
|
||||
|
||||
config.getIdMap().putAll(id_map);
|
||||
config.getProperties().putAll(properties);
|
||||
config.getIdMap().putAll(id_map);
|
||||
config.getProperties().putAll(properties);
|
||||
|
||||
// #334062 compute the URL of the folder that contains the
|
||||
// conf file and set it as a property so we can compute relative paths
|
||||
// from it.
|
||||
String urlPath = jettyConfiguration.toString();
|
||||
int lastSlash = urlPath.lastIndexOf('/');
|
||||
if (lastSlash > 4)
|
||||
{
|
||||
urlPath = urlPath.substring(0, lastSlash);
|
||||
config.getProperties().put(PROPERTY_THIS_JETTY_XML_FOLDER_URL, urlPath);
|
||||
}
|
||||
// #334062 compute the URL of the folder that contains the
|
||||
// conf file and set it as a property so we can compute relative paths
|
||||
// from it.
|
||||
String urlPath = jettyConfiguration.toString();
|
||||
int lastSlash = urlPath.lastIndexOf('/');
|
||||
if (lastSlash > 4)
|
||||
{
|
||||
urlPath = urlPath.substring(0, lastSlash);
|
||||
config.getProperties().put(PROPERTY_THIS_JETTY_XML_FOLDER_URL, urlPath);
|
||||
}
|
||||
|
||||
Object o = config.configure();
|
||||
if (server == null)
|
||||
server = (Server)o;
|
||||
Object o = config.configure();
|
||||
if (server == null)
|
||||
server = (Server)o;
|
||||
|
||||
id_map = config.getIdMap();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOG.warn("Configuration error in " + jettyConfiguration);
|
||||
throw e;
|
||||
}
|
||||
id_map = config.getIdMap();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOG.warn("Configuration error in " + jettyConfiguration);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
return server;
|
||||
|
|
|
@ -749,13 +749,13 @@ public class HttpChannel implements Runnable, HttpOutput.Interceptor
|
|||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
onCompleted();
|
||||
try
|
||||
{
|
||||
onCompleted();
|
||||
}
|
||||
catch(Throwable e)
|
||||
{
|
||||
LOG.debug(e);
|
||||
LOG.debug(e);
|
||||
abort(e);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -440,7 +440,7 @@ public class GracefulStopTest
|
|||
}
|
||||
|
||||
static class TestHandler extends AbstractHandler
|
||||
{
|
||||
{
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
final AtomicReference<Throwable> thrown = new AtomicReference<Throwable>();
|
||||
final AtomicBoolean handling = new AtomicBoolean(false);
|
||||
|
|
|
@ -101,7 +101,7 @@ import org.eclipse.jetty.util.resource.ResourceFactory;
|
|||
*
|
||||
* pathInfoOnly If true, only the path info will be applied to the resourceBase
|
||||
*
|
||||
* stylesheet Set with the location of an optional stylesheet that will be used
|
||||
* stylesheet Set with the location of an optional stylesheet that will be used
|
||||
* to decorate the directory listing html.
|
||||
*
|
||||
* etags If True, weak etags will be generated and handled.
|
||||
|
|
|
@ -53,6 +53,7 @@ import javax.servlet.http.HttpServletResponseWrapper;
|
|||
import org.eclipse.jetty.server.Connector;
|
||||
import org.eclipse.jetty.server.DebugListener;
|
||||
import org.eclipse.jetty.server.HttpChannel;
|
||||
import org.eclipse.jetty.server.HttpChannel.Listener;
|
||||
import org.eclipse.jetty.server.QuietServletException;
|
||||
import org.eclipse.jetty.server.Request;
|
||||
import org.eclipse.jetty.server.RequestLog;
|
||||
|
@ -134,6 +135,16 @@ public class AsyncServletTest
|
|||
_port=_connector.getLocalPort();
|
||||
__history.clear();
|
||||
__latch=new CountDownLatch(1);
|
||||
|
||||
_connector.addBean(new HttpChannel.Listener()
|
||||
{
|
||||
@Override
|
||||
public void onComplete(Request request)
|
||||
{
|
||||
__latch.countDown();
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@After
|
||||
|
@ -1073,7 +1084,6 @@ public class AsyncServletTest
|
|||
public void onComplete(AsyncEvent event) throws IOException
|
||||
{
|
||||
historyAdd("onComplete");
|
||||
__latch.countDown();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -201,56 +201,56 @@ public class CrossOriginFilterTest
|
|||
@Test
|
||||
public void testSimpleRequestWithMatchingOriginAndNonMatchingTimingOrigin() throws Exception
|
||||
{
|
||||
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
|
||||
String origin = "http://localhost";
|
||||
String timingOrigin = "http://127.0.0.1";
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, timingOrigin);
|
||||
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
|
||||
|
||||
String request = "" +
|
||||
"GET / HTTP/1.1\r\n" +
|
||||
"Host: localhost\r\n" +
|
||||
"Connection: close\r\n" +
|
||||
"Origin: " + origin + "\r\n" +
|
||||
"\r\n";
|
||||
String response = tester.getResponses(request);
|
||||
Assert.assertTrue(response.contains("HTTP/1.1 200"));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
|
||||
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
|
||||
String origin = "http://localhost";
|
||||
String timingOrigin = "http://127.0.0.1";
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, timingOrigin);
|
||||
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
|
||||
|
||||
String request = "" +
|
||||
"GET / HTTP/1.1\r\n" +
|
||||
"Host: localhost\r\n" +
|
||||
"Connection: close\r\n" +
|
||||
"Origin: " + origin + "\r\n" +
|
||||
"\r\n";
|
||||
String response = tester.getResponses(request);
|
||||
Assert.assertTrue(response.contains("HTTP/1.1 200"));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
|
||||
Assert.assertFalse(response.contains(CrossOriginFilter.TIMING_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains("Vary"));
|
||||
Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
|
||||
Assert.assertTrue(response.contains("Vary"));
|
||||
Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleRequestWithMatchingOriginAndMatchingTimingOrigin() throws Exception
|
||||
{
|
||||
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
|
||||
String origin = "http://localhost";
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, origin);
|
||||
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
|
||||
|
||||
String request = "" +
|
||||
"GET / HTTP/1.1\r\n" +
|
||||
"Host: localhost\r\n" +
|
||||
"Connection: close\r\n" +
|
||||
"Origin: " + origin + "\r\n" +
|
||||
"\r\n";
|
||||
String response = tester.getResponses(request);
|
||||
Assert.assertTrue(response.contains("HTTP/1.1 200"));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.TIMING_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains("Vary"));
|
||||
Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
|
||||
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
|
||||
String origin = "http://localhost";
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, origin);
|
||||
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
|
||||
|
||||
String request = "" +
|
||||
"GET / HTTP/1.1\r\n" +
|
||||
"Host: localhost\r\n" +
|
||||
"Connection: close\r\n" +
|
||||
"Origin: " + origin + "\r\n" +
|
||||
"\r\n";
|
||||
String response = tester.getResponses(request);
|
||||
Assert.assertTrue(response.contains("HTTP/1.1 200"));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
|
||||
Assert.assertTrue(response.contains(CrossOriginFilter.TIMING_ALLOW_ORIGIN_HEADER));
|
||||
Assert.assertTrue(response.contains("Vary"));
|
||||
Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -137,7 +137,7 @@ public class ArrayUtil
|
|||
* @param <E> the array entry type
|
||||
*/
|
||||
public static<E> List<E> asMutableList(E[] array)
|
||||
{
|
||||
{
|
||||
if (array==null || array.length==0)
|
||||
return new ArrayList<E>();
|
||||
return new ArrayList<E>(Arrays.asList(array));
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* @(#)UnixCrypt.java 0.9 96/11/25
|
||||
* @(#)UnixCrypt.java 0.9 96/11/25
|
||||
*
|
||||
* Copyright (c) 1996 Aki Yoshida. All rights reserved.
|
||||
*
|
||||
|
@ -12,8 +12,8 @@
|
|||
/**
|
||||
* Unix crypt(3C) utility
|
||||
*
|
||||
* @version 0.9, 11/25/96
|
||||
* @author Aki Yoshida
|
||||
* @version 0.9, 11/25/96
|
||||
* @author Aki Yoshida
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
|
@ -43,7 +43,6 @@ import java.util.concurrent.atomic.AtomicLong;
|
|||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.servlet.AsyncContext;
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
@ -60,7 +59,6 @@ import org.eclipse.jetty.client.util.InputStreamResponseListener;
|
|||
import org.eclipse.jetty.client.util.OutputStreamContentProvider;
|
||||
import org.eclipse.jetty.http.HttpStatus;
|
||||
import org.eclipse.jetty.server.Request;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.server.ServerConnector;
|
||||
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
|
||||
|
@ -459,13 +457,12 @@ public class HttpClientStreamTest extends AbstractTest
|
|||
public void testInputStreamResponseListenerFailedBeforeResponse() throws Exception
|
||||
{
|
||||
start(new EmptyServerHandler());
|
||||
//int port = connector.getLocalPort();
|
||||
String uri = newURI();
|
||||
server.stop();
|
||||
|
||||
|
||||
InputStreamResponseListener listener = new InputStreamResponseListener();
|
||||
// Connect to the wrong port
|
||||
client.newRequest("localhost",
|
||||
(connector instanceof ServerConnector?ServerConnector.class.cast( connector ).getLocalPort():1))
|
||||
client.newRequest(uri)
|
||||
.scheme(getScheme())
|
||||
.send(listener);
|
||||
Result result = listener.await(5, TimeUnit.SECONDS);
|
||||
|
|
|
@ -105,7 +105,7 @@ public class TestListener implements HttpSessionListener, HttpSessionAttributeL
|
|||
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent sce)
|
||||
{
|
||||
{
|
||||
// System.err.println("contextInitialized "+sce);
|
||||
_called.put("contextInitialized",new Throwable());
|
||||
|
||||
|
|
Loading…
Reference in New Issue