Skip to content

Commit 44c2971

Browse files
authored
[jetty-http-spi] add filter support (#12764)
* [jetty-http-spi] add filter support and test
1 parent 12d1611 commit 44c2971

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

jetty-core/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/HttpSpiContextHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.sun.net.httpserver.Authenticator;
2020
import com.sun.net.httpserver.Authenticator.Result;
21+
import com.sun.net.httpserver.Filter.Chain;
2122
import com.sun.net.httpserver.HttpContext;
2223
import com.sun.net.httpserver.HttpExchange;
2324
import com.sun.net.httpserver.HttpHandler;
@@ -61,7 +62,7 @@ public boolean handle(Request request, Response response, Callback callback)
6162
if (auth != null && handleAuthentication(request, response, callback, jettyHttpExchange, auth))
6263
return true;
6364

64-
_httpHandler.handle(jettyHttpExchange);
65+
new Chain(_httpContext.getFilters(), _httpHandler).doFilter(jettyHttpExchange);
6566
callback.succeeded();
6667
}
6768
catch (Exception ex)

jetty-core/jetty-http-spi/src/test/java/org/eclipse/jetty/http/spi/SPIServerTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import java.net.URI;
2222
import java.nio.charset.StandardCharsets;
2323
import java.util.List;
24+
import java.util.concurrent.atomic.AtomicReference;
2425

2526
import com.sun.net.httpserver.BasicAuthenticator;
27+
import com.sun.net.httpserver.Filter;
2628
import com.sun.net.httpserver.Headers;
2729
import com.sun.net.httpserver.HttpContext;
2830
import com.sun.net.httpserver.HttpExchange;
@@ -404,4 +406,54 @@ public boolean checkCredentials(String username, String password)
404406
String body = response.getContentAsString();
405407
assertThat(body, is("Hello"));
406408
}
409+
410+
@Test
411+
public void testFilter() throws Exception
412+
{
413+
final AtomicReference<String> reference = new AtomicReference<String>();
414+
415+
final HttpContext httpContext = server.createContext("/", new HttpHandler()
416+
{
417+
public void handle(HttpExchange exchange) throws IOException
418+
{
419+
assertThat(reference.get(), is("before"));
420+
Headers responseHeaders = exchange.getResponseHeaders();
421+
responseHeaders.set("Content-Type", "text/plain");
422+
exchange.sendResponseHeaders(200, 0);
423+
424+
OutputStream responseBody = exchange.getResponseBody();
425+
responseBody.write("Hello".getBytes(StandardCharsets.ISO_8859_1));
426+
responseBody.close();
427+
}
428+
});
429+
430+
httpContext.getFilters().add(new Filter()
431+
{
432+
@Override
433+
public void doFilter(HttpExchange exchange, Chain chain) throws IOException
434+
{
435+
reference.set("before");
436+
chain.doFilter(exchange);
437+
reference.set("after");
438+
439+
}
440+
441+
@Override
442+
public String description()
443+
{
444+
return "test";
445+
}
446+
});
447+
448+
Request request = client.newRequest("localhost", port)
449+
.scheme("http")
450+
.method(HttpMethod.GET)
451+
.path("/");
452+
453+
ContentResponse response = request.send();
454+
assertThat(response.getStatus(), is(200));
455+
String body = response.getContentAsString();
456+
assertThat(body, is("Hello"));
457+
assertThat(reference.get(), is("after"));
458+
}
407459
}

0 commit comments

Comments
 (0)