1
1
package top .meethigher .proxy .http ;
2
2
3
3
import io .vertx .core .Vertx ;
4
- import io .vertx .core .http .PoolOptions ;
4
+ import io .vertx .core .http .* ;
5
5
import io .vertx .ext .web .Router ;
6
+ import org .junit .Assert ;
6
7
import org .junit .Test ;
7
8
import org .slf4j .Logger ;
8
9
import org .slf4j .LoggerFactory ;
9
10
11
+ import java .util .LinkedHashMap ;
12
+ import java .util .Map ;
13
+ import java .util .concurrent .ExecutionException ;
10
14
import java .util .concurrent .TimeUnit ;
15
+ import java .util .concurrent .locks .LockSupport ;
11
16
12
17
public class ReverseHttpProxyTest {
13
18
@@ -58,4 +63,94 @@ public void testDomain80() throws Exception {
58
63
proxy .stop ();
59
64
}
60
65
66
+ /**
67
+ * 用来测试Vertx的route拦截规则。
68
+ * 结论
69
+ * 像一些特殊的路由,比如/route/、/route,即可以匹配/route/*,也可以匹配/route,就看是谁的优先级更高了
70
+ */
71
+ @ Test
72
+ public void testVertxRoute () throws Exception {
73
+ Router router = Router .router (vertx );
74
+ router .route ("/route/*" ).handler (ctx -> {
75
+ ctx .response ().end ("/route/*" );
76
+ });
77
+ router .route ("/route" ).order (Integer .MIN_VALUE ).handler (ctx -> {
78
+ ctx .response ().end ("/route" );
79
+ });
80
+ vertx .createHttpServer ().requestHandler (router ).listen (666 );
81
+
82
+ LockSupport .park ();
83
+ }
84
+
85
+
86
+ /**
87
+ * 解决bug
88
+ * https://github.com/meethigher/tcp-reverse-proxy/issues/1
89
+ * <p>
90
+ * 首先需要理解vertx的route匹配规则
91
+ *
92
+ * @see ReverseHttpProxyTest#testVertxRoute()
93
+ */
94
+ @ Test
95
+ public void testProxyUrl1 () throws Exception {
96
+ // 启动后端
97
+ vertx .createHttpServer ().requestHandler (req -> {
98
+ req .response ().end (req .absoluteURI ());
99
+ }).listen (888 );
100
+ // 启动代理
101
+ ReverseHttpProxy .create (vertx )
102
+ .addRoute (new ProxyRoute ()
103
+ .setSourceUrl ("/*" )
104
+ .setTargetUrl ("http://127.0.0.1:888" ), 0 )
105
+ .addRoute (new ProxyRoute ()
106
+ .setSourceUrl ("/route/*" )
107
+ .setTargetUrl ("http://10.0.0.1:888/route" ), -1 )
108
+ .addRoute (new ProxyRoute ()
109
+ .setSourceUrl ("/route/static" )
110
+ .setTargetUrl ("http://localhost:888/route/static" ), -2
111
+ )
112
+ .port (8080 ).start ();
113
+
114
+ // 测试用例
115
+ // key为测试样例,value为正确返回结果
116
+ Map <String , String > cases = new LinkedHashMap <>();
117
+ cases .put ("http://127.0.0.1:8080" , "http://127.0.0.1:888/" );
118
+ cases .put ("http://127.0.0.1:8080/" , "http://127.0.0.1:888/" );
119
+ cases .put ("http://127.0.0.1:8080/test/" , "http://127.0.0.1:888/test/" );
120
+ cases .put ("http://127.0.0.1:8080/test" , "http://127.0.0.1:888/test" );
121
+ cases .put ("http://127.0.0.1:8080/route/static" , "http://localhost:888/route/static" );
122
+ cases .put ("http://127.0.0.1:8080/route/1" , "http://10.0.0.1:888/route/1" );
123
+ cases .put ("http://127.0.0.1:8080/route/" , "http://10.0.0.1:888/route/" );
124
+ cases .put ("http://127.0.0.1:8080/route" , "http://10.0.0.1:888/route" );
125
+ cases .put ("http://127.0.0.1:8080/route?name=1&age=1" , "http://10.0.0.1:888/route?name=1&age=1" );
126
+
127
+ proxyUrlCommon (cases );
128
+
129
+
130
+ }
131
+
132
+ private void proxyUrlCommon (Map <String , String > cases ) throws InterruptedException , ExecutionException {
133
+ HttpClient httpClient = Vertx .vertx ().createHttpClient ();
134
+
135
+ boolean actual = true ;
136
+
137
+ for (String key : cases .keySet ()) {
138
+ HttpClientRequest httpClientRequest = httpClient .request (new RequestOptions ().setMethod (HttpMethod .GET ).setAbsoluteURI (key ))
139
+ .toCompletionStage () // 转换为 CompletionStage
140
+ .toCompletableFuture () // 转换为 CompletableFuture
141
+ .get ();// 阻塞等待完成
142
+ HttpClientResponse httpClientResponse = httpClientRequest .send ().toCompletionStage ().toCompletableFuture ().get ();
143
+ String result = httpClientResponse .body ().toCompletionStage ().toCompletableFuture ().get ().toString ();
144
+ String s = cases .get (key );
145
+ System .out .println ("请求地址: " + key + "\n 实际结果: " + result + "\n 预期结果: " + s );
146
+ System .out .println (s .equals (result ));
147
+ System .out .println ("===============" );
148
+ if (actual && !s .equals (result )) {
149
+ actual = false ;
150
+ }
151
+ }
152
+
153
+ Assert .assertTrue (actual );
154
+ }
155
+
61
156
}
0 commit comments