<td>table</td>
<td>no</td>
<td>MIME header environment for the response, printed even on errors and
- persist across internal redirects</td>
+ persist across internal redirects. A read-only lua table suitable for iteration is available as r:err_headers_out_table().</td>
</tr>
<tr>
<td><code>filename</code></td>
<td>table</td>
<td>yes</td>
<td>MIME header environment from the request. This contains headers such as <code>Host,
- User-Agent, Referer</code> and so on.</td>
+ User-Agent, Referer</code> and so on. A read-only lua table suitable for iteration is available as r:headers_in_table().</td>
</tr>
<tr>
<td><code>headers_out</code></td>
<td>table</td>
<td>yes</td>
- <td>MIME header environment for the response.</td>
+ <td>MIME header environment for the response. A read-only lua table suitable for iteration is available as r:headers_out_table().</td>
</tr>
<tr>
<td><code>hostname</code></td>
<td><code>notes</code></td>
<td>table</td>
<td>yes</td>
- <td>A list of notes that can be passed on from one module to another.</td>
+ <td>A list of notes that can be passed on from one module to another. A read-only lua table suitable for iteration is available as r:notes_table().</td>
</tr>
<tr>
<td><code>options</code></td>
<td><code>subprocess_env</code></td>
<td>table</td>
<td>yes</td>
- <td>The environment variables set for this request.</td>
+ <td>The environment variables set for this request. A read-only lua table suitable for iteration is available as r:subprocess_env_table().</td>
</tr>
<tr>
<td><code>started</code></td>
return rc;
}
+/* expose apr_table as (r/o) lua table */
+static int req_aprtable2luatable(lua_State *L, apr_table_t *t)
+{
+ lua_newtable(L);
+ lua_newtable(L); /* [table, table] */
+ apr_table_do(req_aprtable2luatable_cb, L, t, NULL);
+ return 2; /* [table<string, string>, table<string, array<string>>] */
+}
+
+static int req_headers_in_table(lua_State *L)
+{
+ request_rec *r = ap_lua_check_request_rec(L, 1);
+ return req_aprtable2luatable(L, r->headers_in);
+}
+static int req_headers_out_table(lua_State *L)
+{
+ request_rec *r = ap_lua_check_request_rec(L, 1);
+ return req_aprtable2luatable(L, r->headers_out);
+}
+static int req_err_headers_out_table(lua_State *L)
+{
+ request_rec *r = ap_lua_check_request_rec(L, 1);
+ return req_aprtable2luatable(L, r->err_headers_out);
+}
+static int req_notes_table(lua_State *L)
+{
+ request_rec *r = ap_lua_check_request_rec(L, 1);
+ return req_aprtable2luatable(L, r->notes);
+}
+static int req_subprocess_env_table(lua_State *L)
+{
+ request_rec *r = ap_lua_check_request_rec(L, 1);
+ return req_aprtable2luatable(L, r->subprocess_env);
+}
/* r:parseargs() returning a lua table */
static int req_parseargs(lua_State *L)
{
makefun(&req_proxyreq_field, APL_REQ_FUNTYPE_STRING, p));
apr_hash_set(dispatch, "headers_in", APR_HASH_KEY_STRING,
makefun(&req_headers_in, APL_REQ_FUNTYPE_TABLE, p));
+ apr_hash_set(dispatch, "headers_in_table", APR_HASH_KEY_STRING,
+ makefun(&req_headers_in_table, APL_REQ_FUNTYPE_LUACFUN, p));
apr_hash_set(dispatch, "headers_out", APR_HASH_KEY_STRING,
makefun(&req_headers_out, APL_REQ_FUNTYPE_TABLE, p));
+ apr_hash_set(dispatch, "headers_out_table", APR_HASH_KEY_STRING,
+ makefun(&req_headers_out_table, APL_REQ_FUNTYPE_LUACFUN, p));
apr_hash_set(dispatch, "err_headers_out", APR_HASH_KEY_STRING,
makefun(&req_err_headers_out, APL_REQ_FUNTYPE_TABLE, p));
+ apr_hash_set(dispatch, "err_headers_out_table", APR_HASH_KEY_STRING,
+ makefun(&req_err_headers_out_table, APL_REQ_FUNTYPE_LUACFUN, p));
apr_hash_set(dispatch, "notes", APR_HASH_KEY_STRING,
makefun(&req_notes, APL_REQ_FUNTYPE_TABLE, p));
+ apr_hash_set(dispatch, "notes_table", APR_HASH_KEY_STRING,
+ makefun(&req_notes_table, APL_REQ_FUNTYPE_LUACFUN, p));
apr_hash_set(dispatch, "subprocess_env", APR_HASH_KEY_STRING,
makefun(&req_subprocess_env, APL_REQ_FUNTYPE_TABLE, p));
+ apr_hash_set(dispatch, "subprocess_env_table", APR_HASH_KEY_STRING,
+ makefun(&req_subprocess_env_table, APL_REQ_FUNTYPE_LUACFUN, p));
apr_hash_set(dispatch, "flush", APR_HASH_KEY_STRING,
makefun(&lua_ap_rflush, APL_REQ_FUNTYPE_LUACFUN, p));
apr_hash_set(dispatch, "port", APR_HASH_KEY_STRING,