just fix a messed up git mv
This commit is contained in:
parent
3d1e91f43d
commit
0bad6b5d17
|
@ -0,0 +1,29 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>example-async-rest</artifactId>
|
||||||
|
<version>9.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.eclipse.jetty.example-async-rest</groupId>
|
||||||
|
<artifactId>example-async-rest-jar</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>Example Async Rest :: Jar</name>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-client</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-util-ajax</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.orbit</groupId>
|
||||||
|
<artifactId>javax.servlet</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
|
@ -0,0 +1,121 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.example.asyncrest;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract Servlet implementation class AsyncRESTServlet.
|
||||||
|
* Enquires ebay REST service for auctions by key word.
|
||||||
|
* May be configured with init parameters: <dl>
|
||||||
|
* <dt>appid</dt><dd>The eBay application ID to use</dd>
|
||||||
|
* </dl>
|
||||||
|
* Each request examines the following request parameters:<dl>
|
||||||
|
* <dt>items</dt><dd>The keyword to search for</dd>
|
||||||
|
* </dl>
|
||||||
|
*/
|
||||||
|
public class AbstractRestServlet extends HttpServlet
|
||||||
|
{
|
||||||
|
protected final static String __DEFAULT_APPID = "Webtide81-adf4-4f0a-ad58-d91e41bbe85";
|
||||||
|
protected final static String STYLE =
|
||||||
|
"<style type='text/css'>"+
|
||||||
|
" img.thumb:hover {height:50px}"+
|
||||||
|
" img.thumb {vertical-align:text-top}"+
|
||||||
|
" span.red {color: #ff0000}"+
|
||||||
|
" span.green {color: #00ff00}"+
|
||||||
|
" iframe {border: 0px}"+
|
||||||
|
"</style>";
|
||||||
|
|
||||||
|
protected final static String ITEMS_PARAM = "items";
|
||||||
|
protected final static String APPID_PARAM = "appid";
|
||||||
|
|
||||||
|
protected String _appid;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(ServletConfig servletConfig) throws ServletException
|
||||||
|
{
|
||||||
|
if (servletConfig.getInitParameter(APPID_PARAM) == null)
|
||||||
|
_appid = __DEFAULT_APPID;
|
||||||
|
else
|
||||||
|
_appid = servletConfig.getInitParameter(APPID_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String restURL(String item)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return ("http://open.api.ebay.com/shopping?MaxEntries=3&appid=" + _appid +
|
||||||
|
"&version=573&siteid=0&callname=FindItems&responseencoding=JSON&QueryKeywords=" +
|
||||||
|
URLEncoder.encode(item,"UTF-8"));
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String generateThumbs(Queue<Map<String,String>> results)
|
||||||
|
{
|
||||||
|
StringBuilder thumbs = new StringBuilder();
|
||||||
|
for (Map<String, String> m : results)
|
||||||
|
{
|
||||||
|
if (!m.containsKey("GalleryURL"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
thumbs.append("<a href=\""+m.get("ViewItemURLForNaturalSearch")+"\">");
|
||||||
|
thumbs.append("<img class='thumb' border='1px' height='25px'"+
|
||||||
|
" src='"+m.get("GalleryURL")+"'"+
|
||||||
|
" title='"+m.get("Title")+"'"+
|
||||||
|
"/>");
|
||||||
|
thumbs.append("</a> ");
|
||||||
|
}
|
||||||
|
return thumbs.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String ms(long nano)
|
||||||
|
{
|
||||||
|
BigDecimal dec = new BigDecimal(nano);
|
||||||
|
return dec.divide(new BigDecimal(1000000L)).setScale(1,RoundingMode.UP).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int width(long nano)
|
||||||
|
{
|
||||||
|
int w=(int)((nano+999999L)/5000000L);
|
||||||
|
if (w==0)
|
||||||
|
w=2;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
doGet(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,228 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.example.asyncrest;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
import javax.servlet.AsyncContext;
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.client.HttpClient;
|
||||||
|
import org.eclipse.jetty.client.api.Response;
|
||||||
|
import org.eclipse.jetty.client.api.Result;
|
||||||
|
import org.eclipse.jetty.http.HttpMethod;
|
||||||
|
import org.eclipse.jetty.util.BufferUtil;
|
||||||
|
import org.eclipse.jetty.util.Utf8StringBuilder;
|
||||||
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Servlet implementation class AsyncRESTServlet.
|
||||||
|
* Enquires ebay REST service for auctions by key word.
|
||||||
|
* May be configured with init parameters: <dl>
|
||||||
|
* <dt>appid</dt><dd>The eBay application ID to use</dd>
|
||||||
|
* </dl>
|
||||||
|
* Each request examines the following request parameters:<dl>
|
||||||
|
* <dt>items</dt><dd>The keyword to search for</dd>
|
||||||
|
* </dl>
|
||||||
|
*/
|
||||||
|
public class AsyncRestServlet extends AbstractRestServlet
|
||||||
|
{
|
||||||
|
final static String RESULTS_ATTR = "org.eclipse.jetty.demo.client";
|
||||||
|
final static String DURATION_ATTR = "org.eclipse.jetty.demo.duration";
|
||||||
|
final static String START_ATTR = "org.eclispe.jetty.demo.start";
|
||||||
|
|
||||||
|
HttpClient _client;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(ServletConfig servletConfig) throws ServletException
|
||||||
|
{
|
||||||
|
super.init(servletConfig);
|
||||||
|
|
||||||
|
_client = new HttpClient();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_client.start();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new ServletException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
Long start=System.nanoTime();
|
||||||
|
|
||||||
|
// Do we have results yet?
|
||||||
|
Queue<Map<String, String>> results = (Queue<Map<String, String>>) request.getAttribute(RESULTS_ATTR);
|
||||||
|
|
||||||
|
// If no results, this must be the first dispatch, so send the REST request(s)
|
||||||
|
if (results==null)
|
||||||
|
{
|
||||||
|
// define results data structures
|
||||||
|
final Queue<Map<String, String>> resultsQueue = new ConcurrentLinkedQueue<Map<String,String>>();
|
||||||
|
request.setAttribute(RESULTS_ATTR, results=resultsQueue);
|
||||||
|
|
||||||
|
// suspend the request
|
||||||
|
// This is done before scheduling async handling to avoid race of
|
||||||
|
// dispatch before startAsync!
|
||||||
|
final AsyncContext async = request.startAsync();
|
||||||
|
async.setTimeout(30000);
|
||||||
|
|
||||||
|
// extract keywords to search for
|
||||||
|
String[] keywords=request.getParameter(ITEMS_PARAM).split(",");
|
||||||
|
final AtomicInteger outstanding=new AtomicInteger(keywords.length);
|
||||||
|
|
||||||
|
// Send request each keyword
|
||||||
|
for (final String item:keywords)
|
||||||
|
{
|
||||||
|
_client.newRequest(restURL(item)).method(HttpMethod.GET).send(
|
||||||
|
new AsyncRestRequest()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
void onAuctionFound(Map<String,String> auction)
|
||||||
|
{
|
||||||
|
resultsQueue.add(auction);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
void onComplete()
|
||||||
|
{
|
||||||
|
if (outstanding.decrementAndGet()<=0)
|
||||||
|
async.dispatch();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// save timing info and return
|
||||||
|
request.setAttribute(START_ATTR, start);
|
||||||
|
request.setAttribute(DURATION_ATTR, new Long(System.nanoTime() - start));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have results!
|
||||||
|
|
||||||
|
// Generate the response
|
||||||
|
String thumbs = generateThumbs(results);
|
||||||
|
|
||||||
|
response.setContentType("text/html");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.println("<html><head>");
|
||||||
|
out.println(STYLE);
|
||||||
|
out.println("</head><body><small>");
|
||||||
|
|
||||||
|
long initial = (Long) request.getAttribute(DURATION_ATTR);
|
||||||
|
long start0 = (Long) request.getAttribute(START_ATTR);
|
||||||
|
|
||||||
|
long now = System.nanoTime();
|
||||||
|
long total=now-start0;
|
||||||
|
long generate=now-start;
|
||||||
|
long thread=initial+generate;
|
||||||
|
|
||||||
|
out.print("<b>Asynchronous: "+request.getParameter(ITEMS_PARAM)+"</b><br/>");
|
||||||
|
out.print("Total Time: "+ms(total)+"ms<br/>");
|
||||||
|
|
||||||
|
out.print("Thread held (<span class='red'>red</span>): "+ms(thread)+"ms (" + ms(initial) + " initial + " + ms(generate) + " generate )<br/>");
|
||||||
|
out.print("Async wait (<span class='green'>green</span>): "+ms(total-thread)+"ms<br/>");
|
||||||
|
|
||||||
|
out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(initial)+"px'>"+
|
||||||
|
"<img border='0px' src='asyncrest/green.png' height='20px' width='"+width(total-thread)+"px'>"+
|
||||||
|
"<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(generate)+"px'>");
|
||||||
|
|
||||||
|
out.println("<hr />");
|
||||||
|
out.println(thumbs);
|
||||||
|
out.println("</small>");
|
||||||
|
out.println("</body></html>");
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private abstract class AsyncRestRequest implements Response.Listener
|
||||||
|
{
|
||||||
|
final Utf8StringBuilder _content = new Utf8StringBuilder();
|
||||||
|
|
||||||
|
AsyncRestRequest()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBegin(Response response)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onHeaders(Response response)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onContent(Response response, ByteBuffer content)
|
||||||
|
{
|
||||||
|
byte[] bytes = BufferUtil.toArray(content);
|
||||||
|
_content.append(bytes,0,bytes.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Response response)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Response response, Throwable failure)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onComplete(Result result)
|
||||||
|
{
|
||||||
|
// extract auctions from the results
|
||||||
|
Map<String,?> query = (Map<String,?>) JSON.parse(_content.toString());
|
||||||
|
Object[] auctions = (Object[]) query.get("Item");
|
||||||
|
if (auctions != null)
|
||||||
|
{
|
||||||
|
for (Object o : auctions)
|
||||||
|
onAuctionFound((Map<String,String>)o);
|
||||||
|
}
|
||||||
|
onComplete();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract void onAuctionFound(Map<String,String> details);
|
||||||
|
abstract void onComplete();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
doGet(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.example.asyncrest;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Servlet implementation class SerialRestServlet
|
||||||
|
*/
|
||||||
|
public class SerialRestServlet extends AbstractRestServlet
|
||||||
|
{
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
long start = System.nanoTime();
|
||||||
|
|
||||||
|
|
||||||
|
String[] keywords=request.getParameter(ITEMS_PARAM).split(",");
|
||||||
|
Queue<Map<String,String>> results = new LinkedList<Map<String,String>>();
|
||||||
|
|
||||||
|
// make all requests serially
|
||||||
|
for (String itemName : keywords)
|
||||||
|
{
|
||||||
|
URL url = new URL(restURL(itemName));
|
||||||
|
|
||||||
|
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
|
||||||
|
connection.setRequestMethod("GET");
|
||||||
|
|
||||||
|
Map query = (Map)JSON.parse(new BufferedReader(new InputStreamReader(connection.getInputStream())));
|
||||||
|
Object[] auctions = (Object[]) query.get("Item");
|
||||||
|
if (auctions != null)
|
||||||
|
{
|
||||||
|
for (Object o : auctions)
|
||||||
|
results.add((Map) o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Generate the response
|
||||||
|
String thumbs=generateThumbs(results);
|
||||||
|
|
||||||
|
response.setContentType("text/html");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.println("<html><head>");
|
||||||
|
out.println(STYLE);
|
||||||
|
out.println("</head><body><small>");
|
||||||
|
|
||||||
|
long now = System.nanoTime();
|
||||||
|
long total=now-start;
|
||||||
|
|
||||||
|
out.print("<b>Blocking: "+request.getParameter(ITEMS_PARAM)+"</b><br/>");
|
||||||
|
out.print("Total Time: "+ms(total)+"ms<br/>");
|
||||||
|
out.print("Thread held (<span class='red'>red</span>): "+ms(total)+"ms<br/>");
|
||||||
|
|
||||||
|
out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(total)+"px'>");
|
||||||
|
|
||||||
|
out.println("<hr />");
|
||||||
|
out.println(thumbs);
|
||||||
|
out.println("</small>");
|
||||||
|
out.println("</body></html>");
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
|
||||||
|
* response)
|
||||||
|
*/
|
||||||
|
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
doGet(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style type='text/css'>
|
||||||
|
iframe {border: 0px}
|
||||||
|
table, tr, td {border: 0px}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Blocking vs Asynchronous REST</h1>
|
||||||
|
<p>
|
||||||
|
This demo calls the EBay WS API both synchronously and asynchronously,
|
||||||
|
to obtain items matching each of the keywords passed on the query
|
||||||
|
string. The time the request thread is head is displayed for both.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<table width='100%'>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<iframe id="f1" width='100%' height='175px' src="testSerial?items=kayak"></iframe>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<iframe id="f3" width='100%' height='175px' src="testSerial?items=mouse,beer,gnome"></iframe>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<iframe id="f2" width='100%' height='175px' src="testAsync?items=kayak"/></iframe>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<iframe id="f4" width='100%' height='175px' src="testAsync?items=mouse,beer,gnome"/></iframe>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
Binary file not shown.
After Width: | Height: | Size: 166 B |
Binary file not shown.
After Width: | Height: | Size: 164 B |
|
@ -0,0 +1,22 @@
|
||||||
|
<web-fragment>
|
||||||
|
<servlet>
|
||||||
|
<display-name>SerialRestServlet</display-name>
|
||||||
|
<servlet-name>SerialRestServlet</servlet-name>
|
||||||
|
<servlet-class>org.eclipse.jetty.example.asyncrest.SerialRestServlet</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>SerialRestServlet</servlet-name>
|
||||||
|
<url-pattern>/testSerial</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<display-name>AsyncRestServlet</display-name>
|
||||||
|
<servlet-name>AsyncRestServlet</servlet-name>
|
||||||
|
<servlet-class>org.eclipse.jetty.example.asyncrest.AsyncRestServlet</servlet-class>
|
||||||
|
<async-supported>true</async-supported>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>AsyncRestServlet</servlet-name>
|
||||||
|
<url-pattern>/testAsync</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
</web-fragment>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>example-async-rest</artifactId>
|
||||||
|
<version>9.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.eclipse.jetty.example-async-rest</groupId>
|
||||||
|
<artifactId>example-async-rest-webapp</artifactId>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
<name>Example Async Rest :: Webapp</name>
|
||||||
|
<build>
|
||||||
|
<finalName>async-rest</finalName>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.example-async-rest</groupId>
|
||||||
|
<artifactId>example-async-rest-jar</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-webapp</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.orbit</groupId>
|
||||||
|
<artifactId>javax.servlet</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Class-Path:
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
|
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This is the jetty specific web application configuration file. When starting
|
||||||
|
a Web Application, the WEB-INF/jetty-web.xml file is looked for and if found, treated
|
||||||
|
as a org.eclipse.jetty.server.server.xml.XmlConfiguration file and is applied to the
|
||||||
|
org.eclipse.jetty.servlet.WebApplicationContext object
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
|
||||||
|
<Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
|
||||||
|
<Call name="warn"><Arg>async-rest webapp is deployed. DO NOT USE IN PRODUCTION!</Arg></Call>
|
||||||
|
</Get>
|
||||||
|
</Configure>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
|
||||||
|
version="3.0">
|
||||||
|
|
||||||
|
<display-name>Async REST Webservice Example</display-name>
|
||||||
|
|
||||||
|
</web-app>
|
|
@ -0,0 +1,44 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style type='text/css'>
|
||||||
|
iframe {border: 0px}
|
||||||
|
table, tr, td {border: 0px}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Blocking vs Asynchronous REST</h1>
|
||||||
|
<p>
|
||||||
|
This demo calls the EBay WS API both synchronously and asynchronously,
|
||||||
|
to obtain items matching each of the keywords passed on the query
|
||||||
|
string. The time the request thread is held by the servlet is displayed in red for both.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<table width='100%'>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<iframe id="f1" width='100%' height='175px' src="testSerial?items=kayak"></iframe>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<iframe id="f3" width='100%' height='175px' src="testSerial?items=mouse,beer,gnome"></iframe>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<iframe id="f2" width='100%' height='175px' src="testAsync?items=kayak"/></iframe>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<iframe id="f4" width='100%' height='175px' src="testAsync?items=mouse,beer,gnome"/></iframe>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
By the use of Asynchronous Servlets and the Jetty Asychronous client, the server is able to release the thread (green) while
|
||||||
|
waiting for the response from Ebay. This thread goes back into the thread pool and can service many other requests during the wait.
|
||||||
|
This greatly reduces the number of threads needed, which in turn greatly reduces the memory requirements of the server.
|
||||||
|
<p>
|
||||||
|
Press reload to see even better results after JIT and TCP/IP warmup!
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,43 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.example.asyncrest;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
|
public class DemoServer
|
||||||
|
{
|
||||||
|
public static void main(String[] args)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
String jetty_home = System.getProperty("jetty.home",".");
|
||||||
|
|
||||||
|
Server server = new Server(Integer.getInteger("jetty.port",8080).intValue());
|
||||||
|
|
||||||
|
WebAppContext webapp = new WebAppContext();
|
||||||
|
webapp.setContextPath("/");
|
||||||
|
webapp.setWar(jetty_home+"/target/async-rest/");
|
||||||
|
webapp.setParentLoaderPriority(true);
|
||||||
|
webapp.setServerClasses(new String[]{});
|
||||||
|
server.setHandler(webapp);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-project</artifactId>
|
||||||
|
<version>9.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>example-async-rest</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<name>Example Async Rest</name>
|
||||||
|
<modules>
|
||||||
|
<module>async-rest-jar</module>
|
||||||
|
<module>async-rest-webapp</module>
|
||||||
|
</modules>
|
||||||
|
</project>
|
|
@ -0,0 +1,58 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-project</artifactId>
|
||||||
|
<version>9.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>example-jetty-embedded</artifactId>
|
||||||
|
<name>Example :: Jetty Embedded</name>
|
||||||
|
<description>Jetty Embedded Examples</description>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-util-ajax</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-webapp</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-security</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-servlets</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-deploy</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-jmx</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.websocket</groupId>
|
||||||
|
<artifactId>websocket-server</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.spdy</groupId>
|
||||||
|
<artifactId>spdy-http-server</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.toolchain</groupId>
|
||||||
|
<artifactId>jetty-test-helper</artifactId>
|
||||||
|
<!-- scope>test</scope-->
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
|
@ -0,0 +1,17 @@
|
||||||
|
#HSQL Database Engine 1.8.0.10
|
||||||
|
#Mon Nov 08 13:35:35 EST 2010
|
||||||
|
hsqldb.script_format=0
|
||||||
|
runtime.gc_interval=0
|
||||||
|
sql.enforce_strict_size=false
|
||||||
|
hsqldb.cache_size_scale=8
|
||||||
|
readonly=false
|
||||||
|
hsqldb.nio_data_file=true
|
||||||
|
hsqldb.cache_scale=14
|
||||||
|
version=1.8.0
|
||||||
|
hsqldb.default_table_type=memory
|
||||||
|
hsqldb.cache_file_scale=1
|
||||||
|
hsqldb.log_size=200
|
||||||
|
modified=no
|
||||||
|
hsqldb.cache_version=1.7.0
|
||||||
|
hsqldb.original_version=1.8.0
|
||||||
|
hsqldb.compatible_version=1.8.0
|
|
@ -0,0 +1,4 @@
|
||||||
|
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
|
||||||
|
CREATE USER SA PASSWORD ""
|
||||||
|
GRANT DBA TO SA
|
||||||
|
SET WRITE_DELAY 10
|
|
@ -0,0 +1,47 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.IOException;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class DumpServlet extends HttpServlet
|
||||||
|
{
|
||||||
|
public DumpServlet()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
response.setContentType("text/html");
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
response.getWriter().println("<h1>DumpServlet</h1><pre>");
|
||||||
|
response.getWriter().println("requestURI=" + request.getRequestURI());
|
||||||
|
response.getWriter().println("contextPath=" + request.getContextPath());
|
||||||
|
response.getWriter().println("servletPath=" + request.getServletPath());
|
||||||
|
response.getWriter().println("pathInfo=" + request.getPathInfo());
|
||||||
|
response.getWriter().println("session=" + request.getSession(true).getId());
|
||||||
|
response.getWriter().println("</pre>");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerList;
|
||||||
|
import org.eclipse.jetty.server.handler.ResourceHandler;
|
||||||
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
import org.eclipse.jetty.util.log.Logger;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/** Simple Jetty FileServer.
|
||||||
|
* This is a simple example of Jetty configured as a FileServer.
|
||||||
|
*
|
||||||
|
* File server Usage - java org.eclipse.jetty.server.example.FileServer [ port [
|
||||||
|
* docroot ]]
|
||||||
|
*
|
||||||
|
* @see FileServerXml for the equivalent example done in XML configuration.
|
||||||
|
* @author gregw
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class FileServer
|
||||||
|
{
|
||||||
|
private static final Logger LOG = Log.getLogger(FileServer.class);
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(args.length == 0?8080:Integer.parseInt(args[0]));
|
||||||
|
|
||||||
|
ResourceHandler resource_handler = new ResourceHandler();
|
||||||
|
resource_handler.setDirectoriesListed(true);
|
||||||
|
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
|
||||||
|
|
||||||
|
resource_handler.setResourceBase(args.length == 2?args[1]:".");
|
||||||
|
LOG.info("serving " + resource_handler.getBaseResource());
|
||||||
|
|
||||||
|
HandlerList handlers = new HandlerList();
|
||||||
|
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
|
||||||
|
server.setHandler(handlers);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Server;
|
||||||
|
import org.eclipse.jetty.util.resource.Resource;
|
||||||
|
import org.eclipse.jetty.xml.XmlConfiguration;
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/** A Jetty FileServer.
|
||||||
|
* This server is identical to {@link FileServer}, except that it
|
||||||
|
* is configured via an {@link XmlConfiguration} config file that
|
||||||
|
* does the identical work.
|
||||||
|
* <p>
|
||||||
|
* See <a href="http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/example-jetty-embedded/src/main/resources/fileserver.xml">fileserver.xml</a>
|
||||||
|
*/
|
||||||
|
public class FileServerXml
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Resource fileserver_xml = Resource.newSystemResource("fileserver.xml");
|
||||||
|
XmlConfiguration configuration = new XmlConfiguration(fileserver_xml.getInputStream());
|
||||||
|
Server server = (Server)configuration.configure();
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.IOException;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||||
|
|
||||||
|
public class HelloHandler extends AbstractHandler
|
||||||
|
{
|
||||||
|
final String _greeting;
|
||||||
|
final String _body;
|
||||||
|
|
||||||
|
public HelloHandler()
|
||||||
|
{
|
||||||
|
_greeting="Hello World";
|
||||||
|
_body=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HelloHandler(String greeting)
|
||||||
|
{
|
||||||
|
_greeting=greeting;
|
||||||
|
_body=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HelloHandler(String greeting,String body)
|
||||||
|
{
|
||||||
|
_greeting=greeting;
|
||||||
|
_body=body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
response.setContentType("text/html;charset=utf-8");
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
baseRequest.setHandled(true);
|
||||||
|
|
||||||
|
response.getWriter().println("<h1>"+_greeting+"</h1>");
|
||||||
|
if (_body!=null)
|
||||||
|
response.getWriter().println(_body);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.IOException;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class HelloServlet extends HttpServlet
|
||||||
|
{
|
||||||
|
String greeting = "Hello";
|
||||||
|
|
||||||
|
public HelloServlet()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public HelloServlet(String hi)
|
||||||
|
{
|
||||||
|
greeting = hi;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
response.setContentType("text/html");
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
response.getWriter().println("<h1>" + greeting + " from HelloServlet</h1>");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,127 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.lang.management.ManagementFactory;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.deploy.DeploymentManager;
|
||||||
|
import org.eclipse.jetty.deploy.providers.WebAppProvider;
|
||||||
|
import org.eclipse.jetty.jmx.MBeanContainer;
|
||||||
|
import org.eclipse.jetty.security.HashLoginService;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.NCSARequestLog;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerCollection;
|
||||||
|
import org.eclipse.jetty.server.handler.RequestLogHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.StatisticsHandler;
|
||||||
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
|
||||||
|
public class LikeJettyXml
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
String jetty_home = System.getProperty("jetty.home","../jetty-distribution/target/distribution");
|
||||||
|
System.setProperty("jetty.home",jetty_home);
|
||||||
|
|
||||||
|
// Setup Threadpool
|
||||||
|
QueuedThreadPool threadPool = new QueuedThreadPool();
|
||||||
|
threadPool.setMaxThreads(500);
|
||||||
|
|
||||||
|
Server server = new Server(threadPool);
|
||||||
|
server.manage(threadPool);
|
||||||
|
server.setDumpAfterStart(false);
|
||||||
|
server.setDumpBeforeStop(false);
|
||||||
|
|
||||||
|
// Setup JMX
|
||||||
|
MBeanContainer mbContainer=new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
|
||||||
|
server.addBean(mbContainer);
|
||||||
|
|
||||||
|
// Setup Connectors
|
||||||
|
HttpConnectionFactory http = new HttpConnectionFactory();
|
||||||
|
http.getHttpChannelConfig().setSecurePort(8443);
|
||||||
|
ServerConnector connector = new ServerConnector(server,http);
|
||||||
|
connector.setPort(8080);
|
||||||
|
connector.setIdleTimeout(30000);
|
||||||
|
|
||||||
|
server.addConnector(connector);
|
||||||
|
|
||||||
|
SslContextFactory sslContextFactory = new SslContextFactory();
|
||||||
|
sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
|
||||||
|
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
|
||||||
|
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
|
||||||
|
sslContextFactory.setTrustStorePath(jetty_home + "/etc/keystore");
|
||||||
|
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");
|
||||||
|
ServerConnector sslConnector = new ServerConnector(server,sslContextFactory);
|
||||||
|
sslConnector.setPort(8443);
|
||||||
|
server.addConnector(sslConnector);
|
||||||
|
sslConnector.open();
|
||||||
|
|
||||||
|
HandlerCollection handlers = new HandlerCollection();
|
||||||
|
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
||||||
|
RequestLogHandler requestLogHandler = new RequestLogHandler();
|
||||||
|
|
||||||
|
handlers.setHandlers(new Handler[] { contexts, new DefaultHandler(), requestLogHandler });
|
||||||
|
|
||||||
|
StatisticsHandler stats = new StatisticsHandler();
|
||||||
|
stats.setHandler(handlers);
|
||||||
|
|
||||||
|
server.setHandler(stats);
|
||||||
|
|
||||||
|
// Setup deployers
|
||||||
|
DeploymentManager deployer = new DeploymentManager();
|
||||||
|
deployer.setContexts(contexts);
|
||||||
|
server.addBean(deployer);
|
||||||
|
|
||||||
|
WebAppProvider webapp_provider = new WebAppProvider();
|
||||||
|
webapp_provider.setMonitoredDirName(jetty_home + "/webapps");
|
||||||
|
webapp_provider.setParentLoaderPriority(false);
|
||||||
|
webapp_provider.setExtractWars(true);
|
||||||
|
webapp_provider.setScanInterval(2);
|
||||||
|
webapp_provider.setDefaultsDescriptor(jetty_home + "/etc/webdefault.xml");
|
||||||
|
deployer.addAppProvider(webapp_provider);
|
||||||
|
|
||||||
|
HashLoginService login = new HashLoginService();
|
||||||
|
login.setName("Test Realm");
|
||||||
|
login.setConfig(jetty_home + "/etc/realm.properties");
|
||||||
|
server.addBean(login);
|
||||||
|
|
||||||
|
NCSARequestLog requestLog = new NCSARequestLog(jetty_home + "/logs/jetty-yyyy_mm_dd.log");
|
||||||
|
requestLog.setExtended(false);
|
||||||
|
requestLogHandler.setRequestLog(requestLog);
|
||||||
|
|
||||||
|
server.setStopAtShutdown(true);
|
||||||
|
server.setSendServerVersion(true);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.io.ArrayByteBufferPool;
|
||||||
|
import org.eclipse.jetty.io.ByteBufferPool;
|
||||||
|
import org.eclipse.jetty.server.Connector;
|
||||||
|
import org.eclipse.jetty.server.ForwardedRequestCustomizer;
|
||||||
|
import org.eclipse.jetty.server.HttpChannelConfig;
|
||||||
|
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.SecureRequestCustomizer;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.SslConnectionFactory;
|
||||||
|
import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
|
||||||
|
import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
|
||||||
|
import org.eclipse.jetty.spdy.server.http.PushStrategy;
|
||||||
|
import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
|
||||||
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
import org.eclipse.jetty.util.thread.TimerScheduler;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* A Jetty server with multiple connectors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ManyConnectors
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
String jetty_home = System.getProperty("jetty.home","../jetty-server/src/main/config");
|
||||||
|
System.setProperty("jetty.home", jetty_home);
|
||||||
|
|
||||||
|
Server server = new Server();
|
||||||
|
|
||||||
|
// HTTP connector
|
||||||
|
ServerConnector connector0 = new ServerConnector(server);
|
||||||
|
connector0.setPort(8080);
|
||||||
|
connector0.setIdleTimeout(30000);
|
||||||
|
|
||||||
|
// HTTPS connector
|
||||||
|
SslContextFactory sslContextFactory = new SslContextFactory();
|
||||||
|
sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
|
||||||
|
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
|
||||||
|
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
|
||||||
|
|
||||||
|
ServerConnector connector1 = new ServerConnector(server,sslContextFactory);
|
||||||
|
connector1.setPort(8443);
|
||||||
|
|
||||||
|
|
||||||
|
// A verbosely fully configured connector with SSL, SPDY and HTTP
|
||||||
|
|
||||||
|
HttpChannelConfig config = new HttpChannelConfig();
|
||||||
|
config.setSecureScheme("https");
|
||||||
|
config.setSecurePort(8443);
|
||||||
|
config.setOutputBufferSize(32768);
|
||||||
|
config.setRequestHeaderSize(8192);
|
||||||
|
config.setResponseHeaderSize(8192);
|
||||||
|
config.addCustomizer(new ForwardedRequestCustomizer());
|
||||||
|
config.addCustomizer(new SecureRequestCustomizer());
|
||||||
|
|
||||||
|
HttpConnectionFactory http = new HttpConnectionFactory(config);
|
||||||
|
http.setInputBufferSize(16384);
|
||||||
|
|
||||||
|
PushStrategy push = new ReferrerPushStrategy();
|
||||||
|
HTTPSPDYServerConnectionFactory spdy2 = new HTTPSPDYServerConnectionFactory(2,config,push);
|
||||||
|
spdy2.setInputBufferSize(8192);
|
||||||
|
spdy2.setInitialWindowSize(32768);
|
||||||
|
|
||||||
|
HTTPSPDYServerConnectionFactory spdy3 = new HTTPSPDYServerConnectionFactory(3,config,push);
|
||||||
|
spdy2.setInputBufferSize(8192);
|
||||||
|
|
||||||
|
NPNServerConnectionFactory npn = new NPNServerConnectionFactory(spdy3.getProtocol(),spdy2.getProtocol(),http.getProtocol());
|
||||||
|
npn.setDefaultProtocol(http.getProtocol());
|
||||||
|
npn.setInputBufferSize(1024);
|
||||||
|
|
||||||
|
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,npn.getProtocol());
|
||||||
|
|
||||||
|
QueuedThreadPool threadPool = new QueuedThreadPool();
|
||||||
|
threadPool.setMaxThreads(256);
|
||||||
|
TimerScheduler scheduler = new TimerScheduler();
|
||||||
|
ByteBufferPool bufferPool= new ArrayByteBufferPool(32,4096,32768);
|
||||||
|
|
||||||
|
ServerConnector connector2 = new ServerConnector(server,threadPool,scheduler,bufferPool,2,2,ssl,npn,spdy3,spdy2,http);
|
||||||
|
connector2.setDefaultProtocol("ssl-npn");
|
||||||
|
connector2.setPort(8444);
|
||||||
|
connector2.setIdleTimeout(30000);
|
||||||
|
connector2.setSoLingerTime(10000);
|
||||||
|
|
||||||
|
// Set the connectors
|
||||||
|
server.setConnectors(new Connector[] { connector0, connector1, connector2 });
|
||||||
|
|
||||||
|
|
||||||
|
server.setHandler(new HelloHandler());
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.dumpStdErr();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Connector;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* A {@link ContextHandlerCollection} handler may be used to direct a request to
|
||||||
|
* a specific Context. The URI path prefix and optional virtual host is used to
|
||||||
|
* select the context.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ManyContexts
|
||||||
|
{
|
||||||
|
public final static String BODY=
|
||||||
|
"<a href='/'>root context</a><br/>"+
|
||||||
|
"<a href='http://127.0.0.1:8080/context'>normal context</a><br/>"+
|
||||||
|
"<a href='http://127.0.0.2:8080/context'>virtual context</a><br/>";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server();
|
||||||
|
ServerConnector connector = new ServerConnector(server);
|
||||||
|
connector.setPort(8080);
|
||||||
|
server.setConnectors(new Connector[]
|
||||||
|
{ connector });
|
||||||
|
|
||||||
|
ContextHandler context0 = new ContextHandler();
|
||||||
|
context0.setContextPath("/");
|
||||||
|
Handler handler0 = new HelloHandler("Root Context",BODY);
|
||||||
|
context0.setHandler(handler0);
|
||||||
|
|
||||||
|
ContextHandler context1 = new ContextHandler();
|
||||||
|
context1.setContextPath("/context");
|
||||||
|
Handler handler1 = new HelloHandler("A Context",BODY);
|
||||||
|
context1.setHandler(handler1);
|
||||||
|
|
||||||
|
ContextHandler context2 = new ContextHandler();
|
||||||
|
context2.setContextPath("/context");
|
||||||
|
context2.setVirtualHosts(new String[]
|
||||||
|
{ "127.0.0.2" });
|
||||||
|
Handler handler2 = new HelloHandler("A Virtual Context",BODY);
|
||||||
|
context2.setHandler(handler2);
|
||||||
|
|
||||||
|
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
||||||
|
contexts.setHandlers(new Handler[]
|
||||||
|
{ context0, context1, context2 });
|
||||||
|
|
||||||
|
server.setHandler(contexts);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
System.err.println(server.dump());
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,123 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.NCSARequestLog;
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerCollection;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerList;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerWrapper;
|
||||||
|
import org.eclipse.jetty.server.handler.RequestLogHandler;
|
||||||
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* Frequently many handlers are combined together to handle different aspects of
|
||||||
|
* a request. A handler may:
|
||||||
|
* <ul>
|
||||||
|
* <li>handle the request and completely generate the response
|
||||||
|
* <li>partially handle the request, but defer response generation to another
|
||||||
|
* handler.
|
||||||
|
* <li>select another handler to pass the request to.
|
||||||
|
* <li>use business logic to decide to do one of the above.
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* Multiple handlers may be combined with:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@link HandlerWrapper} which will nest one handler inside another. In
|
||||||
|
* this example, the HelloHandler is nested inside a HandlerWrapper that sets
|
||||||
|
* the greeting as a request attribute.
|
||||||
|
* <li>{@link HandlerList} which will call a collection of handlers until the
|
||||||
|
* request is marked as handled. In this example, a list is used to combine the
|
||||||
|
* param handler (which only handles the request if there are parameters) and
|
||||||
|
* the wrapper handler. Frequently handler lists are terminated with the
|
||||||
|
* {@link DefaultHandler}, which will generate a suitable 404 response if the
|
||||||
|
* request has not been handled.
|
||||||
|
* <li>{@link HandlerCollection} which will call each handler regardless if the
|
||||||
|
* request has been handled or not. Typically this is used to always pass a
|
||||||
|
* request to the logging handler.
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public class ManyHandlers
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
|
||||||
|
// create the handlers
|
||||||
|
Handler param = new ParamHandler();
|
||||||
|
HandlerWrapper wrapper = new HandlerWrapper()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException,
|
||||||
|
ServletException
|
||||||
|
{
|
||||||
|
request.setAttribute("welcome","Hello");
|
||||||
|
super.handle(target,baseRequest,request,response);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Handler hello = new HelloHandler();
|
||||||
|
Handler dft = new DefaultHandler();
|
||||||
|
RequestLogHandler log = new RequestLogHandler();
|
||||||
|
|
||||||
|
// configure logs
|
||||||
|
log.setRequestLog(new NCSARequestLog(File.createTempFile("demo","log").getAbsolutePath()));
|
||||||
|
|
||||||
|
// create the handler collections
|
||||||
|
HandlerCollection handlers = new HandlerCollection();
|
||||||
|
HandlerList list = new HandlerList();
|
||||||
|
|
||||||
|
// link them all together
|
||||||
|
wrapper.setHandler(hello);
|
||||||
|
list.setHandlers(new Handler[]
|
||||||
|
{ param, wrapper, dft });
|
||||||
|
handlers.setHandlers(new Handler[]
|
||||||
|
{ list, log });
|
||||||
|
|
||||||
|
server.setHandler(handlers);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ParamHandler extends AbstractHandler
|
||||||
|
{
|
||||||
|
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
Map params = request.getParameterMap();
|
||||||
|
if (params.size() > 0)
|
||||||
|
{
|
||||||
|
response.setContentType("text/plain");
|
||||||
|
response.getWriter().println(JSON.toString(params));
|
||||||
|
((Request)request).setHandled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.lang.management.ManagementFactory;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.jmx.MBeanContainer;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||||
|
import org.eclipse.jetty.servlet.DefaultServlet;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
|
|
||||||
|
public class ManyServletContexts
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
|
||||||
|
// Setup JMX
|
||||||
|
MBeanContainer mbContainer=new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
|
||||||
|
server.addBean(mbContainer,true);
|
||||||
|
|
||||||
|
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
||||||
|
server.setHandler(contexts);
|
||||||
|
|
||||||
|
ServletContextHandler root = new ServletContextHandler(contexts,"/",ServletContextHandler.SESSIONS);
|
||||||
|
root.addServlet(new ServletHolder(new HelloServlet("Hello")),"/");
|
||||||
|
root.addServlet(new ServletHolder(new HelloServlet("Ciao")),"/it/*");
|
||||||
|
root.addServlet(new ServletHolder(new HelloServlet("Bonjoir")),"/fr/*");
|
||||||
|
|
||||||
|
ServletContextHandler other = new ServletContextHandler(contexts,"/other",ServletContextHandler.SESSIONS);
|
||||||
|
other.addServlet(DefaultServlet.class.getCanonicalName(),"/");
|
||||||
|
other.addServlet(new ServletHolder(new HelloServlet("YO!")),"*.yo");
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.dumpStdErr();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.IOException;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
|
|
||||||
|
public class MinimalServlets
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
ServletHandler handler = new ServletHandler();
|
||||||
|
server.setHandler(handler);
|
||||||
|
|
||||||
|
handler.addServletWithMapping("org.eclipse.jetty.embedded.MinimalServlets$HelloServlet","/");
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class HelloServlet extends HttpServlet
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
|
{
|
||||||
|
response.setContentType("text/html");
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
response.getWriter().println("<h1>Hello SimpleServlet</h1>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* A {@link ContextHandler} provides a common environment for multiple Handlers,
|
||||||
|
* such as: URI context path, class loader, static resource base.
|
||||||
|
*
|
||||||
|
* Typically a ContextHandler is used only when multiple contexts are likely.
|
||||||
|
*/
|
||||||
|
public class OneContext
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
|
||||||
|
ContextHandler context = new ContextHandler();
|
||||||
|
context.setContextPath("/");
|
||||||
|
context.setResourceBase(".");
|
||||||
|
context.setClassLoader(Thread.currentThread().getContextClassLoader());
|
||||||
|
server.setHandler(context);
|
||||||
|
|
||||||
|
context.setHandler(new HelloHandler());
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Server;
|
||||||
|
|
||||||
|
public class OneHandler
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
server.setHandler(new HelloHandler());
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Server;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
|
|
||||||
|
public class OneServletContext
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
|
||||||
|
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
||||||
|
context.setContextPath("/");
|
||||||
|
server.setHandler(context);
|
||||||
|
|
||||||
|
// Server content from tmp
|
||||||
|
ServletHolder holder = context.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class,"/tmp/*");
|
||||||
|
holder.setInitParameter("resourceBase","/tmp");
|
||||||
|
holder.setInitParameter("pathInfoOnly","true");
|
||||||
|
|
||||||
|
// Serve some hello world servlets
|
||||||
|
context.addServlet(new ServletHolder(new HelloServlet()),"/*");
|
||||||
|
context.addServlet(new ServletHolder(new HelloServlet("Buongiorno Mondo")),"/it/*");
|
||||||
|
context.addServlet(new ServletHolder(new HelloServlet("Bonjour le Monde")),"/fr/*");
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Connector;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
|
public class OneWebApp
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server();
|
||||||
|
|
||||||
|
ServerConnector connector = new ServerConnector(server);
|
||||||
|
connector.setPort(Integer.getInteger("jetty.port",8080).intValue());
|
||||||
|
server.setConnectors(new Connector[]
|
||||||
|
{ connector });
|
||||||
|
|
||||||
|
|
||||||
|
//If you're running this from inside Eclipse, then Server.getVersion will not provide
|
||||||
|
//the correct number as there is no manifest. Use the command line instead to provide the path to the
|
||||||
|
//test webapp
|
||||||
|
String war = args.length > 0?args[0]: "../test-jetty-webapp/target/test-jetty-webapp-"+Server.getVersion();
|
||||||
|
String path = args.length > 1?args[1]:"/";
|
||||||
|
|
||||||
|
System.err.println(war + " " + path);
|
||||||
|
|
||||||
|
WebAppContext webapp = new WebAppContext();
|
||||||
|
webapp.setContextPath(path);
|
||||||
|
webapp.setWar(war);
|
||||||
|
|
||||||
|
//If the webapp contains security constraints, you will need to configure a LoginService
|
||||||
|
if (war.contains("test-jetty-webapp"))
|
||||||
|
{
|
||||||
|
org.eclipse.jetty.security.HashLoginService loginService = new org.eclipse.jetty.security.HashLoginService();
|
||||||
|
loginService.setName("Test Realm");
|
||||||
|
loginService.setConfig("src/test/resources/realm.properties");
|
||||||
|
webapp.getSecurityHandler().setLoginService(loginService);
|
||||||
|
}
|
||||||
|
|
||||||
|
server.setHandler(webapp);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.security.ConstraintMapping;
|
||||||
|
import org.eclipse.jetty.security.ConstraintSecurityHandler;
|
||||||
|
import org.eclipse.jetty.security.HashLoginService;
|
||||||
|
import org.eclipse.jetty.security.LoginService;
|
||||||
|
import org.eclipse.jetty.security.authentication.BasicAuthenticator;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.util.security.Constraint;
|
||||||
|
|
||||||
|
public class SecuredHelloHandler
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
|
||||||
|
LoginService loginService = new HashLoginService("MyRealm","src/test/resources/realm.properties");
|
||||||
|
server.addBean(loginService);
|
||||||
|
|
||||||
|
ConstraintSecurityHandler security = new ConstraintSecurityHandler();
|
||||||
|
server.setHandler(security);
|
||||||
|
|
||||||
|
Constraint constraint = new Constraint();
|
||||||
|
constraint.setName("auth");
|
||||||
|
constraint.setAuthenticate( true );
|
||||||
|
constraint.setRoles(new String[]{"user", "admin"});
|
||||||
|
|
||||||
|
ConstraintMapping mapping = new ConstraintMapping();
|
||||||
|
mapping.setPathSpec( "/*" );
|
||||||
|
mapping.setConstraint( constraint );
|
||||||
|
|
||||||
|
Set<String> knownRoles = new HashSet<String>();
|
||||||
|
knownRoles.add("user");
|
||||||
|
knownRoles.add("admin");
|
||||||
|
|
||||||
|
security.setConstraintMappings(Collections.singletonList(mapping), knownRoles);
|
||||||
|
security.setAuthenticator(new BasicAuthenticator());
|
||||||
|
security.setLoginService(loginService);
|
||||||
|
security.setStrict(false);
|
||||||
|
|
||||||
|
HelloHandler hh = new HelloHandler();
|
||||||
|
|
||||||
|
security.setHandler(hh);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Server;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/** The simplest possible Jetty server.
|
||||||
|
*/
|
||||||
|
public class SimplestServer
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server(8080);
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,181 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.lang.management.ManagementFactory;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.deploy.DeploymentManager;
|
||||||
|
import org.eclipse.jetty.deploy.providers.WebAppProvider;
|
||||||
|
import org.eclipse.jetty.io.ArrayByteBufferPool;
|
||||||
|
import org.eclipse.jetty.io.ByteBufferPool;
|
||||||
|
import org.eclipse.jetty.io.FilterConnection;
|
||||||
|
import org.eclipse.jetty.jmx.MBeanContainer;
|
||||||
|
import org.eclipse.jetty.security.HashLoginService;
|
||||||
|
import org.eclipse.jetty.server.FilterConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.ForwardedRequestCustomizer;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.HttpChannelConfig;
|
||||||
|
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.NCSARequestLog;
|
||||||
|
import org.eclipse.jetty.server.SecureRequestCustomizer;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.SslConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerCollection;
|
||||||
|
import org.eclipse.jetty.server.handler.RequestLogHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.StatisticsHandler;
|
||||||
|
import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
|
||||||
|
import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
|
||||||
|
import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
|
||||||
|
import org.eclipse.jetty.spdy.server.http.PushStrategy;
|
||||||
|
import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
|
||||||
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
import org.eclipse.jetty.util.thread.TimerScheduler;
|
||||||
|
|
||||||
|
public class SpdyServer
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
String jetty_home = System.getProperty("jetty.home","../jetty-distribution/target/distribution");
|
||||||
|
System.setProperty("jetty.home",jetty_home);
|
||||||
|
|
||||||
|
// Setup Threadpool
|
||||||
|
QueuedThreadPool threadPool = new QueuedThreadPool();
|
||||||
|
threadPool.setMaxThreads(500);
|
||||||
|
|
||||||
|
Server server = new Server(threadPool);
|
||||||
|
server.manage(threadPool);
|
||||||
|
server.setDumpAfterStart(false);
|
||||||
|
server.setDumpBeforeStop(false);
|
||||||
|
|
||||||
|
// Setup JMX
|
||||||
|
MBeanContainer mbContainer=new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
|
||||||
|
server.addBean(mbContainer);
|
||||||
|
|
||||||
|
|
||||||
|
// Common HTTP configuration
|
||||||
|
HttpChannelConfig config = new HttpChannelConfig();
|
||||||
|
config.setSecurePort(8443);
|
||||||
|
config.addCustomizer(new ForwardedRequestCustomizer());
|
||||||
|
config.addCustomizer(new SecureRequestCustomizer());
|
||||||
|
|
||||||
|
|
||||||
|
// Http Connector
|
||||||
|
HttpConnectionFactory http = new HttpConnectionFactory(config);
|
||||||
|
FilterConnectionFactory filter = new FilterConnectionFactory(http.getProtocol());
|
||||||
|
filter.addFilter(new FilterConnection.DumpToFileFilter("http-"));
|
||||||
|
ServerConnector httpConnector = new ServerConnector(server,filter,http);
|
||||||
|
httpConnector.setPort(8080);
|
||||||
|
httpConnector.setIdleTimeout(30000);
|
||||||
|
|
||||||
|
server.addConnector(httpConnector);
|
||||||
|
|
||||||
|
|
||||||
|
// SSL configurations
|
||||||
|
SslContextFactory sslContextFactory = new SslContextFactory();
|
||||||
|
sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
|
||||||
|
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
|
||||||
|
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
|
||||||
|
sslContextFactory.setTrustStorePath(jetty_home + "/etc/keystore");
|
||||||
|
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");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Spdy Connector
|
||||||
|
SPDYServerConnectionFactory.checkNPNAvailable();
|
||||||
|
|
||||||
|
PushStrategy push = new ReferrerPushStrategy();
|
||||||
|
HTTPSPDYServerConnectionFactory spdy2 = new HTTPSPDYServerConnectionFactory(2,config,push);
|
||||||
|
spdy2.setInputBufferSize(8192);
|
||||||
|
spdy2.setInitialWindowSize(32768);
|
||||||
|
|
||||||
|
HTTPSPDYServerConnectionFactory spdy3 = new HTTPSPDYServerConnectionFactory(3,config,push);
|
||||||
|
spdy2.setInputBufferSize(8192);
|
||||||
|
|
||||||
|
NPNServerConnectionFactory npn = new NPNServerConnectionFactory(spdy3.getProtocol(),spdy2.getProtocol(),http.getProtocol());
|
||||||
|
npn.setDefaultProtocol(http.getProtocol());
|
||||||
|
npn.setInputBufferSize(1024);
|
||||||
|
|
||||||
|
FilterConnectionFactory npn_filter = new FilterConnectionFactory(npn.getProtocol());
|
||||||
|
npn_filter.addFilter(new FilterConnection.DumpToFileFilter("npn-"));
|
||||||
|
|
||||||
|
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,npn_filter.getProtocol());
|
||||||
|
FilterConnectionFactory ssl_filter = new FilterConnectionFactory(ssl.getProtocol());
|
||||||
|
ssl_filter.addFilter(new FilterConnection.DumpToFileFilter("ssl-"));
|
||||||
|
|
||||||
|
ServerConnector spdyConnector = new ServerConnector(server,ssl_filter,ssl,npn_filter,npn,spdy3,spdy2,http);
|
||||||
|
spdyConnector.setPort(8443);
|
||||||
|
|
||||||
|
server.addConnector(spdyConnector);
|
||||||
|
|
||||||
|
|
||||||
|
// Setup handlers
|
||||||
|
HandlerCollection handlers = new HandlerCollection();
|
||||||
|
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
||||||
|
RequestLogHandler requestLogHandler = new RequestLogHandler();
|
||||||
|
|
||||||
|
handlers.setHandlers(new Handler[] { contexts, new DefaultHandler(), requestLogHandler });
|
||||||
|
|
||||||
|
StatisticsHandler stats = new StatisticsHandler();
|
||||||
|
stats.setHandler(handlers);
|
||||||
|
|
||||||
|
server.setHandler(stats);
|
||||||
|
|
||||||
|
// Setup deployers
|
||||||
|
DeploymentManager deployer = new DeploymentManager();
|
||||||
|
deployer.setContexts(contexts);
|
||||||
|
server.addBean(deployer);
|
||||||
|
|
||||||
|
WebAppProvider webapp_provider = new WebAppProvider();
|
||||||
|
webapp_provider.setMonitoredDirName(jetty_home + "/webapps");
|
||||||
|
webapp_provider.setParentLoaderPriority(false);
|
||||||
|
webapp_provider.setExtractWars(true);
|
||||||
|
webapp_provider.setScanInterval(2);
|
||||||
|
webapp_provider.setDefaultsDescriptor(jetty_home + "/etc/webdefault.xml");
|
||||||
|
deployer.addAppProvider(webapp_provider);
|
||||||
|
|
||||||
|
HashLoginService login = new HashLoginService();
|
||||||
|
login.setName("Test Realm");
|
||||||
|
login.setConfig(jetty_home + "/etc/realm.properties");
|
||||||
|
server.addBean(login);
|
||||||
|
|
||||||
|
NCSARequestLog requestLog = new NCSARequestLog(jetty_home + "/logs/jetty-yyyy_mm_dd.log");
|
||||||
|
requestLog.setExtended(false);
|
||||||
|
requestLogHandler.setRequestLog(requestLog);
|
||||||
|
|
||||||
|
server.setStopAtShutdown(true);
|
||||||
|
server.setSendServerVersion(true);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.dumpStdErr();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.server.Connector;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||||
|
import org.eclipse.jetty.server.handler.ResourceHandler;
|
||||||
|
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
|
||||||
|
import org.eclipse.jetty.util.resource.Resource;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* A {@link ContextHandlerCollection} handler may be used to direct a request to
|
||||||
|
* a specific Context. The URI path prefix and optional virtual host is used to
|
||||||
|
* select the context.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SplitFileServer
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Server server = new Server();
|
||||||
|
ServerConnector connector = new ServerConnector(server);
|
||||||
|
connector.setPort(8090);
|
||||||
|
server.setConnectors(new Connector[]
|
||||||
|
{ connector });
|
||||||
|
|
||||||
|
ContextHandler context0 = new ContextHandler();
|
||||||
|
context0.setContextPath("/");
|
||||||
|
ResourceHandler rh0 = new ResourceHandler();
|
||||||
|
rh0.setBaseResource( Resource.newResource(MavenTestingUtils.getTestResourceDir("dir0")));
|
||||||
|
context0.setHandler(rh0);
|
||||||
|
|
||||||
|
ContextHandler context1 = new ContextHandler();
|
||||||
|
context1.setContextPath("/");
|
||||||
|
ResourceHandler rh1 = new ResourceHandler();
|
||||||
|
rh1.setBaseResource( Resource.newResource(MavenTestingUtils.getTestResourceDir("dir1")));
|
||||||
|
context1.setHandler(rh1);
|
||||||
|
|
||||||
|
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
||||||
|
contexts.setHandlers(new Handler[]
|
||||||
|
{ context0, context1 });
|
||||||
|
|
||||||
|
server.setHandler(contexts);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
System.err.println(server.dump());
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
|
||||||
|
|
||||||
|
<Configure id="FileServer" class="org.eclipse.jetty.server.Server">
|
||||||
|
|
||||||
|
<Call name="addConnector">
|
||||||
|
<Arg>
|
||||||
|
<New class="org.eclipse.jetty.server.nio.ServerConnector">
|
||||||
|
<Set name="port">8080</Set>
|
||||||
|
</New>
|
||||||
|
</Arg>
|
||||||
|
</Call>
|
||||||
|
|
||||||
|
<Set name="handler">
|
||||||
|
<New class="org.eclipse.jetty.server.handler.HandlerList">
|
||||||
|
<Set name="handlers">
|
||||||
|
<Array type="org.eclipse.jetty.server.Handler">
|
||||||
|
<Item>
|
||||||
|
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
|
||||||
|
<Set name="directoriesListed">true</Set>
|
||||||
|
<Set name="welcomeFiles">
|
||||||
|
<Array type="String"><Item>index.html</Item></Array>
|
||||||
|
</Set>
|
||||||
|
<Set name="resourceBase">.</Set>
|
||||||
|
</New>
|
||||||
|
</Item>
|
||||||
|
<Item>
|
||||||
|
<New class="org.eclipse.jetty.server.handler.DefaultHandler">
|
||||||
|
</New>
|
||||||
|
</Item>
|
||||||
|
</Array>
|
||||||
|
</Set>
|
||||||
|
</New>
|
||||||
|
</Set>
|
||||||
|
</Configure>
|
|
@ -0,0 +1,9 @@
|
||||||
|
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
|
||||||
|
org.eclipse.jetty.LEVEL=INFO
|
||||||
|
org.eclipse.jetty.STACKS=true
|
||||||
|
org.eclipse.jetty.SOURCE=false
|
||||||
|
#org.eclipse.jetty.STACKS=false
|
||||||
|
#org.eclipse.jetty.spdy.LEVEL=DEBUG
|
||||||
|
#org.eclipse.jetty.server.LEVEL=DEBUG
|
||||||
|
#org.eclipse.jetty.io.ssl.LEVEL=DEBUG
|
||||||
|
#org.eclipse.jetty.spdy.server.LEVEL=DEBUG
|
|
@ -0,0 +1,124 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.http.HttpTester;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.LocalConnector;
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||||
|
import org.eclipse.jetty.servlets.gzip.GzipHandler;
|
||||||
|
import org.eclipse.jetty.util.IO;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class GzipHandlerTest
|
||||||
|
{
|
||||||
|
private static String __content =
|
||||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc. "+
|
||||||
|
"Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque "+
|
||||||
|
"habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "+
|
||||||
|
"Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam "+
|
||||||
|
"at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate "+
|
||||||
|
"velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum. "+
|
||||||
|
"Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum "+
|
||||||
|
"eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa "+
|
||||||
|
"sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam "+
|
||||||
|
"consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque. "+
|
||||||
|
"Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse "+
|
||||||
|
"et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque.";
|
||||||
|
|
||||||
|
private Server _server;
|
||||||
|
private LocalConnector _connector;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void init() throws Exception
|
||||||
|
{
|
||||||
|
_server = new Server();
|
||||||
|
_connector = new LocalConnector(_server);
|
||||||
|
_server.addConnector(_connector);
|
||||||
|
|
||||||
|
Handler testHandler = new AbstractHandler()
|
||||||
|
{
|
||||||
|
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException,
|
||||||
|
ServletException
|
||||||
|
{
|
||||||
|
PrintWriter writer = response.getWriter();
|
||||||
|
writer.write(__content);
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
baseRequest.setHandled(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
GzipHandler gzipHandler = new GzipHandler();
|
||||||
|
gzipHandler.setHandler(testHandler);
|
||||||
|
|
||||||
|
_server.setHandler(gzipHandler);
|
||||||
|
_server.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void destroy() throws Exception
|
||||||
|
{
|
||||||
|
_server.stop();
|
||||||
|
_server.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGzipHandler() throws Exception
|
||||||
|
{
|
||||||
|
// generated and parsed test
|
||||||
|
HttpTester.Request request = HttpTester.newRequest();
|
||||||
|
HttpTester.Response response;
|
||||||
|
|
||||||
|
request.setMethod("GET");
|
||||||
|
request.setVersion("HTTP/1.0");
|
||||||
|
request.setHeader("Host","tester");
|
||||||
|
request.setHeader("accept-encoding","gzip");
|
||||||
|
request.setURI("/");
|
||||||
|
|
||||||
|
response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
|
||||||
|
|
||||||
|
assertTrue(response.get("Content-Encoding").equalsIgnoreCase("gzip"));
|
||||||
|
assertEquals(HttpServletResponse.SC_OK,response.getStatus());
|
||||||
|
|
||||||
|
InputStream testIn = new GZIPInputStream(new ByteArrayInputStream(response.getContentBytes()));
|
||||||
|
ByteArrayOutputStream testOut = new ByteArrayOutputStream();
|
||||||
|
IO.copy(testIn,testOut);
|
||||||
|
|
||||||
|
assertEquals(__content, testOut.toString("UTF8"));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2012 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.xml.XmlConfiguration;
|
||||||
|
|
||||||
|
public class TestXml
|
||||||
|
{
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
System.setProperty("jetty.home","../jetty-distribution/target/distribution");
|
||||||
|
XmlConfiguration.main(new String[]
|
||||||
|
{
|
||||||
|
"../jetty-jmx/src/main/config/etc/jetty-jmx.xml",
|
||||||
|
"../jetty-server/src/main/config/etc/jetty.xml",
|
||||||
|
"../jetty-spdy/spdy-jetty-http-webapp/src/main/config/etc/jetty-spdy.xml"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
test0
|
|
@ -0,0 +1 @@
|
||||||
|
test1
|
|
@ -0,0 +1,22 @@
|
||||||
|
#
|
||||||
|
# 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.util.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:.
|
||||||
|
#
|
||||||
|
# if using digest authentication, do not MD5-hash the password
|
||||||
|
jetty: jetty,user
|
||||||
|
admin: CRYPT:ad1ks..kc.1Ug,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
|
Loading…
Reference in New Issue