17
17
18
18
package org .openqa .selenium .grid .web ;
19
19
20
+ import java .util .Arrays ;
21
+ import java .util .Collections ;
22
+ import java .util .List ;
23
+ import java .util .function .Function ;
24
+ import java .util .function .Supplier ;
25
+ import org .openqa .selenium .internal .Require ;
20
26
import org .openqa .selenium .json .Json ;
27
+ import org .openqa .selenium .remote .http .HttpHandler ;
21
28
import org .openqa .selenium .remote .http .HttpRequest ;
22
29
import org .openqa .selenium .remote .http .HttpResponse ;
23
30
import org .openqa .selenium .remote .http .Routable ;
@@ -38,17 +45,26 @@ public class GridUiRoute implements Routable {
38
45
39
46
private final Route routes ;
40
47
41
- public GridUiRoute () {
48
+ public GridUiRoute (String prefix ) {
49
+ Require .nonNull (prefix , "Prefix cannot be null" );
42
50
URL uiRoot = GridUiRoute .class .getResource (GRID_RESOURCE_WITH_PREFIX );
43
51
if (uiRoot != null ) {
44
52
ResourceHandler uiHandler = new ResourceHandler (new ClassPathResource (uiRoot , GRID_RESOURCE ));
45
53
HttpResponse uiRedirect = new HttpResponse ()
46
54
.setStatus (HTTP_MOVED_TEMP )
47
- .addHeader ("Location" , "/ui" );
48
- routes = Route .combine (
49
- get ("/" ).to (() -> req -> uiRedirect ),
50
- get ("/grid/console" ).to (() -> req -> uiRedirect ),
51
- Route .prefix ("/ui" ).to (Route .matching (req -> true ).to (() -> uiHandler )));
55
+ .addHeader ("Location" , prefix .concat ("/ui" ));
56
+
57
+ Supplier <HttpHandler > redirectHandler = () -> req -> uiRedirect ;
58
+
59
+ Routable appendRoute = Route .combine (
60
+ consoleRoute (prefix , redirectHandler ),
61
+ uiRoute (prefix , () -> uiHandler )
62
+ );
63
+ if (!prefix .isEmpty ()) {
64
+ appendRoute = Route .combine (appendRoute , redirectRoute (prefix , redirectHandler ));
65
+ }
66
+
67
+ routes = Route .combine (get ("/" ).to (redirectHandler ), appendRoute );
52
68
} else {
53
69
LOG .warning ("It was not possible to load the Grid UI." );
54
70
Json json = new Json ();
@@ -65,4 +81,35 @@ public boolean matches(HttpRequest req) {
65
81
public HttpResponse execute (HttpRequest req ) {
66
82
return routes .execute (req );
67
83
}
84
+
85
+ private static Routable uiRoute (String prefix , Supplier <HttpHandler > handler ) {
86
+ return buildRoute (
87
+ "/ui" ,
88
+ prefix ,
89
+ path -> Route .prefix (path ).to (Route .matching (req -> true ).to (handler ))
90
+ );
91
+ }
92
+
93
+ private static Routable consoleRoute (String prefix , Supplier <HttpHandler > handler ) {
94
+ return buildRoute (
95
+ "/grid/console" ,
96
+ prefix ,
97
+ path -> get (path ).to (handler )
98
+ );
99
+ }
100
+
101
+ private static Routable buildRoute (String url , String prefix , Function <String , Route > mapper ) {
102
+ List <String > subPaths = prefix .isEmpty ()
103
+ ? Collections .singletonList (url )
104
+ : Arrays .asList (prefix + url , url );
105
+ return subPaths .stream ()
106
+ .map (mapper )
107
+ .reduce (Route ::combine )
108
+ .get ();
109
+ }
110
+
111
+ private static Routable redirectRoute (String prefix , Supplier <HttpHandler > handler ) {
112
+ prefix = prefix .endsWith ("/" ) ? prefix .substring (0 , prefix .length () -1 ) : prefix ;
113
+ return get (prefix ).to (handler );
114
+ }
68
115
}
0 commit comments