#define ngx_js_http_version(major, minor) ((major) * 1000 + (minor))
+#define NGX_JS_USER_AGENT "nginx-js"
static void ngx_js_http_resolve_handler(ngx_resolver_ctx_t *ctx);
{
ngx_str_t method;
ngx_uint_t i;
- njs_bool_t has_host;
+ njs_bool_t has_host, has_user_agent;
ngx_list_part_t *part;
ngx_js_tb_elt_t *h;
njs_chb_append_literal(&http->chain, " HTTP/1.1" CRLF);
has_host = 0;
+ has_user_agent = 0;
part = &request->headers.header_list.part;
h = part->elts;
njs_chb_append_literal(&http->chain, "Host: ");
njs_chb_append(&http->chain, h[i].value.data, h[i].value.len);
njs_chb_append_literal(&http->chain, CRLF);
- break;
+ continue;
+ }
+
+ if (h[i].key.len == 10
+ && ngx_strncasecmp(h[i].key.data, (u_char *) "User-Agent", 10) == 0)
+ {
+ has_user_agent = 1;
+ njs_chb_append_literal(&http->chain, "User-Agent: ");
+ njs_chb_append(&http->chain, h[i].value.data, h[i].value.len);
+ njs_chb_append_literal(&http->chain, CRLF);
+ continue;
}
}
njs_chb_append_literal(&http->chain, CRLF);
}
+ if (!has_user_agent) {
+ njs_chb_append_literal(&http->chain, "User-Agent: ");
+ njs_chb_append(&http->chain, (u_char *) NGX_JS_USER_AGENT,
+ sizeof(NGX_JS_USER_AGENT) - 1);
+ njs_chb_append_literal(&http->chain, CRLF);
+ }
+
ngx_js_fetch_append_request_headers(&http->chain, request);
if (!http->keepalive) {
js_content test.host_header;
}
+ location /user_agent_header {
+ js_content test.user_agent_header;
+ }
+
location /header_iter {
js_content test.header_iter;
}
location /host {
return 200 $http_host;
}
+
+ location /user_agent {
+ return 200 $http_user_agent;
+ }
}
}
r.return(200, body);
}
+ async function user_agent_header(r) {
+ let opts = {};
+ if (r.args.ua) {
+ opts.headers = { 'User-Agent': r.args.ua };
+ }
+
+ const reply = await ngx.fetch(`http://127.0.0.1:$p1/user_agent`, opts);
+ const body = await reply.text();
+ r.return(200, body);
+ }
+
async function body_special(r) {
let opts = {};
export default {njs: test_njs, body, broken, broken_response, body_special,
chain, chunked_ok, chunked_fail, header, header_iter,
- host_header, multi, loc, property, body_content_length };
+ host_header, multi, loc, property, body_content_length,
+ user_agent_header };
EOF
$t->try_run('no njs.fetch');
-$t->plan(38);
+$t->plan(40);
$t->run_daemon(\&http_daemon, port(8082));
$t->waitforsocket('127.0.0.1:' . port(8082));
}
+like(http_get('/user_agent_header'),
+ qr/200 OK.*nginx-js\/1.0$/s,
+ 'fetch default user-agent header');
+like(http_get('/user_agent_header?ua=My-User-Agent'),
+ qr/200 OK.*My-User-Agent$/s, 'fetch user-agent header');
+
###############################################################################
sub has_version {