Skip to content

Commit

Permalink
Improving form-post
Browse files Browse the repository at this point in the history
+ Moving servlet examples to ee10-form-post
+ Creating jetty-core version of form-post
  • Loading branch information
joakime committed Feb 3, 2024
1 parent 02ee330 commit 4a271ab
Show file tree
Hide file tree
Showing 10 changed files with 728 additions and 122 deletions.
61 changes: 61 additions & 0 deletions embedded/ee10-form-post/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.eclipse.jetty.examples.embedded</groupId>
<artifactId>jetty-embedded-examples</artifactId>
<version>12.0.x</version>
</parent>
<artifactId>ee10-form-post</artifactId>
<version>12.0.x</version>
<packaging>jar</packaging>
<name>Jetty Examples :: Jetty 12.0.x :: Embedded :: EE10 Form Post</name>

<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-slf4j-impl</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.ee10</groupId>
<artifactId>jetty-ee10-servlet</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.14</version>
<scope>test</scope>
<exclusions>
<!-- we want to use jcl-over-slf4j instead, so that these common-logging events route to slf4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<version>${jetty-test-helper.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,71 +14,33 @@
package examples;

import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import org.eclipse.jetty.client.FormRequestContent;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.ContentResponse;
import org.eclipse.jetty.client.MultiPartRequestContent;
import org.eclipse.jetty.client.Request;
import org.eclipse.jetty.client.StringRequestContent;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.MultiPart;
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.Handler.Sequence;
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.util.Fields;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.component.LifeCycle;

public class FormRestrictionsExample
public class FormEndpoints
{
private Server server;

public static void main(String[] args) throws Exception
{
FormRestrictionsExample example = new FormRestrictionsExample();

HttpClient client = new HttpClient();
try
{
example.startServer(9090);
URI serverURI = example.getServerURI();

client.start();
example.submitVariousForms(client, serverURI.resolve("/form/post-only"));
example.submitVariousForms(client, serverURI.resolve("/form/conjoined"));
example.submitVariousForms(client, serverURI.resolve("/form/service"));
}
finally
{
client.stop();
example.stopServer();
}
}

public URI getServerURI()
{
return server.getURI();
Server server = FormEndpoints.newServer(8080);
server.start();
server.join();
}

public void startServer(int port) throws Exception
public static Server newServer(int port) throws IOException
{
server = new Server();
Server server = new Server();

HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setFormEncodedMethods("POST");
Expand All @@ -90,8 +52,8 @@ public void startServer(int port) throws Exception
ServletContextHandler servletContextHandler = new ServletContextHandler();
servletContextHandler.setContextPath("/");

String tempDir = System.getProperty("java.io.tmpDir");
MultipartConfigElement multipartConfig = new MultipartConfigElement(tempDir, -1, -1, 500_000);
Path workDir = Files.createTempDirectory("multipart-work");
MultipartConfigElement multipartConfig = new MultipartConfigElement(workDir.toString(), -1, -1, 500_000);

servletContextHandler.addServlet(PostFormOnlyServlet.class, "/form/post-only")
.getRegistration().setMultipartConfig(multipartConfig);
Expand All @@ -105,63 +67,7 @@ public void startServer(int port) throws Exception
handlers.addHandler(new DefaultHandler());

server.setHandler(handlers);
server.start();
}

public void stopServer()
{
LifeCycle.stop(server);
}

public void submitVariousForms(HttpClient client, URI uri)
{
for (String httpMethod : Arrays.asList("GET", "POST", "PUT"))
{
submitForm(httpMethod + " with Query Params Only",
client.newRequest(uri)
.method(httpMethod)
.path(uri.getRawPath() + "?UserName=Esteban+de+Dorantes"));

Fields wwwForm = new Fields();
wwwForm.add("UserName", "Álvar Núñez Cabeza de Vaca");

submitForm(httpMethod + " with application/x-www-form-urlencoded",
client.newRequest(uri)
.method(httpMethod)
.body(new FormRequestContent(wwwForm)));

MultiPartRequestContent multiPartForm = new MultiPartRequestContent();
multiPartForm.addPart(new MultiPart.ContentSourcePart("UserName", null, HttpFields.EMPTY, new StringRequestContent("Andrés Dorantes de Carranza")));

submitForm(httpMethod + " with multipart/form-data",
client.newRequest(uri)
.method(httpMethod)
.body(multiPartForm));
}
}

private void submitForm(String description, Request request)
{
try
{
ContentResponse response = request.headers((fields) -> fields.put("Accept", "text/plain")).send();
if (response.getStatus() == HttpStatus.OK_200)
{
System.out.printf("%-17s - %-44s -> OK: %s%n", request.getPath(), description, response.getContentAsString().trim());
}
else
{
String reason = response.getReason();
String[] content = response.getContentAsString().split("\n");
if (StringUtil.isNotBlank(content[0]))
reason = content[0];
System.out.printf("%-17s - %-44s -> Status [%d]: %s%n", request.getPath(), description, response.getStatus(), reason);
}
}
catch (InterruptedException | TimeoutException | ExecutionException e)
{
System.out.printf("%-17s - %-44s - ERROR: %s: %s%n", request.getPath(), description, e.getClass().getName(), e.getMessage());
}
return server;
}

/**
Expand All @@ -179,16 +85,16 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IO
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException
{
String userName = request.getParameter("UserName");
if (userName == null)
String member = request.getParameter("Member");
if (member == null)
{
response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, "Form not valid");
return;
}

response.setCharacterEncoding("utf-8");
response.setContentType("text/plain");
response.getWriter().printf("Got (PostOnly) UserName [%s]%n", userName);
response.getWriter().printf("Got (PostOnly) Member [%s]%n", member);
}
}

Expand All @@ -212,15 +118,15 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I

protected void handleForm(HttpServletRequest request, HttpServletResponse response) throws IOException
{
String userName = request.getParameter("UserName");
if (userName == null)
String member = request.getParameter("Member");
if (member == null)
{
response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, "Form not valid");
return;
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/plain");
response.getWriter().printf("Got (Conjoined) UserName [%s]%n", userName);
response.getWriter().printf("Got (Conjoined) Member [%s]%n", member);
}
}

Expand All @@ -232,15 +138,15 @@ public static class ServiceFormServlet extends HttpServlet
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException
{
String userName = request.getParameter("UserName");
if (userName == null)
String member = request.getParameter("Member");
if (member == null)
{
response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, "Form not valid");
return;
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/plain");
response.getWriter().printf("Got (Service) UserName [%s]%n", userName);
response.getWriter().printf("Got (Service) Member [%s]%n", member);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
org.eclipse.jetty.LEVEL=INFO
org.apache.LEVEL=INFO
Loading

0 comments on commit 4a271ab

Please sign in to comment.