⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_http_autoindex_module.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
        entry->escape = 2 * ngx_escape_uri(NULL, ngx_de_name(&dir), len,                                           NGX_ESCAPE_HTML);        if (r->utf8) {            entry->utf_len = ngx_utf_length(entry->name.data, entry->name.len);        } else {            entry->utf_len = len;        }        entry->dir = ngx_de_is_dir(&dir);        entry->mtime = ngx_de_mtime(&dir);        entry->size = ngx_de_size(&dir);    }    if (ngx_close_dir(&dir) == NGX_ERROR) {        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,                      ngx_close_dir_n " \"%s\" failed", &path);    }    len = sizeof(title) - 1          + r->uri.len          + sizeof(header) - 1          + r->uri.len          + sizeof("</h1>") - 1          + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1          + sizeof("</pre><hr>") - 1          + sizeof(tail) - 1;    entry = entries.elts;    for (i = 0; i < entries.nelts; i++) {        len += sizeof("<a href=\"") - 1            + entry[i].name.len + entry[i].escape            + 1                                          /* 1 is for "/" */            + sizeof("\">") - 1            + entry[i].name.len - entry[i].utf_len            + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2            + sizeof("</a>") - 1            + sizeof(" 28-Sep-1970 12:00 ") - 1            + 20                                         /* the file size */            + 2;    }    b = ngx_create_temp_buf(r->pool, len);    if (b == NULL) {        return NGX_HTTP_INTERNAL_SERVER_ERROR;    }    if (entries.nelts > 1) {        ngx_qsort(entry, (size_t) entries.nelts,                  sizeof(ngx_http_autoindex_entry_t),                  ngx_http_autoindex_cmp_entries);    }    b->last = ngx_cpymem(b->last, title, sizeof(title) - 1);    b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);    b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);    b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);    b->last = ngx_cpymem(b->last, "</h1>", sizeof("</h1>") - 1);    b->last = ngx_cpymem(b->last, "<hr><pre><a href=\"../\">../</a>" CRLF,                         sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);    tp = ngx_timeofday();    for (i = 0; i < entries.nelts; i++) {        b->last = ngx_cpymem(b->last, "<a href=\"", sizeof("<a href=\"") - 1);        if (entry[i].escape) {            ngx_escape_uri(b->last, entry[i].name.data, entry[i].name.len,                           NGX_ESCAPE_HTML);            b->last += entry[i].name.len + entry[i].escape;        } else {            b->last = ngx_cpymem(b->last, entry[i].name.data,                                 entry[i].name.len);        }        if (entry[i].dir) {            *b->last++ = '/';        }        *b->last++ = '"';        *b->last++ = '>';        len = entry[i].utf_len;        if (entry[i].name.len - len) {            if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {                copy = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1;            } else {                copy = NGX_HTTP_AUTOINDEX_NAME_LEN + 1;            }            b->last = ngx_utf_cpystrn(b->last, entry[i].name.data, copy);            last = b->last;        } else {            b->last = ngx_cpystrn(b->last, entry[i].name.data,                                  NGX_HTTP_AUTOINDEX_NAME_LEN + 1);            last = b->last - 3;        }        if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {            b->last = ngx_cpymem(last, "..&gt;</a>", sizeof("..&gt;</a>") - 1);        } else {            if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {                *b->last++ = '/';                len++;            }            b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);            ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);            b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;        }        *b->last++ = ' ';        ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm);        b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",                              tm.ngx_tm_mday,                              months[tm.ngx_tm_mon - 1],                              tm.ngx_tm_year,                              tm.ngx_tm_hour,                              tm.ngx_tm_min);        if (alcf->exact_size) {            if (entry[i].dir) {                b->last = ngx_cpymem(b->last,  "                  -",                                     sizeof("                  -") - 1);            } else {                b->last = ngx_sprintf(b->last, "%19O", entry[i].size);            }        } else {            if (entry[i].dir) {                b->last = ngx_cpymem(b->last,  "      -",                                     sizeof("      -") - 1);            } else {                length = entry[i].size;                if (length > 1024 * 1024 * 1024 - 1) {                    size = (ngx_int_t) (length / (1024 * 1024 * 1024));                    if ((length % (1024 * 1024 * 1024))                                                > (1024 * 1024 * 1024 / 2 - 1))                    {                        size++;                    }                    scale = 'G';                } else if (length > 1024 * 1024 - 1) {                    size = (ngx_int_t) (length / (1024 * 1024));                    if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {                        size++;                    }                    scale = 'M';                } else if (length > 9999) {                    size = (ngx_int_t) (length / 1024);                    if (length % 1024 > 511) {                        size++;                    }                    scale = 'K';                } else {                    size = (ngx_int_t) length;                    scale = '\0';                }                if (scale) {                    b->last = ngx_sprintf(b->last, "%6i%c", size, scale);                } else {                    b->last = ngx_sprintf(b->last, " %6i", size);                }            }        }        *b->last++ = CR;        *b->last++ = LF;    }    /* TODO: free temporary pool */    b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);    b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);    if (r == r->main) {        b->last_buf = 1;    }    b->last_in_chain = 1;    out.buf = b;    out.next = NULL;    return ngx_http_output_filter(r, &out);}static int ngx_libc_cdeclngx_http_autoindex_cmp_entries(const void *one, const void *two){    ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one;    ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two;    if (first->dir && !second->dir) {        /* move the directories to the start */        return -1;    }    if (!first->dir && second->dir) {        /* move the directories to the start */        return 1;    }    return (int) ngx_strcmp(first->name.data, second->name.data);}#if 0static ngx_buf_t *ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx, size_t size){    ngx_chain_t  *cl;    if (ctx->buf) {        if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) {            return ctx->buf;        }        ctx->size += ctx->buf->last - ctx->buf->pos;    }    ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size);    if (ctx->buf == NULL) {        return NULL;    }    cl = ngx_alloc_chain_link(ctx->pool);    if (cl == NULL) {        return NULL;    }    cl->buf = ctx->buf;    cl->next = NULL;    *ctx->last_out = cl;    ctx->last_out = &cl->next;    return ctx->buf;}#endifstatic ngx_int_tngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name){    if (ngx_close_dir(dir) == NGX_ERROR) {        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,                      ngx_close_dir_n " \"%V\" failed", name);    }    return NGX_HTTP_INTERNAL_SERVER_ERROR;}static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf){    ngx_http_autoindex_loc_conf_t  *conf;    conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t));    if (conf == NULL) {        return NGX_CONF_ERROR;    }    conf->enable = NGX_CONF_UNSET;    conf->localtime = NGX_CONF_UNSET;    conf->exact_size = NGX_CONF_UNSET;    return conf;}static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child){    ngx_http_autoindex_loc_conf_t *prev = parent;    ngx_http_autoindex_loc_conf_t *conf = child;    ngx_conf_merge_value(conf->enable, prev->enable, 0);    ngx_conf_merge_value(conf->localtime, prev->localtime, 0);    ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1);    return NGX_CONF_OK;}static ngx_int_tngx_http_autoindex_init(ngx_conf_t *cf){    ngx_http_handler_pt        *h;    ngx_http_core_main_conf_t  *cmcf;    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);    if (h == NULL) {        return NGX_ERROR;    }    *h = ngx_http_autoindex_handler;    return NGX_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -