Skip to content

Commit 4079e61

Browse files
committed
Rewrite handlers can add/update request headers #284
1 parent 39becc3 commit 4079e61

File tree

12 files changed

+110
-24
lines changed

12 files changed

+110
-24
lines changed

.travis.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ env:
3030
global:
3131
- LD_LIBRARY_PATH="$JAVA_HOME/jre/lib/amd64/server"
3232
# - PCRE_VER=8.41
33-
- NGINX_VER=1.23.3
33+
- NGINX_VER=1.24.0
34+
- NGINX_BRANCH=1.24
3435

3536
services:
3637
- mysql
@@ -43,7 +44,8 @@ before_install:
4344

4445
install:
4546
# - if [ ! -f local-caches/pcre-$PCRE_VER.tar.gz ]; then wget -P local-caches http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-$PCRE_VER.tar.gz; fi
46-
- if [ ! -f local-caches/nginx-$NGINX_VER.tar.gz ]; then wget -P local-caches https://nginx.org/download/nginx-$NGINX_VER.tar.gz; fi
47+
# - if [ ! -f local-caches/nginx-$NGINX_VER.tar.gz ]; then wget -P local-caches https://nginx.org/download/nginx-$NGINX_VER.tar.gz; fi
48+
- git clone -b stable-$NGINX_BRANCH --single-branch https://github.com/nginx-clojure/nginx nginx-$NGINX_VER
4749
- export NC_PJ_HOME=$(pwd)
4850
- sudo ln -s /home/travis /home/who
4951
- sudo chown travis /home/who
@@ -56,7 +58,7 @@ before_script:
5658
- export NGX_SRC=${NC_PJ_HOME}/nginx-$NGINX_VER
5759
- mysql -uroot -e 'create database nctest; grant all on nctest.* to "nginxclojure"@"%" identified by "111111"; flush privileges;'
5860
# - tar zxf local-caches/pcre-$PCRE_VER.tar.gz
59-
- tar zxf local-caches/nginx-$NGINX_VER.tar.gz
61+
# - tar zxf local-caches/nginx-$NGINX_VER.tar.gz
6062
- cd ${NGX_SRC} && ./configure --with-http_v2_module --with-select_module --with-http_ssl_module --with-http_auth_request_module --with-debug --add-module=${NC_PJ_HOME}/src/c --with-http_stub_status_module --prefix= --sbin-path=nginx --conf-path=conf/nginx.conf --error-log-path=logs/error.log --http-log-path=logs/access.log --pid-path=logs/nginx.pid --lock-path=logs/nginx.lock --http-client-body-temp-path=temp/client_temp --http-proxy-temp-path=temp/proxy_temp --http-fastcgi-temp-path=temp/fastcgi_temp --http-uwsgi-temp-path=temp/uwsgi_temp --http-scgi-temp-path=temp/scgi_temp
6163
- make
6264
- cp objs/nginx ${NC_PJ_HOME}/test/nginx-working-dir

src/java/nginx/clojure/TableEltHeaderHolder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_KEY_OFFSET;
1111
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET;
1212
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_NEXT_OFFSET;
13+
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_STR_LEN_OFFSET;
1314
import static nginx.clojure.MiniConstants.NGINX_VER;
1415
import static nginx.clojure.NginxClojureRT.UNSAFE;
1516
import static nginx.clojure.NginxClojureRT.fetchNGXString;
@@ -58,6 +59,7 @@ public void clear(long h) {
5859
long p = UNSAFE.getAddress(h + offset);
5960
if (p != 0) {
6061
NginxClojureRT.pushNGXInt(p + NGX_HTTP_CLOJURE_TEL_HASH_OFFSET, 0);
62+
NginxClojureRT.pushNGXInt(p + NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET + NGX_HTTP_CLOJURE_STR_LEN_OFFSET, 0);
6163
UNSAFE.putAddress(h + offset, 0);
6264
}
6365
}

src/java/nginx/clojure/UnknownHeaderHolder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_HASH_OFFSET;
1212
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_KEY_OFFSET;
1313
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET;
14+
import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_STR_LEN_OFFSET;
1415
import static nginx.clojure.NginxClojureRT.fetchNGXString;
1516
import static nginx.clojure.NginxClojureRT.ngx_http_clojure_mem_get_header;
1617
import static nginx.clojure.NginxClojureRT.ngx_http_clojure_mem_shadow_copy_ngx_str;
@@ -105,7 +106,9 @@ public void clear(long h) {
105106
LongBuffer lbb = kbb.order(ByteOrder.nativeOrder()).asLongBuffer();
106107

107108
for (; c > 0; c--) {
108-
pushNGXInt(lbb.get() + NGX_HTTP_CLOJURE_TEL_HASH_OFFSET, 0);
109+
long p = lbb.get();
110+
pushNGXInt(p + NGX_HTTP_CLOJURE_TEL_HASH_OFFSET, 0);
111+
pushNGXInt(p + NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET + NGX_HTTP_CLOJURE_STR_LEN_OFFSET, 0);
109112
}
110113
}
111114

src/java/nginx/clojure/clj/LazyHeaderMap.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,12 @@ public Object valAt(Object key, Object notFound) {
143143

144144
@Override
145145
public LazyHeaderMap assoc(Object key, Object val) {
146-
if ( (flag & NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT) == 0 ) {
147-
throw new UnsupportedOperationException("assoc not supported for read-only request map!");
148-
}else {
146+
// if ( (flag & NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT) == 0 ) {
147+
// throw new UnsupportedOperationException("assoc not supported for read-only request map!");
148+
// }else {
149149
put(NginxClojureHandler.normalizeHeaderNameHelper(key), val);
150150
return this;
151-
}
151+
// }
152152
}
153153

154154
@Override
@@ -158,12 +158,12 @@ public IPersistentMap assocEx(Object key, Object val) {
158158

159159
@Override
160160
public LazyHeaderMap without(Object key) {
161-
if ( (flag & NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT) == 0 ) {
162-
throw new UnsupportedOperationException("without not supported for read-only request map!");
163-
}else {
161+
// if ( (flag & NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT) == 0 ) {
162+
// throw new UnsupportedOperationException("without not supported for read-only request map!");
163+
// }else {
164164
remove(NginxClojureHandler.normalizeHeaderNameHelper(key));
165165
return this;
166-
}
166+
// }
167167
}
168168

169169

src/java/nginx/clojure/java/JavaLazyHeaderMap.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,21 +261,24 @@ protected Object unsafeGet(Object keyObj) {
261261

262262
@Override
263263
public Object put(String key, Object value) {
264-
if ((NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) != 0) {
264+
// if ((NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) != 0) {
265265

266266
if (safeCache != null) {
267267
updatedHeaders.add(key);
268268
return safeCache.put(key, value);
269269
}
270270

271271
return unsafePut(key, value);
272-
}else {
273-
throw new UnsupportedOperationException("put request header not supported now!");
274-
}
272+
// }else {
273+
// throw new UnsupportedOperationException("put request header not supported now!");
274+
// }
275275
}
276276

277277
protected Object unsafePut(String key, Object value) {
278-
NginxHeaderHolder holder = KNOWN_RESP_HEADERS.get(key);
278+
NginxHeaderHolder holder = ((NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) != 0 ?
279+
KNOWN_RESP_HEADERS : KNOWN_REQ_HEADERS)
280+
.get(key);
281+
279282
if (holder == null) {
280283
holder = new UnknownHeaderHolder(key,
281284
(NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) != 0 ? NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET
@@ -291,9 +294,9 @@ protected Object unsafePut(String key, Object value) {
291294

292295
@Override
293296
public Object remove(Object key) {
294-
if ((NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) == 0) {
295-
throw new UnsupportedOperationException("remove request header not supported now!");
296-
}
297+
// if ((NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) == 0) {
298+
// throw new UnsupportedOperationException("remove request header not supported now!");
299+
// }
297300
if (key == null) {
298301
return null;
299302
}
@@ -308,7 +311,10 @@ public Object remove(Object key) {
308311
}
309312

310313
protected Object unsafeRemove(Object key) {
311-
NginxHeaderHolder holder = KNOWN_RESP_HEADERS.get(key);
314+
NginxHeaderHolder holder = ((NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) != 0 ?
315+
KNOWN_RESP_HEADERS : KNOWN_REQ_HEADERS)
316+
.get(key);
317+
312318
if (holder == null) {
313319
holder = new UnknownHeaderHolder((String)key,
314320
(NGX_HTTP_CLOJURE_GET_HEADER_FLAG_HEADERS_OUT & flag) != 0 ? NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET

test/clojure/nginx/clojure/rewrite_handler_for_test.clj

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,15 @@
1717
(if (= "VIP" (compute-user-role req))
1818
(set-ngx-var! req "limit_rate" "200k")
1919
(set-ngx-var! req "limit_rate" "10k"))
20-
phrase-done)
20+
phrase-done)
21+
22+
(defn headers-more [req]
23+
(let [headers (:headers req)]
24+
(dissoc! headers "OK")
25+
(dissoc! headers "User-Agent")
26+
;(assoc! headers "User-Agent" "")
27+
(dissoc! headers "Accept-Encoding")
28+
(assoc! headers "Accept-Encoding" "gzip")
29+
(assoc! headers "jwt-token" "Good!")
30+
phrase-done))
31+

test/clojure/nginx/clojure/test_all.clj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,25 @@
663663
(debug-println "=================javarewritesimple=============================")
664664
(is (= 200 (:status r)))
665665
(is (= "Hello,Xfeep!" (:body r)))))
666+
(testing "javarewriteheaders"
667+
(let [r (client/get (str "http://" *host* ":" *port* "/javarewriteheaders") {:follow-redirects false})
668+
h (:headers r)
669+
b (-> r :body (json/read-str))]
670+
(debug-println r)
671+
(debug-println "=================javarewriteheaders=============================")
672+
(is (= 200 (:status r)))
673+
(is (= "Good!" (b "jwt-token")))
674+
(is (= "gzip" (b "Accept-Encoding")))))
675+
(testing "/cljrewrite/headers"
676+
(let [r (client/get (str "http://" *host* ":" *port* "/cljrewrite/headers") {:follow-redirects false})
677+
h (:headers r)
678+
b (-> r :body (json/read-str))]
679+
(debug-println r)
680+
(debug-println "=================/cljrewrite/headers=============================")
681+
(is (= 200 (:status r)))
682+
(is (= "Good!" (b "jwt-token")))
683+
(is (= nil (b "User-Agent")))
684+
(is (= "gzip" (b "Accept-Encoding")))))
666685
(testing "rewrite proxy pass"
667686
(let [r (client/get (str "http://" *host* ":" *port* "/uptest") {:follow-redirects false})
668687
h (:headers r)

test/java/nginx/clojure/java/RewriteHandlerTestSet4NginxJavaRingHandler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package nginx.clojure.java;
22

3+
import static nginx.clojure.MiniConstants.HEADERS;
4+
35
import java.io.BufferedReader;
46
import java.io.ByteArrayOutputStream;
57
import java.io.IOException;
@@ -36,6 +38,17 @@ public Object[] invoke(Map<String, Object> request) {
3638

3739
}
3840

41+
public static class HeadersRewriteHandler implements NginxJavaRingHandler {
42+
@Override
43+
public Object[] invoke(Map<String, Object> request) throws IOException {
44+
Map<String, String> requestHeaders = (Map<String, String>) request.get(HEADERS);
45+
requestHeaders.put("jwt-token", "Good!");
46+
requestHeaders.put("accept-encoding", "gzip");
47+
return Constants.PHASE_DONE;
48+
}
49+
50+
}
51+
3952
public static class ExceptionInRewriteHandler implements NginxJavaRingHandler {
4053

4154
@Override

test/nginx-working-dir/conf/nginx-coroutine-jdk19.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,12 @@ http {
324324
rewrite_handler_name 'nginx.clojure.java.RewriteHandlerTestSet4NginxJavaRingHandler$SimpleRewriteHandler';
325325
handler_name 'nginx.clojure.java.RewriteHandlerTestSet4NginxJavaRingHandler$SimpleVarHandler';
326326
}
327+
328+
location /javarewriteheaders {
329+
handler_type 'java';
330+
rewrite_handler_name 'nginx.clojure.java.RewriteHandlerTestSet4NginxJavaRingHandler$HeadersRewriteHandler';
331+
proxy_pass http://localhost:8080/java/loadheader;
332+
}
327333

328334
location /javarewritebybodyproxy {
329335
always_read_body on;

test/nginx-working-dir/conf/nginx-coroutine.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,12 @@ http {
314314
rewrite_handler_name 'nginx.clojure.java.RewriteHandlerTestSet4NginxJavaRingHandler$SimpleRewriteHandler';
315315
handler_name 'nginx.clojure.java.RewriteHandlerTestSet4NginxJavaRingHandler$SimpleVarHandler';
316316
}
317+
318+
location /javarewriteheaders {
319+
handler_type 'java';
320+
rewrite_handler_name 'nginx.clojure.java.RewriteHandlerTestSet4NginxJavaRingHandler$HeadersRewriteHandler';
321+
proxy_pass http://localhost:8080/java/loadheader;
322+
}
317323

318324
location /javarewritebybodyproxy {
319325
always_read_body on;

0 commit comments

Comments
 (0)