diff --git a/.todo b/.todo
index 8d933f3..f803ff1 100644
--- a/.todo
+++ b/.todo
@@ -14,19 +14,16 @@
header:inline
-
- header:cache
-
footer:inline
-
- footer:cache
-
split big handler function into smaller pieces
install handler *after* index handler
+
+ proper error message on subrequest errors
+
diff --git a/ngx_http_fancyindex_module.c b/ngx_http_fancyindex_module.c
index 89cd746..abacfad 100644
--- a/ngx_http_fancyindex_module.c
+++ b/ngx_http_fancyindex_module.c
@@ -203,8 +203,8 @@ ngx_http_fancyindex_handler(ngx_http_request_t *r)
ngx_http_fancyindex_entry_t *entry;
ngx_http_fancyindex_loc_conf_t *alcf;
- static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", };
if (r->uri.data[r->uri.len - 1] != '/') {
return NGX_DECLINED;
@@ -455,11 +455,44 @@ skip_readme_len:
ngx_http_fancyindex_cmp_entries);
}
- b->last = nfi_cpymem_ssz(b->last, t01_head1);
- b->last = nfi_cpymem_str(b->last, r->uri);
- b->last = nfi_cpymem_ssz(b->last, t02_head2);
+ if (alcf->header.len > 0) {
+ /* URI is configured, make Nginx take care of with a subrequest. */
+ ngx_http_request_t *sr;
+ ngx_str_t *sr_uri = &alcf->header;
+ ngx_str_t rel_uri;
+ ngx_int_t rc;
+
+ if (*sr_uri->data != '/') {
+ /* Relative path */
+ rel_uri.len = r->uri.len + alcf->header.len;
+ rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
+ if (rel_uri.data == NULL) {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+ ngx_memcpy(ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
+ alcf->header.data, alcf->header.len);
+ sr_uri = &rel_uri;
+ }
+
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http fancyindex: header subrequest \"%V\"", sr_uri);
+
+ rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
+ if (rc == NGX_ERROR || rc == NGX_DONE) {
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http fancyindex: header subrequest for \"%V\" failed", sr_uri);
+ return rc;
+ }
+ }
+ else {
+ /* Otherwise, send the built-in header. */
+ b->last = nfi_cpymem_ssz(b->last, t01_head1);
+ b->last = nfi_cpymem_str(b->last, r->uri);
+ b->last = nfi_cpymem_ssz(b->last, t02_head2);
+
+ b->last = nfi_cpymem_ssz(b->last, t03_body1);
+ }
- b->last = nfi_cpymem_ssz(b->last, t03_body1);
b->last = nfi_cpymem_str(b->last, r->uri);
b->last = nfi_cpymem_ssz(b->last, t04_body2);
@@ -643,7 +676,38 @@ skip_readme_bottom:
b->last = nfi_cpymem_ssz(b->last, t08_body4);
/* Output page footer */
- b->last = nfi_cpymem_ssz(b->last, t09_foot1);
+ if (alcf->footer.len > 0) {
+ /* URI is configured, make Nginx take care of with a subrequest. */
+ ngx_http_request_t *sr;
+ ngx_str_t *sr_uri = &alcf->footer;
+ ngx_str_t rel_uri;
+ ngx_int_t rc;
+
+ if (*sr_uri->data != '/') {
+ /* Relative path */
+ rel_uri.len = r->uri.len + alcf->footer.len;
+ rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
+ if (rel_uri.data == NULL) {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+ ngx_memcpy(ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
+ alcf->footer.data, alcf->footer.len);
+ sr_uri = &rel_uri;
+ }
+
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http fancyindex: footer subrequest \"%V\"", sr_uri);
+
+ rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
+ if (rc == NGX_ERROR || rc == NGX_DONE) {
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http fancyindex: footer subrequest for \"%V\" failed", sr_uri);
+ return rc;
+ }
+ }
+ else {
+ b->last = nfi_cpymem_ssz(b->last, t09_foot1);
+ }
if (r == r->main) {
b->last_buf = 1;