Skip to content

Commit 4d6ed8d

Browse files
authored
feat: set request header (#40)
1 parent debf25d commit 4d6ed8d

File tree

3 files changed

+91
-5
lines changed

3 files changed

+91
-5
lines changed

src/http/ngx_http_wasm_api.c

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ static int (*get_req_headers_count) (ngx_http_request_t *r,
5050
int max, int *truncated);
5151
static int (*get_req_headers) (ngx_http_request_t *r,
5252
ngx_http_wasm_table_elt_t *out, int count, int raw);
53+
static int (*set_req_header) (ngx_http_request_t *r,
54+
const char *key, size_t key_len, const char *value,
55+
size_t value_len, ngx_str_t *mvals, size_t mvals_len,
56+
int override, char **errmsg);
5357

5458
static char *err_bad_ctx = "API disabled in the current context";
5559
static char *err_no_req_ctx = "no request ctx found";
@@ -97,6 +101,7 @@ ngx_http_wasm_resolve_symbol(void)
97101
must_resolve_symbol(get_resp_header, ngx_http_lua_ffi_get_resp_header);
98102
must_resolve_symbol(get_req_headers_count, ngx_http_lua_ffi_req_get_headers_count);
99103
must_resolve_symbol(get_req_headers, ngx_http_lua_ffi_req_get_headers);
104+
must_resolve_symbol(set_req_header, ngx_http_lua_ffi_req_set_header);
100105

101106
return NGX_OK;
102107
}
@@ -183,6 +188,35 @@ ngx_http_wasm_get_buf_to_write(ngx_log_t *log, int32_t len,
183188
}
184189

185190

191+
static ngx_int_t
192+
ngx_http_wasm_set_req_header(ngx_http_request_t *r,
193+
const char *key, size_t key_len,
194+
const char *val, size_t val_len,
195+
int override)
196+
{
197+
char *errmsg = NULL;
198+
ngx_int_t rc;
199+
200+
rc = set_req_header(r, key, key_len, val, val_len, NULL, 0,
201+
override, &errmsg);
202+
if (rc != NGX_OK && rc != NGX_DECLINED) {
203+
if (rc == FFI_BAD_CONTEXT) {
204+
errmsg = err_bad_ctx;
205+
}
206+
207+
if (errmsg != NULL) {
208+
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
209+
"faied to set request header %*s to %*s: %s",
210+
key_len, key, val_len, val, errmsg);
211+
}
212+
213+
return NGX_ERROR;
214+
}
215+
216+
return NGX_OK;
217+
}
218+
219+
186220
static ngx_int_t
187221
ngx_http_wasm_set_resp_header(ngx_http_request_t *r,
188222
const char *key, size_t key_len, int is_nil,
@@ -203,7 +237,7 @@ ngx_http_wasm_set_resp_header(ngx_http_request_t *r,
203237

204238
if (errmsg != NULL) {
205239
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
206-
"faied to set header %*s to %*s: %s",
240+
"faied to set response header %*s to %*s: %s",
207241
key_len, key, val_len, val, errmsg);
208242
}
209243

@@ -867,11 +901,21 @@ proxy_replace_header_map_value(int32_t type, int32_t key_data, int32_t key_size,
867901
must_get_memory(key, log, key_data, key_size);
868902
must_get_memory(val, log, data, size);
869903

870-
if (type == PROXY_MAP_TYPE_HTTP_RESPONSE_HEADERS) {
904+
switch (type) {
905+
case PROXY_MAP_TYPE_HTTP_REQUEST_HEADERS:
906+
rc = ngx_http_wasm_set_req_header(r, key, key_size, val, size, 1);
907+
break;
908+
909+
case PROXY_MAP_TYPE_HTTP_RESPONSE_HEADERS:
871910
rc = ngx_http_wasm_set_resp_header(r, key, key_size, 0, val, size, 1);
872-
if (rc != NGX_OK) {
873-
return PROXY_RESULT_BAD_ARGUMENT;
874-
}
911+
break;
912+
913+
default:
914+
return PROXY_RESULT_BAD_ARGUMENT;
915+
}
916+
917+
if (rc != NGX_OK) {
918+
return PROXY_RESULT_BAD_ARGUMENT;
875919
}
876920

877921
return PROXY_RESULT_OK;

t/http_req_header.t

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,41 @@ get request header: host localhost
122122
get request header: connection close
123123
get request header: x-api foo
124124
get request header: x-api bar
125+
126+
127+
128+
=== TEST 7: set header
129+
--- config
130+
location /t {
131+
access_by_lua_block {
132+
local wasm = require("resty.proxy-wasm")
133+
local plugin = assert(wasm.load("plugin", "t/testdata/http_header/main.go.wasm"))
134+
local ctx = assert(wasm.on_configure(plugin, 'req_hdr_set'))
135+
assert(wasm.on_http_request_headers(ctx))
136+
}
137+
content_by_lua_block {
138+
ngx.say(ngx.var.http_foo)
139+
}
140+
}
141+
--- more_headers
142+
FOO: foo
143+
--- response_body
144+
bar
145+
146+
147+
148+
=== TEST 8: set header, missing
149+
--- config
150+
location /t {
151+
access_by_lua_block {
152+
local wasm = require("resty.proxy-wasm")
153+
local plugin = assert(wasm.load("plugin", "t/testdata/http_header/main.go.wasm"))
154+
local ctx = assert(wasm.on_configure(plugin, 'req_hdr_set'))
155+
assert(wasm.on_http_request_headers(ctx))
156+
}
157+
content_by_lua_block {
158+
ngx.say(ngx.var.http_foo)
159+
}
160+
}
161+
--- response_body
162+
bar

t/testdata/http_header/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,17 @@ func (ctx *httpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) t
5757
return types.ActionContinue
5858
}
5959
proxywasm.LogWarnf("get request header: %v", res)
60+
6061
case "req_hdr_get_caseless":
6162
res, err := proxywasm.GetHttpRequestHeader("x_api")
6263
if err != nil {
6364
proxywasm.LogErrorf("error get request header: %v", err)
6465
return types.ActionContinue
6566
}
6667
proxywasm.LogWarnf("get request header: %v", res)
68+
69+
case "req_hdr_set":
70+
proxywasm.ReplaceHttpRequestHeader("foo", "bar")
6771
}
6872

6973
return types.ActionContinue

0 commit comments

Comments
 (0)