Skip to content

Commit 48848de

Browse files
committed
[grid] Guarding how the server reads parameters
Some users have security tools that send different requests to the Grid and made it crash. This should guard it from those situations. Fixes SeleniumHQ/docker-selenium#1469
1 parent a6d74f9 commit 48848de

1 file changed

Lines changed: 33 additions & 21 deletions

File tree

java/src/org/openqa/selenium/netty/server/RequestConverter.java

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@
1717

1818
package org.openqa.selenium.netty.server;
1919

20+
import static io.netty.handler.codec.http.HttpMethod.HEAD;
21+
import static org.openqa.selenium.remote.http.Contents.memoize;
22+
2023
import com.google.common.io.ByteStreams;
24+
25+
import org.openqa.selenium.internal.Debug;
26+
import org.openqa.selenium.remote.http.HttpMethod;
27+
import org.openqa.selenium.remote.http.HttpRequest;
28+
import org.openqa.selenium.remote.http.HttpResponse;
29+
import org.openqa.selenium.remote.tracing.AttributeKey;
30+
2131
import io.netty.buffer.ByteBuf;
2232
import io.netty.buffer.ByteBufInputStream;
2333
import io.netty.channel.ChannelHandlerContext;
@@ -31,10 +41,6 @@
3141
import io.netty.handler.codec.http.LastHttpContent;
3242
import io.netty.handler.codec.http.QueryStringDecoder;
3343
import io.netty.util.ReferenceCountUtil;
34-
import org.openqa.selenium.remote.http.HttpMethod;
35-
import org.openqa.selenium.remote.http.HttpRequest;
36-
import org.openqa.selenium.remote.http.HttpResponse;
37-
import org.openqa.selenium.remote.tracing.AttributeKey;
3844

3945
import java.io.IOException;
4046
import java.io.InputStream;
@@ -45,9 +51,6 @@
4551
import java.util.concurrent.Executors;
4652
import java.util.logging.Logger;
4753

48-
import static io.netty.handler.codec.http.HttpMethod.HEAD;
49-
import static org.openqa.selenium.remote.http.Contents.memoize;
50-
5154
class RequestConverter extends SimpleChannelInboundHandler<HttpObject> {
5255

5356
private static final Logger LOG = Logger.getLogger(RequestConverter.class.getName());
@@ -133,23 +136,32 @@ private HttpRequest createRequest(
133136
try {
134137
method = HttpMethod.valueOf(nettyRequest.method().name());
135138
} catch (IllegalArgumentException e) {
136-
ctx.writeAndFlush(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.METHOD_NOT_ALLOWED));
139+
ctx.writeAndFlush(
140+
new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.METHOD_NOT_ALLOWED));
137141
return null;
138142
}
139143
}
140144

141-
QueryStringDecoder decoder = new QueryStringDecoder(nettyRequest.uri());
142-
143-
HttpRequest req = new HttpRequest(
144-
method,
145-
decoder.path());
146-
147-
decoder.parameters().forEach((key, values) -> values.forEach(value -> req.addQueryParameter(key, value)));
148-
149-
nettyRequest.headers().entries().stream()
150-
.filter(entry -> entry.getKey() != null)
151-
.forEach(entry -> req.addHeader(entry.getKey(), entry.getValue()));
152-
153-
return req;
145+
// Attempt to decode parameters
146+
try {
147+
QueryStringDecoder decoder = new QueryStringDecoder(nettyRequest.uri());
148+
149+
HttpRequest req = new HttpRequest(
150+
method,
151+
decoder.path());
152+
153+
decoder.parameters()
154+
.forEach((key, values) -> values.forEach(value -> req.addQueryParameter(key, value)));
155+
156+
nettyRequest.headers().entries().stream()
157+
.filter(entry -> entry.getKey() != null)
158+
.forEach(entry -> req.addHeader(entry.getKey(), entry.getValue()));
159+
return req;
160+
} catch (Exception e) {
161+
ctx.writeAndFlush(
162+
new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST));
163+
LOG.log(Debug.getDebugLogLevel(), "Not possible to decode parameters.", e);
164+
return null;
165+
}
154166
}
155167
}

0 commit comments

Comments
 (0)