Skip to content

Commit dc7c7f1

Browse files
committed
Make the JreAppServer be based off the JreServer
1 parent fd5149c commit dc7c7f1

File tree

13 files changed

+84
-270
lines changed

13 files changed

+84
-270
lines changed

java/client/test/org/openqa/selenium/environment/BUILD.bazel

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ java_library(
3333
"//java/client/src/org/openqa/selenium/remote",
3434
"//java/client/src/org/openqa/selenium/remote/http",
3535
"//java/client/test/org/openqa/selenium/build",
36+
"//java/server/src/org/openqa/selenium/grid/config",
37+
"//java/server/src/org/openqa/selenium/grid/server",
38+
"//java/server/src/org/openqa/selenium/grid/web",
39+
"//java/server/src/org/openqa/selenium/jre/server",
3640
artifact("com.google.guava:guava"),
3741
artifact("org.eclipse.jetty:jetty-http"),
3842
artifact("org.eclipse.jetty:jetty-server"),
@@ -53,6 +57,18 @@ java_binary(
5357
],
5458
)
5559

60+
java_binary(
61+
name = "jre-server",
62+
main_class = "org.openqa.selenium.environment.webserver.JreAppServer",
63+
visibility = [
64+
"//dotnet/test:__subpackages__",
65+
],
66+
runtime_deps = [
67+
":environment",
68+
],
69+
)
70+
71+
5672
java_library(
5773
name = "test-base",
5874
srcs = ["webserver/AppServerTestBase.java"],

java/client/test/org/openqa/selenium/environment/webserver/JreAppServer.java

Lines changed: 32 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,21 @@
1919

2020
import com.google.common.collect.ImmutableMap;
2121
import com.google.common.io.ByteStreams;
22-
import com.sun.net.httpserver.HttpExchange;
2322
import com.sun.net.httpserver.HttpServer;
23+
import org.openqa.selenium.grid.config.MapConfig;
24+
import org.openqa.selenium.grid.server.BaseServerOptions;
25+
import org.openqa.selenium.grid.server.Server;
26+
import org.openqa.selenium.grid.web.PathResource;
27+
import org.openqa.selenium.grid.web.ResourceHandler;
28+
import org.openqa.selenium.jre.server.JreServer;
2429
import org.openqa.selenium.json.Json;
2530
import org.openqa.selenium.net.PortProber;
26-
import org.openqa.selenium.remote.http.*;
31+
import org.openqa.selenium.remote.http.HttpClient;
32+
import org.openqa.selenium.remote.http.HttpHandler;
33+
import org.openqa.selenium.remote.http.HttpMethod;
34+
import org.openqa.selenium.remote.http.HttpRequest;
35+
import org.openqa.selenium.remote.http.HttpResponse;
36+
import org.openqa.selenium.remote.http.Route;
2737

2838
import java.io.IOException;
2939
import java.io.InputStream;
@@ -33,81 +43,57 @@
3343
import java.net.MalformedURLException;
3444
import java.net.URL;
3545
import java.nio.file.Path;
36-
import java.nio.file.Paths;
37-
import java.util.*;
38-
import java.util.function.Supplier;
39-
import java.util.stream.Collectors;
46+
import java.util.Map;
47+
import java.util.Objects;
4048

4149
import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
4250
import static com.google.common.net.MediaType.JSON_UTF_8;
4351
import static java.nio.charset.StandardCharsets.UTF_8;
4452
import static java.util.concurrent.TimeUnit.SECONDS;
45-
import static java.util.stream.Collectors.mapping;
46-
import static java.util.stream.Collectors.toList;
4753
import static org.openqa.selenium.build.InProject.locate;
4854
import static org.openqa.selenium.remote.http.Contents.bytes;
4955
import static org.openqa.selenium.remote.http.Contents.string;
50-
import static org.openqa.selenium.remote.http.Route.*;
56+
import static org.openqa.selenium.remote.http.Route.get;
57+
import static org.openqa.selenium.remote.http.Route.matching;
58+
import static org.openqa.selenium.remote.http.Route.post;
5159

5260
public class JreAppServer implements AppServer {
5361

54-
private final HttpServer server;
55-
private HttpHandler handler;
62+
private final Server<?> server;
5663

5764
public JreAppServer() {
58-
try {
59-
int port = PortProber.findFreePort();
60-
server = HttpServer.create(new InetSocketAddress(port), 0);
61-
server.setExecutor(null);
62-
server.createContext(
63-
"/", httpExchange -> {
64-
HttpRequest req = new SunHttpRequest(httpExchange);
65-
66-
HttpResponse res = handler.execute(req);
67-
68-
res.getHeaderNames().forEach(
69-
name -> res.getHeaders(name).forEach(value -> httpExchange.getResponseHeaders().add(name, value)));
70-
httpExchange.sendResponseHeaders(res.getStatus(), 0);
65+
this(emulateJettyAppServer());
66+
}
7167

72-
try (InputStream in = res.getContent().get();
73-
OutputStream out = httpExchange.getResponseBody()) {
74-
ByteStreams.copy(in, out);
75-
}
76-
});
68+
public JreAppServer(HttpHandler handler) {
69+
Objects.requireNonNull(handler, "Handler to use must be set");
7770

78-
setHandler(emulateJettyAppServer());
79-
} catch (IOException e) {
80-
throw new UncheckedIOException(e);
81-
}
71+
int port = PortProber.findFreePort();
72+
server = new JreServer(
73+
new BaseServerOptions(new MapConfig(Map.of("server", Map.of("port", port)))),
74+
handler);
8275
}
8376

84-
public Route emulateJettyAppServer() {
77+
private static Route emulateJettyAppServer() {
8578
Path common = locate("common/src/web").toAbsolutePath();
86-
System.out.printf("Common is: '%s'\n", common);
8779

8880
return Route.combine(
89-
matching(req -> true).to(() -> new StaticContent(path -> Paths.get(common + path), common::resolve)),
81+
new ResourceHandler(new PathResource(common)),
9082
get("/encoding").to(EncodingHandler::new),
9183
matching(req -> req.getUri().startsWith("/page/")).to(PageHandler::new),
92-
get("/redirect").to(() -> new RedirectHandler(whereIs("/"))),
84+
get("/redirect").to(() -> new RedirectHandler()),
9385
get("/sleep").to(SleepingHandler::new),
9486
post("/upload").to(UploadHandler::new));
9587
}
9688

97-
public JreAppServer setHandler(HttpHandler handler) {
98-
this.handler = Objects.requireNonNull(handler);
99-
return this;
100-
}
101-
10289
@Override
10390
public void start() {
10491
server.start();
105-
PortProber.waitForPortUp(server.getAddress().getPort(), 5, SECONDS);
10692
}
10793

10894
@Override
10995
public void stop() {
110-
server.stop(0);
96+
server.stop();
11197
}
11298

11399
@Override
@@ -132,7 +118,7 @@ public String whereIsWithCredentials(String relativeUrl, String user, String pas
132118
user,
133119
password,
134120
getHostName(),
135-
server.getAddress().getPort(),
121+
server.getUrl().getPort(),
136122
relativeUrl);
137123
}
138124

@@ -145,7 +131,7 @@ private String createUrl(String protocol, String hostName, String relativeUrl) {
145131
return new URL(
146132
protocol,
147133
hostName,
148-
server.getAddress().getPort(),
134+
server.getUrl().getPort(),
149135
relativeUrl)
150136
.toString();
151137
} catch (MalformedURLException e) {
@@ -181,101 +167,6 @@ public String getAlternateHostName() {
181167
throw new UnsupportedOperationException("getAlternateHostName");
182168
}
183169

184-
private static class SunHttpRequest extends HttpRequest {
185-
186-
private final HttpExchange exchange;
187-
188-
public SunHttpRequest(HttpExchange exchange) {
189-
super(HttpMethod.valueOf(exchange.getRequestMethod()), exchange.getRequestURI().toString());
190-
this.exchange = exchange;
191-
}
192-
193-
@Override
194-
public HttpMethod getMethod() {
195-
return HttpMethod.valueOf(exchange.getRequestMethod());
196-
}
197-
198-
@Override
199-
public String getUri() {
200-
return exchange.getRequestURI().getPath();
201-
}
202-
203-
@Override
204-
public String getQueryParameter(String name) {
205-
String query = exchange.getRequestURI().getQuery();
206-
if (query == null) {
207-
return null;
208-
}
209-
210-
HashMap<String, List<String>> params = Arrays.stream(query.split("&"))
211-
.map(q -> {
212-
int i = q.indexOf("=");
213-
if (i == -1) {
214-
return new AbstractMap.SimpleImmutableEntry<>(q, "");
215-
}
216-
return new AbstractMap.SimpleImmutableEntry<>(q.substring(0, i), q.substring(i + 1));
217-
})
218-
.collect(Collectors.groupingBy(
219-
Map.Entry::getKey,
220-
HashMap::new,
221-
mapping(Map.Entry::getValue, toList())));
222-
223-
List<String> values = params.get(name);
224-
if (values == null || values.isEmpty()) {
225-
return null;
226-
}
227-
return values.get(0);
228-
}
229-
230-
@Override
231-
public Iterable<String> getHeaderNames() {
232-
return exchange.getRequestHeaders().keySet();
233-
}
234-
235-
@Override
236-
public Iterable<String> getHeaders(String name) {
237-
return exchange.getRequestHeaders().get(name);
238-
}
239-
240-
@Override
241-
public Supplier<InputStream> getContent() {
242-
return exchange::getRequestBody;
243-
}
244-
}
245-
246-
private class SunHttpResponse extends HttpResponse {
247-
248-
private final HttpExchange exchange;
249-
250-
public SunHttpResponse(HttpExchange exchange) {
251-
this.exchange = exchange;
252-
}
253-
254-
@Override
255-
public SunHttpResponse removeHeader(String name) {
256-
exchange.getResponseHeaders().remove(name);
257-
return this;
258-
}
259-
260-
@Override
261-
public SunHttpResponse addHeader(String name, String value) {
262-
exchange.getResponseHeaders().add(name, value);
263-
return this;
264-
}
265-
266-
@Override
267-
public SunHttpResponse setContent(Supplier<InputStream> supplier) {
268-
try (OutputStream os = exchange.getResponseBody()) {
269-
byte[] bytes = bytes(supplier);
270-
exchange.sendResponseHeaders(getStatus(), (long) bytes.length);
271-
os.write(bytes);
272-
} catch (IOException e) {
273-
throw new UncheckedIOException(e);
274-
}
275-
return this;
276-
}
277-
}
278-
279170
public static void main(String[] args) {
280171
JreAppServer server = new JreAppServer();
281172
server.start();

java/client/test/org/openqa/selenium/environment/webserver/RedirectHandler.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.openqa.selenium.remote.http.HttpHandler;
2121
import org.openqa.selenium.remote.http.HttpRequest;
2222
import org.openqa.selenium.remote.http.HttpResponse;
23+
import org.openqa.selenium.remote.http.UrlPath;
2324

2425
import java.io.UncheckedIOException;
2526

@@ -28,17 +29,13 @@
2829

2930
public class RedirectHandler implements HttpHandler {
3031

31-
private final String root;
32-
33-
public RedirectHandler(String root) {
34-
this.root = root;
35-
}
36-
3732
@Override
3833
public HttpResponse execute(HttpRequest req) throws UncheckedIOException {
34+
String targetLocation = UrlPath.relativeToContext(req, "/resultPage.html");
35+
3936
return new HttpResponse()
4037
.setStatus(HTTP_MOVED_TEMP)
41-
.setHeader("Location", root + "resultPage.html")
38+
.setHeader("Location", targetLocation)
4239
.setContent(utf8String(""));
4340
}
4441
}

0 commit comments

Comments
 (0)