Skip to content

Commit

Permalink
[UNDERTOW-1735] add reason-phrase handler and make response-code obey…
Browse files Browse the repository at this point in the history
… doc contract of one-by-one execution
  • Loading branch information
baranowb committed Dec 12, 2022
1 parent c6ad90c commit b6f4f7a
Show file tree
Hide file tree
Showing 7 changed files with 189 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.undertow.server.handlers;

import io.undertow.UndertowLogger;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;

/**
* A handler which simply sets a response code.
*
* @author <a href="mailto:[email protected]">Bartosz Baranowski</a>
*/
public final class ReasonPhraseHandler implements HttpHandler {

private static final boolean debugEnabled;

static {
debugEnabled = UndertowLogger.PREDICATE_LOGGER.isDebugEnabled();
}

private final String reasonPhrase;

private final HttpHandler next;
/**
* Construct a new instance.
*
* @param reasonPhrase the reason phrase to be set in status line
*/
public ReasonPhraseHandler(final HttpHandler next, final String reasonPhrase) {
this.next = next;
this.reasonPhrase = reasonPhrase;
}

@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
exchange.setReasonPhrase(reasonPhrase);
if(debugEnabled) {
UndertowLogger.PREDICATE_LOGGER.debugf("Reason phrase set to [%s] for %s.", this.reasonPhrase, exchange);
}
if(next != null) {
next.handleRequest(exchange);
}
}

@Override
public String toString() {
return "reason-phrase( " + this.reasonPhrase + " )";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,34 @@ public final class ResponseCodeHandler implements HttpHandler {

private final int responseCode;

private HttpHandler next;
/**
* Construct a new instance.
*
* @param responseCode the response code to set
* @param next next handler
*/
public ResponseCodeHandler(final int responseCode) {
public ResponseCodeHandler(final HttpHandler next, final int responseCode) {
this.responseCode = responseCode;
this.next = next;
}

/**
* Construct a new instance.
*
* @param responseCode the response code to set
* @param next next handler
*/
public ResponseCodeHandler(final int responseCode) {
this(null,responseCode);
}

public HttpHandler getNext() {
return next;
}

public void setNext(HttpHandler next) {
this.next = next;
}

@Override
Expand All @@ -79,6 +100,9 @@ public void handleRequest(final HttpServerExchange exchange) throws Exception {
if(debugEnabled) {
UndertowLogger.PREDICATE_LOGGER.debugf("Response code set to [%s] for %s.", responseCode, exchange);
}
if(next != null) {
next.handleRequest(exchange);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.undertow.server.handlers.builder;

import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.ReasonPhraseHandler;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
* @author Bartosz Baranowski
*/
public class ReasonPhraseHandlerBuilder implements HandlerBuilder {
@Override
public String name() {
return "reason-phrase";
}

@Override
public Map<String, Class<?>> parameters() {
Map<String, Class<?>> parameters = new HashMap<>();
parameters.put("value", String.class);
return parameters;
}

@Override
public Set<String> requiredParameters() {
final Set<String> req = new HashSet<>();
req.add("value");
return req;
}

@Override
public String defaultParameter() {
return "value";
}

@Override
public HandlerWrapper build(final Map<String, Object> config) {
final String value = (String) config.get("value");
return new HandlerWrapper() {
@Override
public HttpHandler wrap(HttpHandler handler) {
return new ReasonPhraseHandler(handler, value);
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public HandlerWrapper build(final Map<String, Object> config) {
return new HandlerWrapper() {
@Override
public HttpHandler wrap(HttpHandler handler) {
return new ResponseCodeHandler(value);
return new ResponseCodeHandler(handler, value);
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,4 @@ io.undertow.server.handlers.HttpContinueAcceptingHandler$Builder
io.undertow.server.handlers.form.EagerFormParsingHandler$Builder
io.undertow.server.handlers.SameSiteCookieHandler$Builder
io.undertow.server.handlers.SetErrorHandler$Builder
io.undertow.server.handlers.builder.ReasonPhraseHandlerBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,5 @@ private void expect(String string, boolean result1, boolean result2) {
throw new RuntimeException("String " + string, ex);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.undertow.server.handlers.builder.PredicatedHandlersParser;
import io.undertow.testutils.DefaultServer;
import io.undertow.testutils.HttpClientUtils;
import io.undertow.testutils.ProxyIgnore;
import io.undertow.testutils.TestHttpClient;
import io.undertow.util.StatusCodes;
import org.apache.http.HttpResponse;
Expand Down Expand Up @@ -145,4 +146,30 @@ public void handleRequest(HttpServerExchange exchange) throws Exception {
client.getConnectionManager().shutdown();
}
}

@Test @ProxyIgnore
public void testReasonPhrase() throws IOException {
DefaultServer.setRootHandler(
Handlers.predicates(

PredicatedHandlersParser.parse(
"path('/test') -> reason-phrase('test-my-patience');response-code(480)", getClass().getClassLoader()), new HttpHandler() {
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
exchange.getResponseSender().send(exchange.getRelativePath());
}
}));
TestHttpClient client = new TestHttpClient();
try {
HttpGet get = new HttpGet(DefaultServer.getDefaultServerURL() + "/test");

HttpResponse result = client.execute(get);
Assert.assertEquals("test-my-patience", result.getStatusLine().getReasonPhrase());
Assert.assertEquals(480, result.getStatusLine().getStatusCode());

} finally {
client.getConnectionManager().shutdown();
}

}
}

0 comments on commit b6f4f7a

Please sign in to comment.