19
19
20
20
import com .google .common .collect .ImmutableMap ;
21
21
import com .google .common .io .ByteStreams ;
22
- import com .sun .net .httpserver .HttpExchange ;
23
22
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 ;
24
29
import org .openqa .selenium .json .Json ;
25
30
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 ;
27
37
28
38
import java .io .IOException ;
29
39
import java .io .InputStream ;
33
43
import java .net .MalformedURLException ;
34
44
import java .net .URL ;
35
45
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 ;
40
48
41
49
import static com .google .common .net .HttpHeaders .CONTENT_TYPE ;
42
50
import static com .google .common .net .MediaType .JSON_UTF_8 ;
43
51
import static java .nio .charset .StandardCharsets .UTF_8 ;
44
52
import static java .util .concurrent .TimeUnit .SECONDS ;
45
- import static java .util .stream .Collectors .mapping ;
46
- import static java .util .stream .Collectors .toList ;
47
53
import static org .openqa .selenium .build .InProject .locate ;
48
54
import static org .openqa .selenium .remote .http .Contents .bytes ;
49
55
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 ;
51
59
52
60
public class JreAppServer implements AppServer {
53
61
54
- private final HttpServer server ;
55
- private HttpHandler handler ;
62
+ private final Server <?> server ;
56
63
57
64
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
+ }
71
67
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" );
77
70
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 );
82
75
}
83
76
84
- public Route emulateJettyAppServer () {
77
+ private static Route emulateJettyAppServer () {
85
78
Path common = locate ("common/src/web" ).toAbsolutePath ();
86
- System .out .printf ("Common is: '%s'\n " , common );
87
79
88
80
return Route .combine (
89
- matching ( req -> true ). to (() -> new StaticContent ( path -> Paths . get ( common + path ), common :: resolve )),
81
+ new ResourceHandler ( new PathResource ( common )),
90
82
get ("/encoding" ).to (EncodingHandler ::new ),
91
83
matching (req -> req .getUri ().startsWith ("/page/" )).to (PageHandler ::new ),
92
- get ("/redirect" ).to (() -> new RedirectHandler (whereIs ( "/" ) )),
84
+ get ("/redirect" ).to (() -> new RedirectHandler ()),
93
85
get ("/sleep" ).to (SleepingHandler ::new ),
94
86
post ("/upload" ).to (UploadHandler ::new ));
95
87
}
96
88
97
- public JreAppServer setHandler (HttpHandler handler ) {
98
- this .handler = Objects .requireNonNull (handler );
99
- return this ;
100
- }
101
-
102
89
@ Override
103
90
public void start () {
104
91
server .start ();
105
- PortProber .waitForPortUp (server .getAddress ().getPort (), 5 , SECONDS );
106
92
}
107
93
108
94
@ Override
109
95
public void stop () {
110
- server .stop (0 );
96
+ server .stop ();
111
97
}
112
98
113
99
@ Override
@@ -132,7 +118,7 @@ public String whereIsWithCredentials(String relativeUrl, String user, String pas
132
118
user ,
133
119
password ,
134
120
getHostName (),
135
- server .getAddress ().getPort (),
121
+ server .getUrl ().getPort (),
136
122
relativeUrl );
137
123
}
138
124
@@ -145,7 +131,7 @@ private String createUrl(String protocol, String hostName, String relativeUrl) {
145
131
return new URL (
146
132
protocol ,
147
133
hostName ,
148
- server .getAddress ().getPort (),
134
+ server .getUrl ().getPort (),
149
135
relativeUrl )
150
136
.toString ();
151
137
} catch (MalformedURLException e ) {
@@ -181,101 +167,6 @@ public String getAlternateHostName() {
181
167
throw new UnsupportedOperationException ("getAlternateHostName" );
182
168
}
183
169
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
-
279
170
public static void main (String [] args ) {
280
171
JreAppServer server = new JreAppServer ();
281
172
server .start ();
0 commit comments