Skip to content

Commit 0c252ed

Browse files
authored
Merge pull request #61 from akkinoc/fix-undertow-error-path
Fix a bug that the request URI and query string are incorrect when returning an error response on Undertow
2 parents 2e5a401 + 784cd08 commit 0c252ed

File tree

1 file changed

+68
-10
lines changed

1 file changed

+68
-10
lines changed

logback-access-spring-boot-starter/src/main/java/net/rakugakibox/spring/boot/logback/access/undertow/UndertowLogbackAccessEvent.java

+68-10
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
11
package net.rakugakibox.spring.boot.logback.access.undertow;
22

3-
import java.util.HashMap;
4-
import java.util.Map;
5-
import java.util.concurrent.TimeUnit;
6-
import javax.servlet.http.HttpServletRequest;
7-
import javax.servlet.http.HttpServletResponse;
8-
3+
import ch.qos.logback.access.pattern.AccessConverter;
4+
import ch.qos.logback.access.spi.AccessEvent;
95
import io.undertow.server.HttpServerExchange;
106
import io.undertow.servlet.handlers.ServletRequestContext;
117
import io.undertow.util.HeaderMap;
128
import io.undertow.util.HeaderValues;
139
import net.rakugakibox.spring.boot.logback.access.AbstractLogbackAccessEvent;
10+
import net.rakugakibox.spring.boot.logback.access.AbstractOverridenAttribute;
11+
import javax.servlet.RequestDispatcher;
12+
import javax.servlet.http.HttpServletRequest;
13+
import javax.servlet.http.HttpServletResponse;
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
import java.util.Optional;
17+
import java.util.concurrent.TimeUnit;
1418

1519
/**
1620
* The Logback-access event for Undertow.
1721
*/
1822
public class UndertowLogbackAccessEvent extends AbstractLogbackAccessEvent {
1923

24+
private final RequestURI requestURI = new RequestURI();
25+
26+
private final QueryString queryString = new QueryString();
27+
2028
/**
2129
* Constructs an instance.
2230
*
@@ -48,6 +56,26 @@ private static HttpServletResponse extractHttpServletResponse(HttpServerExchange
4856
return (HttpServletResponse) context.getServletResponse();
4957
}
5058

59+
@Override
60+
public String getRequestURI() {
61+
return requestURI.get();
62+
}
63+
64+
@Override
65+
public String getQueryString() {
66+
return queryString.get();
67+
}
68+
69+
@Override
70+
public String getRequestURL() {
71+
return getMethod() +
72+
AccessConverter.SPACE_CHAR +
73+
getRequestURI() +
74+
getQueryString() +
75+
AccessConverter.SPACE_CHAR +
76+
getProtocol();
77+
}
78+
5179
/**
5280
* The server adapter.
5381
*/
@@ -67,7 +95,6 @@ private ServerAdapter(HttpServerExchange exchange) {
6795
this.exchange = exchange;
6896
}
6997

70-
/** {@inheritDoc} */
7198
@Override
7299
public long getRequestTimestamp() {
73100
long currentTimeMillis = System.currentTimeMillis();
@@ -76,19 +103,16 @@ public long getRequestTimestamp() {
76103
return currentTimeMillis - TimeUnit.NANOSECONDS.toMillis(nanoTime - requestStartTime);
77104
}
78105

79-
/** {@inheritDoc} */
80106
@Override
81107
public int getStatusCode() {
82108
return exchange.getStatusCode();
83109
}
84110

85-
/** {@inheritDoc} */
86111
@Override
87112
public long getContentLength() {
88113
return exchange.getResponseBytesSent();
89114
}
90115

91-
/** {@inheritDoc} */
92116
@Override
93117
public Map<String, String> buildResponseHeaderMap() {
94118
Map<String, String> result = new HashMap<>();
@@ -101,4 +125,38 @@ public Map<String, String> buildResponseHeaderMap() {
101125

102126
}
103127

128+
private class RequestURI extends AbstractOverridenAttribute<String> {
129+
130+
@Override
131+
protected Optional<String> evaluateValueToOverride() {
132+
return Optional.of(UndertowLogbackAccessEvent.this)
133+
.map(AccessEvent::getRequest)
134+
.map(request -> (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI));
135+
}
136+
137+
@Override
138+
protected String getOriginalValue() {
139+
return UndertowLogbackAccessEvent.super.getRequestURI();
140+
}
141+
142+
}
143+
144+
private class QueryString extends AbstractOverridenAttribute<String> {
145+
146+
@Override
147+
protected Optional<String> evaluateValueToOverride() {
148+
return Optional.of(UndertowLogbackAccessEvent.this)
149+
.map(AccessEvent::getRequest)
150+
.map(request -> (String) request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))
151+
.filter(query -> !query.isEmpty())
152+
.map(query -> AccessConverter.QUESTION_CHAR + query);
153+
}
154+
155+
@Override
156+
protected String getOriginalValue() {
157+
return UndertowLogbackAccessEvent.super.getQueryString();
158+
}
159+
160+
}
161+
104162
}

0 commit comments

Comments
 (0)