Compare commits
150 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cbc0d3fca4 | ||
![]() |
e5f227686a | ||
![]() |
a634077b5f | ||
![]() |
674e99547d | ||
![]() |
1494521744 | ||
![]() |
f50d7b799f | ||
![]() |
860a9cbd5e | ||
![]() |
2346fa9bde | ||
![]() |
823f162085 | ||
![]() |
98f824ef91 | ||
![]() |
8efe0b01fa | ||
![]() |
e505eb2a13 | ||
![]() |
778561eabf | ||
![]() |
83bef5c8a6 | ||
![]() |
b9ecd5bcb4 | ||
![]() |
698e7ce4b9 | ||
![]() |
7ee6b81661 | ||
![]() |
e8a4a7eced | ||
![]() |
3d47d0d6b1 | ||
![]() |
60e39e0929 | ||
![]() |
a1890354e5 | ||
![]() |
20ba8038ac | ||
![]() |
5930c29d6a | ||
![]() |
6cdffdb0af | ||
![]() |
b0e1fa83a8 | ||
![]() |
2e9555e759 | ||
![]() |
391d2d5447 | ||
![]() |
566ad22a61 | ||
![]() |
5ca7cb32af | ||
![]() |
c33b05af9e | ||
![]() |
4fc6bb10d7 | ||
![]() |
618e2d154e | ||
![]() |
f52bacea8f | ||
![]() |
527511fbf8 | ||
![]() |
5ac161ccc3 | ||
![]() |
140dcb7a8f | ||
![]() |
6637a7afab | ||
![]() |
d3d7adc89d | ||
![]() |
52a17b7a17 | ||
![]() |
63d19686df | ||
![]() |
b3e06fd31b | ||
![]() |
c0448985b6 | ||
![]() |
a05006e3c4 | ||
![]() |
56934db14c | ||
![]() |
42e21c9153 | ||
![]() |
7444208a36 | ||
![]() |
94bb8164b2 | ||
![]() |
11101de198 | ||
![]() |
58fecc865d | ||
![]() |
21a084d61d | ||
![]() |
fa13aef31b | ||
![]() |
47ce20d993 | ||
![]() |
7abb6e3693 | ||
![]() |
473c1de024 | ||
![]() |
a3929d7074 | ||
![]() |
e6ddb517ca | ||
![]() |
aa0be2dcaa | ||
![]() |
d1b2f36738 | ||
![]() |
a983c2c899 | ||
![]() |
2b2244551f | ||
![]() |
6f812eba8e | ||
![]() |
604b43b336 | ||
![]() |
60f09e450d | ||
![]() |
501f9bc63c | ||
![]() |
5f265ab6eb | ||
![]() |
df593a20f3 | ||
![]() |
5dd4ec3b3c | ||
![]() |
4ae6c87246 | ||
![]() |
c5bf62212e | ||
![]() |
16e6feefa9 | ||
![]() |
60c4338b96 | ||
![]() |
9446fd7e4b | ||
![]() |
071697588c | ||
![]() |
c1b1be3615 | ||
![]() |
b21ec45790 | ||
![]() |
eb2fd247ea | ||
![]() |
a97cc6639d | ||
![]() |
6ffd207a56 | ||
![]() |
6e2f3fbe1c | ||
![]() |
04936f197b | ||
![]() |
b1182f7758 | ||
![]() |
57ff1a2a89 | ||
![]() |
a551b5e3ea | ||
![]() |
ee17ca1a65 | ||
![]() |
5b53c2b0b2 | ||
![]() |
77d2c60c8e | ||
![]() |
6442f26527 | ||
![]() |
1e438a694d | ||
![]() |
f2f0cdc9de | ||
![]() |
c5deb79e8f | ||
![]() |
bdaceb6583 | ||
![]() |
a3a7626de9 | ||
![]() |
71b7146577 | ||
![]() |
0a8450c812 | ||
![]() |
5e621202bd | ||
![]() |
3ec11d5d87 | ||
![]() |
07fb4ab214 | ||
![]() |
a1bb63c93b | ||
![]() |
f051caa108 | ||
![]() |
038434dd9f | ||
![]() |
3789187861 | ||
![]() |
8d47b33509 | ||
![]() |
3c70b9f5c8 | ||
![]() |
85ad712764 | ||
![]() |
3df2d5f715 | ||
![]() |
866a9e18a0 | ||
![]() |
7dd46a6dd2 | ||
![]() |
0fd28d123e | ||
![]() |
47131b01d1 | ||
![]() |
2fa65b05f1 | ||
![]() |
73e67974ec | ||
![]() |
1e037c8fba | ||
![]() |
4f9058da72 | ||
![]() |
ba8ca3b540 | ||
![]() |
022c117576 | ||
![]() |
aa18095ffc | ||
![]() |
06eda48a62 | ||
![]() |
0e5f7c00b6 | ||
![]() |
7ca820ec4d | ||
![]() |
9d34233ff4 | ||
![]() |
ba8b4ece63 | ||
![]() |
cb3d21157b | ||
![]() |
80bd501bbf | ||
![]() |
891fb05fc9 | ||
![]() |
945f87c644 | ||
![]() |
c8e9a9a158 | ||
![]() |
1450c1b4d5 | ||
![]() |
c97e11ad6c | ||
![]() |
61f091aeb8 | ||
![]() |
29e039e787 | ||
![]() |
bbd0300488 | ||
![]() |
07c4288e64 | ||
![]() |
69105c65d8 | ||
![]() |
e5deb93745 | ||
![]() |
4d0200d22c | ||
![]() |
db017f815c | ||
![]() |
c0c6d8bfc4 | ||
![]() |
3f93d1f01d | ||
![]() |
5549286d39 | ||
![]() |
13170fb6e6 | ||
![]() |
5599bbebba | ||
![]() |
fd0bbd7fb8 | ||
![]() |
cf8197c991 | ||
![]() |
42d10a2a24 | ||
![]() |
f39d834bff | ||
![]() |
97987a45e4 | ||
![]() |
3f3b408c17 | ||
![]() |
f30f3ea818 | ||
![]() |
fdce427a5c | ||
![]() |
b4bf5e9891 |
44 changed files with 1848 additions and 377 deletions
4
.gitattributes
vendored
Normal file
4
.gitattributes
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
/.gitignore export-ignore
|
||||
/.travis.yml export-ignore
|
||||
/make-dist export-ignore
|
||||
t/* text eol=lf
|
49
.github/workflows/ci.yml
vendored
Normal file
49
.github/workflows/ci.yml
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
---
|
||||
name: Build
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-latest, ubuntu-18.04]
|
||||
compiler: [gcc, clang]
|
||||
nginx:
|
||||
# Mainline
|
||||
- 1.23.3
|
||||
# Stable.
|
||||
- 1.22.1
|
||||
# First version with loadable module support.
|
||||
- 1.9.15
|
||||
# Oldest supported version.
|
||||
- 0.8.55
|
||||
dynamic: [0, 1]
|
||||
exclude:
|
||||
- nginx: 0.8.55
|
||||
dynamic: 1
|
||||
- nginx: 0.8.55
|
||||
os: macos-latest
|
||||
- compiler: gcc
|
||||
os: macos-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
env:
|
||||
CFLAGS: "-Wno-error"
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Packages
|
||||
run: |
|
||||
case $RUNNER_OS in
|
||||
Linux )
|
||||
sudo apt update
|
||||
sudo apt install -y libpcre3-dev libssl-dev
|
||||
;;
|
||||
* )
|
||||
;;
|
||||
esac
|
||||
t/get-pup || echo 'Tests needing pup will be skipped'
|
||||
- name: Test
|
||||
env:
|
||||
CC: ${{ matrix.compiler }}
|
||||
run: t/build-and-run ${{ matrix.nginx }} ${{ matrix.dynamic }}
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -1 +1,8 @@
|
|||
*.sw[op]
|
||||
/nginx-*
|
||||
/t/*.sh
|
||||
/t/*.out
|
||||
/t/*.err
|
||||
/t/pup*
|
||||
/t/bug*/
|
||||
/prefix/
|
||||
|
|
174
CHANGELOG.md
174
CHANGELOG.md
|
@ -1,37 +1,199 @@
|
|||
# Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## Unreleased
|
||||
## [Unreleased]
|
||||
|
||||
## [0.5.2] - 2021-10-28
|
||||
### Fixed
|
||||
- Properly escape file names to ensure that file names are never renreded
|
||||
as HTML. (Patch by Anthony Ryan <<anthonyryan1@gmail.com>>,
|
||||
[#128](https://github.com/aperezdc/ngx-fancyindex/pull/128).)
|
||||
|
||||
## [0.5.1] - 2020-10-26
|
||||
### Fixed
|
||||
- Properly handle optional second argument to `fancyindex_header` and
|
||||
`fancyindex_footer`
|
||||
([#117](https://github.com/aperezdc/ngx-fancyindex/issues/117)).
|
||||
|
||||
## [0.5.0] - 2020-10-24
|
||||
### Added
|
||||
- New option `fancyindex_show_dotfiles`. (Path by Joshua Shaffer
|
||||
<<joshua.shaffer@icmrl.net>>.)
|
||||
- The `fancyindex_header` and `fancyindex_footer` options now support local
|
||||
files properly, by means of a `local` flag. (Patches by JoungKyun Kim
|
||||
<<joungkyun@gmail.com>> and Adrián Pérez <<aperez@igalia.com>>.)
|
||||
|
||||
### Changed
|
||||
- Improved performance of directory entry sorting, which should be quite
|
||||
noticeable for directories with thousands of files. (Patch by
|
||||
[Yuxiang Zhang](https://github.com/z4yx).)
|
||||
- The minimum Nginx version supported by the module is now 0.8.x.
|
||||
|
||||
### Fixed
|
||||
- Properly escape square brackets in directory entry names when the module
|
||||
is built with older versions of Nginx. (Patch by Adrián Pérez
|
||||
<<aperez@igalia.com>>.)
|
||||
- Fix directory entry listing not being shown when using the
|
||||
[nginx-auth-ldap](https://github.com/kvspb/nginx-auth-ldap) module. (Patch
|
||||
by JoungKyun Kim <<joungkyun@gmail.com>>.)
|
||||
|
||||
## [0.4.4] - 2020-02-19
|
||||
### Added
|
||||
- New option `fancyindex_hide_parent_dir`, which disables generating
|
||||
links to parent directories in listings. (Patch by Kawai Ryota
|
||||
<<admin@mail.kr-kp.com>>.)
|
||||
|
||||
### Changed
|
||||
- Each table row is now separated by a new line (as a matter of fact,
|
||||
a `CRLF` sequence), which makes it easier to parse output using simple
|
||||
text tools. (Patch by Anders Trier <<anders.trier.olesen@gmail.com>>.)
|
||||
- Some corrections and additions to the README file. (Patches by Nicolas
|
||||
Carpi <<nicolas.carpi@curie.fr>> and David Beitey <<david@davidjb.com>>.)
|
||||
|
||||
### Fixed
|
||||
- Use correct character references for `&` characters in table sorter URLs
|
||||
within the template (Patch by David Beitey <<david@davidjb.com>>.)
|
||||
- Properly encode filenames when used as URI components.
|
||||
|
||||
## [0.4.3] - 2018-07-03
|
||||
### Added
|
||||
- Table cells now have class names, which allows for better CSS styling.
|
||||
(Patch by qjqqyy <<gyula@nyirfalvi.hu>>.)
|
||||
- The test suite now can parse and check elements from the HTML returned
|
||||
by the module, thanks to the [pup](https://github.com/EricChiang/pup)
|
||||
tool.
|
||||
|
||||
### Fixed
|
||||
- Sorting by file size now works correctly.
|
||||
(Patch by qjqqyy <<gyula@nyirfalvi.hu>>.)
|
||||
|
||||
## [0.4.2] - 2017-08-19
|
||||
### Changed
|
||||
- Generated HTML from the default template is now proper HTML5, and it should
|
||||
pass validation (#52).
|
||||
- File sizes now have decimal positions when using `fancyindex_exact_size off`.
|
||||
(Patch by Anders Trier <<anders.trier.olesen@gmail.com>>.)
|
||||
- Multiple updates to `README.rst` (Patches by Danila Vershinin
|
||||
<<ciapnz@gmail.com>>, Iulian Onofrei, Lilian Besson, and Nick Geoghegan
|
||||
<<nick@nickgeoghegan.net>>.)
|
||||
|
||||
### Fixed
|
||||
- Sorting by file size now also works correctly for directories which contain
|
||||
files of sizes bigger than `INT_MAX`. (#74, fix suggestion by Chris Young.)
|
||||
- Custom headers which fail to declare an UTF-8 encoding no longer cause table
|
||||
header arrows to be rendered incorrectly by browsers (#50).
|
||||
- Fix segmentation fault when opening directories with empty files (#61, patch
|
||||
by Catgirl <<cat@wolfgirl.org>>.)
|
||||
|
||||
## [0.4.1] - 2016-08-18
|
||||
### Added
|
||||
- New `fancyindex_directories_first` configuration directive (enabled by
|
||||
default), which allows setting whether directories are sorted before other
|
||||
files. (Patch by Luke Zapart <<luke@zapart.org>>.)
|
||||
|
||||
### Fixed
|
||||
- Fix index files not working when the fancyindex module is in use (#46).
|
||||
|
||||
|
||||
## [0.4.0] - 2016-06-08
|
||||
### Added
|
||||
- The module can now be built as a [dynamic
|
||||
module](https://www.nginx.com/resources/wiki/extending/converting/).
|
||||
(Patch by Róbert Nagy <<vrnagy@gmail.com>>.)
|
||||
- New configuration directive `fancyindex_show_path`, which allows hiding the
|
||||
`<h1>` header which contains the current path.
|
||||
(Patch by Thomas P. <<tpxp@live.fr>>.)
|
||||
|
||||
### Changed
|
||||
- Directory and file links in listings now have a title="..." attribute.
|
||||
(Patch by `@janglapuk` <<trusdi.agus@gmail.com>>.)
|
||||
|
||||
### Fixed
|
||||
- Fix for hung requests when the module is used along with `ngx_pagespeed`.
|
||||
(Patch by Otto van der Schaaf <<oschaaf@we-amp.com>>.)
|
||||
|
||||
|
||||
## [0.3.6] - 2016-01-26
|
||||
### Added
|
||||
- New feature: Allow filtering out symbolic links using the
|
||||
`fancyindex_hide_symlinks` configuration directive. (Idea and prototype
|
||||
patch by Thomas Wemm.)
|
||||
- New feature: Allow specifying the format of timestamps using the
|
||||
`fancyindex_time_format` configuration directive. (Idea suggested by Xiao
|
||||
Meng <<novoreorx@gmail.com>>).
|
||||
|
||||
### Changed
|
||||
- Listings in top-level directories will not generate a "Parent Directory"
|
||||
link as first element of the listing. (Patch by Thomas P.)
|
||||
|
||||
### Fixed
|
||||
- Fix propagation and overriding of the `fancyindex_css_href` setting inside
|
||||
nested locations.
|
||||
- Minor changes in the code to allow building cleanly under Windows with
|
||||
Visual Studio 2013. (Patch by Y. Yuan <<yzwduck@gmail.com>>).
|
||||
|
||||
|
||||
## [0.3.5] - 2015-02-19
|
||||
### Added
|
||||
- New feature: Allow setting the default sort criterion using the
|
||||
`fancyindex_default_sort` configuration directive. (Patch by
|
||||
Алексей Урбанский).
|
||||
- New feature: Allos changing the maximum length of file names, using
|
||||
- New feature: Allow changing the maximum length of file names, using
|
||||
the `fancyindex_name_length` configuration directive. (Patch by
|
||||
Martin Herkt).
|
||||
|
||||
### Changed
|
||||
- Renames `NEWS.rst` to `CHANGELOG.md`, which follows the recommendations
|
||||
from [Keep a Change Log](http://keepachangelog.com/).
|
||||
- Configuring Nginx without the `http_addition_module` will generate a
|
||||
warning during configuration, as it is needed for the `fancyindex_footer`
|
||||
and `fancyindex_header` directives.
|
||||
|
||||
|
||||
## [0.3.4] - 2014-09-03
|
||||
|
||||
## 0.3.4 - 2014-09-03
|
||||
### Added
|
||||
- Viewport is now defined in the generated HTML, which works better
|
||||
for mobile devices.
|
||||
|
||||
### Changed
|
||||
- Even-odd row styling moved to the CSS using :nth-child(). This
|
||||
makes the HTML served to clients smaller.
|
||||
|
||||
## 0.3.3 - 2013-10-25
|
||||
|
||||
## [0.3.3] - 2013-10-25
|
||||
|
||||
### Added
|
||||
- New feature: table headers in the default template are now clickable
|
||||
to set the sorting criteria and direction of the index entries.
|
||||
(https://github.com/aperezdc/ngx-fancyindex/issues/7)
|
||||
|
||||
## 0.3.2 - 2013-06-05
|
||||
|
||||
## [0.3.2] - 2013-06-05
|
||||
|
||||
### Fixed
|
||||
- Solved a bug that would leave certain clients stalled forever.
|
||||
- Improved handling of subrequests for non-builtin headers/footers.
|
||||
|
||||
## 0.3.1 - 2011-04-04
|
||||
|
||||
## [0.3.1] - 2011-04-04
|
||||
|
||||
### Added
|
||||
- `NEWS.rst` file, to act as change log.
|
||||
|
||||
|
||||
[Unreleased]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.2...HEAD
|
||||
[0.5.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.1...v0.5.2
|
||||
[0.5.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.0...v0.5.1
|
||||
[0.5.0]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.4...v0.5.0
|
||||
[0.4.4]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.3...v0.4.4
|
||||
[0.4.3]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.2...v0.4.3
|
||||
[0.4.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.1...v0.4.2
|
||||
[0.4.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.0...v0.4.1
|
||||
[0.4.0]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.6...v0.4.0
|
||||
[0.3.6]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.5...v0.3.6
|
||||
[0.3.5]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.4...v0.3.5
|
||||
[0.3.4]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.3...v0.3.4
|
||||
[0.3.3]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.2...v0.3.3
|
||||
[0.3.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.1...v0.3.2
|
||||
[0.3.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3...v0.3.1
|
||||
|
|
|
@ -21,4 +21,10 @@ is known to work flawlessly. Just do:
|
|||
$ awk -f template.awk template.html > template.h
|
||||
|
||||
If your copy of `awk` is not the GNU implementation, you will need to
|
||||
install it and use `gawk` instead in the command line above.
|
||||
install it and use `gawk` instead in the command line above.
|
||||
|
||||
This includes macOS where the current built-in `awk` (currently version
|
||||
20070501 at time of testing on 10.13.6) doesn't apply correctly and causes
|
||||
characters to be omitted from the output. `gawk` can be installed with a
|
||||
package manager such as [Homebrew](https://brew.sh) or
|
||||
[MacPorts](https://ports.macports.org/port/gawk).
|
||||
|
|
210
README.rst
210
README.rst
|
@ -2,8 +2,8 @@
|
|||
Nginx Fancy Index module
|
||||
========================
|
||||
|
||||
.. image:: https://drone.io/github.com/aperezdc/ngx-fancyindex/status.png
|
||||
:target: https://drone.io/github.com/aperezdc/ngx-fancyindex/latest
|
||||
.. image:: https://travis-ci.com/aperezdc/ngx-fancyindex.svg?branch=master
|
||||
:target: https://travis-ci.com/aperezdc/ngx-fancyindex
|
||||
:alt: Build Status
|
||||
|
||||
.. contents::
|
||||
|
@ -11,11 +11,11 @@ Nginx Fancy Index module
|
|||
The Fancy Index module makes possible the generation of file listings, like
|
||||
the built-in `autoindex <http://wiki.nginx.org/NginxHttpAutoindexModule>`__
|
||||
module does, but adding a touch of style. This is possible because the module
|
||||
module allows a certain degree of customization of the generated content:
|
||||
allows a certain degree of customization of the generated content:
|
||||
|
||||
* Custom headers. Either local or stored remotely.
|
||||
* Custom footers. Either local or stored remotely.
|
||||
* Add you own CSS style rules.
|
||||
* Custom headers, either local or stored remotely.
|
||||
* Custom footers, either local or stored remotely.
|
||||
* Add your own CSS style rules.
|
||||
* Allow choosing to sort elements by name (default), modification time, or
|
||||
size; both ascending (default), or descending.
|
||||
|
||||
|
@ -26,10 +26,36 @@ server written by `Igor Sysoev <http://sysoev.ru>`__.
|
|||
Requirements
|
||||
============
|
||||
|
||||
You will need the sources for Nginx_. Any version starting from the 0.7
|
||||
series onwards will work. Note that the modules *might* compile with
|
||||
versions in the 0.6 series by applying ``nginx-0.6-support.patch``, but this
|
||||
is unsupported (YMMV).
|
||||
CentOS, RHEL, Fedora Linux
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
For users of the `official stable <https://www.nginx.com/resources/wiki/start/topics/tutorials/install/>`__ Nginx repository, `extra packages repository with dynamic modules <https://www.getpagespeed.com/redhat>`__ is available and fancyindex is included.
|
||||
|
||||
Install repository configuration, then the module package::
|
||||
|
||||
yum -y install https://extras.getpagespeed.com/release-latest.rpm
|
||||
yum -y install nginx-module-fancyindex
|
||||
|
||||
Then load the module in `/etc/nginx/nginx.conf` using::
|
||||
|
||||
load_module "modules/ngx_http_fancyindex_module.so";
|
||||
|
||||
macOS
|
||||
~~~~~
|
||||
|
||||
Users can `install Nginx on macOS with MacPorts <https://ports.macports.org/port/nginx>`__; fancyindex is included::
|
||||
|
||||
sudo port install nginx
|
||||
|
||||
Other platforms
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
In most other cases you will need the sources for Nginx_. Any version starting
|
||||
from the 0.8 series should work.
|
||||
|
||||
In order to use the ``fancyindex_header_`` and ``fancyindex_footer_`` directives
|
||||
you will also need the `ngx_http_addition_module <https://nginx.org/en/docs/http/ngx_http_addition_module.html>`_
|
||||
built into Nginx.
|
||||
|
||||
|
||||
Building
|
||||
|
@ -49,7 +75,14 @@ Building
|
|||
of the fancy indexing module::
|
||||
|
||||
$ cd nginx-?.?.?
|
||||
$ ./configure --add-module=../nginx-fancyindex-?.?.? [extra desired options]
|
||||
$ ./configure --add-module=../nginx-fancyindex-?.?.? \
|
||||
[--with-http_addition_module] [extra desired options]
|
||||
|
||||
Since version 0.4.0, the module can also be built as a
|
||||
`dynamic module <https://www.nginx.com/resources/wiki/extending/converting/>`_,
|
||||
using ``--add-dynamic-module=…`` instead and
|
||||
``load_module "modules/ngx_http_fancyindex_module.so";``
|
||||
in the configuration file
|
||||
|
||||
4. Build and install the software::
|
||||
|
||||
|
@ -74,13 +107,24 @@ a ``server`` section in your Nginx_ configuration file::
|
|||
}
|
||||
|
||||
|
||||
Advanced Theming
|
||||
~~~~~~~~~~~~~~~~
|
||||
Themes
|
||||
~~~~~~
|
||||
|
||||
For a more elaborate example using `fancyindex_header`_ and
|
||||
`fancyindex_footer`_ you can check `nice theme
|
||||
<https://github.com/TheInsomniac/Nginx-Fancyindex-Theme>`__
|
||||
designed by `@TheInsomniac <https://github.com/TheInsomniac>`__.
|
||||
The following themes demonstrate the level of customization which can be
|
||||
achieved using the module:
|
||||
|
||||
* `Theme <https://github.com/TheInsomniac/Nginx-Fancyindex-Theme>`__ by
|
||||
`@TheInsomniac <https://github.com/TheInsomniac>`__. Uses custom header and
|
||||
footer.
|
||||
* `Theme <https://github.com/Naereen/Nginx-Fancyindex-Theme>`__ by
|
||||
`@Naereen <https://github.com/Naereen/>`__. Uses custom header and footer. The
|
||||
header includes a search field to filter by file name using JavaScript.
|
||||
* `Theme <https://github.com/fraoustin/Nginx-Fancyindex-Theme>`__ by
|
||||
`@fraoustin <https://github.com/fraoustin>`__. Responsive theme using
|
||||
Material Design elements.
|
||||
* `Theme <https://github.com/alehaa/nginx-fancyindex-flat-theme>`__ by
|
||||
`@alehaa <https://github.com/alehaa>`__. Simple, flat theme based on
|
||||
Bootstrap 4 and FontAwesome.
|
||||
|
||||
|
||||
Directives
|
||||
|
@ -102,6 +146,24 @@ fancyindex_default_sort
|
|||
:Description:
|
||||
Defines sorting criterion by default.
|
||||
|
||||
fancyindex_case_sensitive
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_case_sensitive* [*on* | *off*]
|
||||
:Default: fancyindex_case_sensitive on
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
If enabled (default setting), sorting by name will be case-sensitive.
|
||||
If disabled, case will be ignored when sorting by name.
|
||||
|
||||
fancyindex_directories_first
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_directories_first* [*on* | *off*]
|
||||
:Default: fancyindex_directories_first on
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
If enabled (default setting), groups directories together and sorts them
|
||||
before all regular files. If disabled, directories are sorted together with files.
|
||||
|
||||
fancyindex_css_href
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_css_href uri*
|
||||
|
@ -119,29 +181,26 @@ fancyindex_exact_size
|
|||
:Default: fancyindex_exact_size on
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Defines how to represent file sizes in the directory listing; either
|
||||
Defines how to represent file sizes in the directory listing: either
|
||||
accurately, or rounding off to the kilobyte, the megabyte and the
|
||||
gigabyte.
|
||||
|
||||
fancyindex_name_length
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_name_length length*
|
||||
:Default: fancyindex_name_length 50
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Defines the maximum file name length limit in bytes.
|
||||
|
||||
fancyindex_footer
|
||||
~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_footer path*
|
||||
:Syntax: *fancyindex_footer path* [*subrequest* | *local*]
|
||||
:Default: fancyindex_footer ""
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Specifies which file should be inserted at the foot of directory listings.
|
||||
If set to an empty string, the default footer supplied by the module will
|
||||
be sent.
|
||||
be sent. The optional parameter indicates whether the *path* is to be
|
||||
treated as a URI to load using a *subrequest* (the default), or whether
|
||||
it refers to a *local* file.
|
||||
|
||||
.. warning:: When inserting custom header/footer a subrequest will be
|
||||
.. note:: Using this directive needs the ngx_http_addition_module_ built
|
||||
into Nginx.
|
||||
|
||||
.. warning:: When inserting custom a header/footer, a subrequest will be
|
||||
issued so potentially any URL can be used as source for them. Although it
|
||||
will work with external URLs, only using internal ones is supported.
|
||||
External URLs are totally untested and using them will make Nginx_ block
|
||||
|
@ -151,13 +210,40 @@ fancyindex_footer
|
|||
|
||||
fancyindex_header
|
||||
~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_header path*
|
||||
:Syntax: *fancyindex_header path* [*subrequest* | *local*]
|
||||
:Default: fancyindex_header ""
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Specifies which file should be inserted at the head of directory listings.
|
||||
If set to an empty string, the default header supplied by the module will
|
||||
be sent.
|
||||
be sent. The optional parameter indicates whether the *path* is to be
|
||||
treated as a URI to load using a *subrequest* (the default), or whether
|
||||
it refers to a *local* file.
|
||||
|
||||
.. note:: Using this directive needs the ngx_http_addition_module_ built
|
||||
into Nginx.
|
||||
|
||||
fancyindex_show_path
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_show_path* [*on* | *off*]
|
||||
:Default: fancyindex_show_path on
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Whether or not to output the path and the closing </h1> tag after the header.
|
||||
This is useful when you want to handle the path displaying with a PHP script
|
||||
for example.
|
||||
|
||||
.. warning:: This directive can be turned off only if a custom header is provided
|
||||
using fancyindex_header.
|
||||
|
||||
fancyindex_show_dotfiles
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_show_dotfiles* [*on* | *off*]
|
||||
:Default: fancyindex_show_dotfiles off
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Whether to list files that are preceded with a dot. Normal convention is to
|
||||
hide these.
|
||||
|
||||
fancyindex_ignore
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
@ -165,10 +251,26 @@ fancyindex_ignore
|
|||
:Default: No default.
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Specifies a list of file names which will be not be shown in generated
|
||||
listings. If Nginx was built with PCRE support strings are interpreted as
|
||||
Specifies a list of file names which will not be shown in generated
|
||||
listings. If Nginx was built with PCRE support, strings are interpreted as
|
||||
regular expressions.
|
||||
|
||||
fancyindex_hide_symlinks
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_hide_symlinks* [*on* | *off*]
|
||||
:Default: fancyindex_hide_symlinks off
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
When enabled, generated listings will not contain symbolic links.
|
||||
|
||||
fancyindex_hide_parent_dir
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_hide_parent_dir* [*on* | *off*]
|
||||
:Default: fancyindex_hide_parent_dir off
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
When enabled, it will not show the parent directory.
|
||||
|
||||
fancyindex_localtime
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_localtime* [*on* | *off*]
|
||||
|
@ -177,6 +279,46 @@ fancyindex_localtime
|
|||
:Description:
|
||||
Enables showing file times as local time. Default is “off” (GMT time).
|
||||
|
||||
.. _nginx: http://nginx.net
|
||||
fancyindex_time_format
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
:Syntax: *fancyindex_time_format* string
|
||||
:Default: fancyindex_time_format "%Y-%b-%d %H:%M"
|
||||
:Context: http, server, location
|
||||
:Description:
|
||||
Format string used for timestamps. The format specifiers are a subset of
|
||||
those supported by the `strftime <https://linux.die.net/man/3/strftime>`_
|
||||
function, and the behavior is locale-independent (for example, day and month
|
||||
names are always in English). The supported formats are:
|
||||
|
||||
* ``%a``: Abbreviated name of the day of the week.
|
||||
* ``%A``: Full name of the day of the week.
|
||||
* ``%b``: Abbreviated month name.
|
||||
* ``%B``: Full month name.
|
||||
* ``%d``: Day of the month as a decimal number (range 01 to 31).
|
||||
* ``%e``: Like ``%d``, the day of the month as a decimal number, but a
|
||||
leading zero is replaced by a space.
|
||||
* ``%F``: Equivalent to ``%Y-%m-%d`` (the ISO 8601 date format).
|
||||
* ``%H``: Hour as a decimal number using a 24-hour clock (range 00
|
||||
to 23).
|
||||
* ``%I``: Hour as a decimal number using a 12-hour clock (range 01 to 12).
|
||||
* ``%k``: Hour (24-hour clock) as a decimal number (range 0 to 23);
|
||||
single digits are preceded by a blank.
|
||||
* ``%l``: Hour (12-hour clock) as a decimal number (range 1 to 12); single
|
||||
digits are preceded by a blank.
|
||||
* ``%m``: Month as a decimal number (range 01 to 12).
|
||||
* ``%M``: Minute as a decimal number (range 00 to 59).
|
||||
* ``%p``: Either "AM" or "PM" according to the given time value.
|
||||
* ``%P``: Like ``%p`` but in lowercase: "am" or "pm".
|
||||
* ``%r``: Time in a.m. or p.m. notation. Equivalent to ``%I:%M:%S %p``.
|
||||
* ``%R``: Time in 24-hour notation (``%H:%M``).
|
||||
* ``%S``: Second as a decimal number (range 00 to 60).
|
||||
* ``%T``: Time in 24-hour notation (``%H:%M:%S``).
|
||||
* ``%u``: Day of the week as a decimal, range 1 to 7, Monday being 1.
|
||||
* ``%w``: Day of the week as a decimal, range 0 to 6, Monday being 0.
|
||||
* ``%y``: Year as a decimal number without a century (range 00 to 99).
|
||||
* ``%Y``: Year as a decimal number including the century.
|
||||
|
||||
|
||||
.. _nginx: https://nginx.org
|
||||
|
||||
.. vim:ft=rst:spell:spelllang=en:
|
||||
|
|
20
config
20
config
|
@ -1,8 +1,20 @@
|
|||
# vim:ft=sh:
|
||||
ngx_addon_name=ngx_http_fancyindex_module
|
||||
|
||||
# XXX: Insert fancyindex module *after* index module!
|
||||
#
|
||||
HTTP_MODULES=`echo "${HTTP_MODULES}" | sed -e \
|
||||
if [ "$ngx_module_link" = DYNAMIC ] ; then
|
||||
ngx_module_type=HTTP
|
||||
ngx_module_name=ngx_http_fancyindex_module
|
||||
ngx_module_srcs="$ngx_addon_dir/ngx_http_fancyindex_module.c"
|
||||
ngx_module_deps="$ngx_addon_dir/template.h"
|
||||
ngx_module_order="$ngx_module_name ngx_http_autoindex_module"
|
||||
. auto/module
|
||||
else
|
||||
# XXX: Insert fancyindex module *after* index module!
|
||||
#
|
||||
HTTP_MODULES=`echo "${HTTP_MODULES}" | sed -e \
|
||||
's/ngx_http_index_module/ngx_http_fancyindex_module ngx_http_index_module/'`
|
||||
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fancyindex_module.c"
|
||||
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fancyindex_module.c"
|
||||
if [ $HTTP_ADDITION != YES ] ; then
|
||||
echo " - The 'addition' filter is needed for fancyindex_{header,footer}, but it was disabled"
|
||||
fi
|
||||
fi
|
||||
|
|
10
make-dist
Executable file
10
make-dist
Executable file
|
@ -0,0 +1,10 @@
|
|||
#! /bin/sh
|
||||
set -e
|
||||
|
||||
GIT_TAG=$(git describe --tags HEAD)
|
||||
VERSION=${GIT_TAG#v}
|
||||
PV="ngx-fancyindex-${VERSION}"
|
||||
|
||||
set -x
|
||||
git archive --worktree-attributes --prefix="${PV}/" -o "${PV}.tar" "${GIT_TAG}"
|
||||
xz -f9 "${PV}.tar"
|
|
@ -1,23 +0,0 @@
|
|||
=== modified file 'ngx_http_fancyindex_module.c'
|
||||
--- ngx_http_fancyindex_module.c 2008-09-11 17:55:52 +0000
|
||||
+++ ngx_http_fancyindex_module.c 2008-12-10 01:33:43 +0000
|
||||
@@ -383,7 +383,7 @@
|
||||
entry->mtime = ngx_de_mtime(&dir);
|
||||
entry->size = ngx_de_size(&dir);
|
||||
entry->utf_len = (r->utf8)
|
||||
- ? ngx_utf8_length(entry->name.data, entry->name.len)
|
||||
+ ? ngx_utf_length(entry->name.data, entry->name.len)
|
||||
: len;
|
||||
}
|
||||
|
||||
@@ -478,8 +478,7 @@
|
||||
copy = NGX_HTTP_FANCYINDEX_NAME_LEN + 1;
|
||||
}
|
||||
|
||||
- b->last = ngx_utf8_cpystrn(b->last, entry[i].name.data,
|
||||
- copy, entry[i].name.len);
|
||||
+ b->last = ngx_utf_cpystrn(b->last, entry[i].name.data, copy);
|
||||
last = b->last;
|
||||
|
||||
} else {
|
||||
|
File diff suppressed because it is too large
Load diff
22
t/00-build-artifacts.test
Normal file
22
t/00-build-artifacts.test
Normal file
|
@ -0,0 +1,22 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that the built Nginx either has the dynamic fancyindex
|
||||
module available, or that it's not there (for static builds).
|
||||
--
|
||||
|
||||
readonly nginx_path="${PREFIX}/sbin/nginx"
|
||||
readonly so_path="${PREFIX}/modules/ngx_http_fancyindex_module.so"
|
||||
|
||||
if [[ ! -x ${nginx_path} ]] ; then
|
||||
fail "executable binary not found at '%s'\n" "${nginx_path}"
|
||||
fi
|
||||
|
||||
if ${DYNAMIC} ; then
|
||||
if [[ ! -r ${so_path} ]] ; then
|
||||
fail "module not found at '%s'\n" "${so_path}"
|
||||
fi
|
||||
else
|
||||
if [[ -r ${so_path} ]] ; then
|
||||
fail "module should not exist at '%s'\n" "${so_path}"
|
||||
fi
|
||||
fi
|
7
t/01-smoke-hasindex.test
Normal file
7
t/01-smoke-hasindex.test
Normal file
|
@ -0,0 +1,7 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test fetches the root directory served by Nginx, which has no index file,
|
||||
and checks that the output contains something that resembles a directory index.
|
||||
--
|
||||
nginx_start
|
||||
grep 'Index of' <( fetch )
|
11
t/02-smoke-indexisfancy.test
Normal file
11
t/02-smoke-indexisfancy.test
Normal file
|
@ -0,0 +1,11 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test fetches the root directory served by Nginx, which has no index file,
|
||||
and checks that the output contains something that resembles the output from
|
||||
the fancyindex module.
|
||||
--
|
||||
nginx_start
|
||||
content=$(fetch --with-headers)
|
||||
grep 'Index of /' <<< "${content}" # It is an index
|
||||
grep '<table\>' <<< "${content}" # It contains a table
|
||||
grep '^ Content-Type:[[:space:]]*text/html' <<< "${content}"
|
9
t/03-exact_size_off.test
Normal file
9
t/03-exact_size_off.test
Normal file
|
@ -0,0 +1,9 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks if the output from using "fancyindex_exact_size off"
|
||||
looks sane.
|
||||
--
|
||||
nginx_start 'fancyindex_exact_size off;'
|
||||
content=$(fetch)
|
||||
grep -e '[1-9]\.[0-9] KiB' <<< "${content}"
|
||||
grep -E '[0-9]+ B' <<< "${content}"
|
24
t/04-hasindex-html.test
Normal file
24
t/04-hasindex-html.test
Normal file
|
@ -0,0 +1,24 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test fetches the root directory served by Nginx, which has no index
|
||||
file, and checks that the output contains a few HTML elements known to
|
||||
exist in a directory index.
|
||||
--
|
||||
use pup
|
||||
nginx_start
|
||||
|
||||
content=$( fetch )
|
||||
|
||||
# Check page title
|
||||
[[ $(pup -p title text{} <<< "${content}") = 'Index of /' ]]
|
||||
|
||||
# Check table headers
|
||||
[[ $(pup -n body table thead th a:first-child <<< "${content}") -eq 3 ]]
|
||||
{
|
||||
read -r name_label
|
||||
read -r size_label
|
||||
read -r date_label
|
||||
} < <( pup -p body table thead th a:first-child text{} <<< "${content}" )
|
||||
[[ ${name_label} = File\ Name ]]
|
||||
[[ ${size_label} = File\ Size ]]
|
||||
[[ ${date_label} = Date ]]
|
36
t/05-sort-by-size.test
Normal file
36
t/05-sort-by-size.test
Normal file
|
@ -0,0 +1,36 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test validates that the sorting by file size works.
|
||||
--
|
||||
use pup
|
||||
nginx_start
|
||||
|
||||
# Ascending sort.
|
||||
previous=''
|
||||
while read -r size ; do
|
||||
if [[ ${size} = - ]] ; then
|
||||
continue
|
||||
fi
|
||||
if [[ -z ${previous} ]] ; then
|
||||
previous=${size}
|
||||
continue
|
||||
fi
|
||||
[[ ${previous} -le ${size} ]] || fail \
|
||||
'Size %d should be smaller than %d\n' "${previous}" "${size}"
|
||||
done < <( fetch '/?C=S&O=A' \
|
||||
| pup -p body table tbody 'td:nth-child(2)' text{} )
|
||||
|
||||
# Descending sort.
|
||||
previous=''
|
||||
while read -r size ; do
|
||||
if [[ ${size} = - ]] ; then
|
||||
continue
|
||||
fi
|
||||
if [[ -z ${previous} ]] ; then
|
||||
previous=${size}
|
||||
continue
|
||||
fi
|
||||
[[ ${previous} -ge ${size} ]] || fail \
|
||||
'Size %d should be greater than %d\n' "${previous}" "${size}"
|
||||
done < <( fetch '/?C=S&O=D' \
|
||||
| pup -p body table tbody 'td:nth-child(2)' text{} )
|
23
t/06-hide_parent.test
Normal file
23
t/06-hide_parent.test
Normal file
|
@ -0,0 +1,23 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks the output using "fancyindex_hide_parent_dir on".
|
||||
--
|
||||
use pup
|
||||
nginx_start 'fancyindex_hide_parent_dir on;'
|
||||
|
||||
content=$( fetch /child-directory/ )
|
||||
|
||||
# Check page title
|
||||
[[ $(pup -p title text{} <<< "${content}") = "Index of /child-directory/" ]]
|
||||
|
||||
# Check table headers
|
||||
[[ $(pup -n body table tbody tr:first-child td <<< "${content}") -eq 3 ]]
|
||||
{
|
||||
read -r name_label
|
||||
read -r size_label
|
||||
read -r date_label
|
||||
} < <( pup -p body table tbody tr:first-child td text{} <<< "${content}" )
|
||||
[[ ${name_label} != Parent\ Directory/ ]]
|
||||
[[ ${name_label} = empty-file.txt ]]
|
||||
[[ ${size_label} != - ]]
|
||||
[[ ${date_label} != - ]]
|
50
t/07-directory-first.test
Normal file
50
t/07-directory-first.test
Normal file
|
@ -0,0 +1,50 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks the output using "fancyindex_directories_first on".
|
||||
--
|
||||
use pup
|
||||
|
||||
for d in "008d" "000d" "004d" ; do
|
||||
mkdir -p "${TESTDIR}/dir_first/${d}"
|
||||
done
|
||||
for f in "005f" "001f" "003f"; do
|
||||
touch "${TESTDIR}/dir_first/${f}"
|
||||
done
|
||||
for d in "006d" "002d" ; do
|
||||
mkdir -p "${TESTDIR}/dir_first/${d}"
|
||||
done
|
||||
|
||||
nginx_start 'fancyindex_directories_first on;'
|
||||
previous=''
|
||||
cur_type=''
|
||||
while read -r name ; do
|
||||
case "$name" in
|
||||
*Parent*)
|
||||
;;
|
||||
*d*)
|
||||
echo "dir $name"
|
||||
[[ "$cur_type" = f ]] && fail 'Directories should come before files'
|
||||
cur_type=d
|
||||
if [[ -z ${previous} ]] ; then
|
||||
previous=${name}
|
||||
else
|
||||
[[ ${previous} < ${name} ]] || fail \
|
||||
'Name %s should come before %s\n' "${previous}" "${name}"
|
||||
fi
|
||||
;;
|
||||
*f*)
|
||||
echo "file $name"
|
||||
[[ -z "$cur_type" ]] && fail 'Directories should come before files'
|
||||
if [[ "$cur_type" = d ]] ; then
|
||||
cur_type=f
|
||||
previous=${name}
|
||||
else
|
||||
[[ ${previous} < ${name} ]] || fail \
|
||||
'Name %s should come before %s\n' "${previous}" "${name}"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done < <( fetch '/dir_first/' \
|
||||
| pup -p body table tbody 'td:nth-child(1)' text{} )
|
||||
|
||||
nginx_is_running || fail "Nginx died"
|
21
t/07-show_dotfiles.test
Normal file
21
t/07-show_dotfiles.test
Normal file
|
@ -0,0 +1,21 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks the option to show dotfiles.
|
||||
--
|
||||
# Turn it on.
|
||||
nginx_start 'fancyindex_show_dotfiles on;'
|
||||
on_content=$(fetch /show_dotfiles/)
|
||||
nginx_stop
|
||||
if [ $(grep '.okay' <<< "${on_content}") -ne 0 ] ; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Turn it off.
|
||||
nginx_start
|
||||
off_content=$(fetch /show_dotfiles/)
|
||||
nginx_stop
|
||||
if [ $(grep '.okay' <<< "${on_content}") -eq 0] ; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
17
t/08-local-footer.test
Normal file
17
t/08-local-footer.test
Normal file
|
@ -0,0 +1,17 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that a local footer can be included with
|
||||
"fancyindex_header ... local".
|
||||
--
|
||||
use pup
|
||||
|
||||
cat > "${TESTDIR}/footer" <<EOF
|
||||
<div id="customfooter">yes</div>
|
||||
EOF
|
||||
|
||||
nginx_start "fancyindex_footer \"${TESTDIR}/footer\" local;"
|
||||
|
||||
T=$(fetch / | pup -p body 'div#customfooter' text{})
|
||||
[[ $T == yes ]] || fail 'Custom header missing'
|
||||
|
||||
nginx_is_running || fail 'Nginx died'
|
17
t/09-local-header.test
Normal file
17
t/09-local-header.test
Normal file
|
@ -0,0 +1,17 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that a local header can be included with
|
||||
"fancyindex_header ... local".
|
||||
--
|
||||
use pup
|
||||
|
||||
cat > "${TESTDIR}/header" <<EOF
|
||||
<div id="customheader">yes</div>
|
||||
EOF
|
||||
|
||||
nginx_start "fancyindex_header \"${TESTDIR}/header\" local;"
|
||||
|
||||
T=$(fetch / | pup -p body 'div#customheader' text{})
|
||||
[[ $T == yes ]] || fail 'Custom header missing'
|
||||
|
||||
nginx_is_running || fail 'Nginx died'
|
26
t/10-local-headerfooter.test
Normal file
26
t/10-local-headerfooter.test
Normal file
|
@ -0,0 +1,26 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that both a local header and footer can be included with
|
||||
"fancyindex_{header,footer} ... local".
|
||||
--
|
||||
use pup
|
||||
|
||||
cat > "${TESTDIR}/header" <<EOF
|
||||
<div id="customheader">yes</div>
|
||||
EOF
|
||||
cat > "${TESTDIR}/footer" <<EOF
|
||||
<div id="customfooter">yes</div>
|
||||
EOF
|
||||
|
||||
nginx_start "fancyindex_header \"${TESTDIR}/header\" local;
|
||||
fancyindex_footer \"${TESTDIR}/footer\" local;"
|
||||
|
||||
P=$(fetch /)
|
||||
|
||||
H=$(pup -p body 'div#customheader' text{} <<< "$P")
|
||||
[[ $H == yes ]] || fail 'Custom header missing'
|
||||
|
||||
F=$(pup -p body 'div#customfooter' text{} <<< "$P")
|
||||
[[ $F == yes ]] || fail 'Custom footer missing'
|
||||
|
||||
nginx_is_running || fail 'Nginx died'
|
31
t/11-local-footer-nested.test
Normal file
31
t/11-local-footer-nested.test
Normal file
|
@ -0,0 +1,31 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that local footers are correctly included in the presence of
|
||||
directives in nested locations:
|
||||
|
||||
fancyindex_footer <one> local;
|
||||
location /sub {
|
||||
fancyindex_footer <another> local;
|
||||
}
|
||||
|
||||
--
|
||||
use pup
|
||||
|
||||
echo '<div id="topfooter">yes</div>' > "${TESTDIR}/top-footer"
|
||||
echo '<div id="subfooter">yes</div>' > "${TESTDIR}/sub-footer"
|
||||
|
||||
nginx_start "fancyindex_footer \"${TESTDIR}/top-footer\" local;
|
||||
location /child-directory {
|
||||
fancyindex_footer \"${TESTDIR}/sub-footer\" local;
|
||||
}"
|
||||
|
||||
T=$(fetch /)
|
||||
echo "$T" > "$TESTDIR/top.html"
|
||||
[[ $(pup -p body 'div#topfooter' text{} <<< "$T") = yes ]] || fail 'Custom header missing at /'
|
||||
[[ -z $(pup -p body 'div#subfooter' text{} <<< "$T") ]] || fail 'Wrong header at /'
|
||||
|
||||
T=$(fetch /child-directory/)
|
||||
[[ $(pup -p body 'div#subfooter' text{} <<< "$T") = yes ]] || fail 'Custom header missing at /sub/'
|
||||
[[ -z $(pup -p body 'div#topfooter' text{} <<< "$T") ]] || fail 'Wrong header at /sub/'
|
||||
|
||||
nginx_is_running || fail 'Nginx died'
|
11
t/12-local-footer-nested.test
Normal file
11
t/12-local-footer-nested.test
Normal file
|
@ -0,0 +1,11 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that the configuration file is properly parsed if there
|
||||
is only one parameter passed to the fancyindex_header and fancyindex_footer
|
||||
configuration directives.
|
||||
--
|
||||
|
||||
nginx_start 'fancyindex_header "/header";
|
||||
fancyindex_footer "/footer";'
|
||||
|
||||
nginx_is_running || fail 'Nginx died'
|
9
t/bug107-filesystem-root-404.test
Normal file
9
t/bug107-filesystem-root-404.test
Normal file
|
@ -0,0 +1,9 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
Bug #107: 404 is returned when indexing filesystem root
|
||||
https://github.com/aperezdc/ngx-fancyindex/issues/107
|
||||
--
|
||||
nginx_start 'root /;'
|
||||
content=$(fetch)
|
||||
grep 'Index of /' <<< "${content}" # It is an index
|
||||
grep '<table\>' <<< "${content}" # It contains a table
|
27
t/bug157-saturday-in-long-weekdays.test
Normal file
27
t/bug157-saturday-in-long-weekdays.test
Normal file
|
@ -0,0 +1,27 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
Check whether the Saturday long day name is available.
|
||||
https://github.com/aperezdc/ngx-fancyindex/issues/157
|
||||
--
|
||||
use pup
|
||||
nginx_start 'fancyindex_time_format "%A"; fancyindex_default_sort date;'
|
||||
|
||||
mkdir -p "${TESTDIR}/weekdays"
|
||||
for (( i=2 ; i <= 8 ; i++ )) ; do
|
||||
TZ=UTC touch -d "2023-01-0${i}T06:00:00" "${TESTDIR}/weekdays/day$i.txt"
|
||||
done
|
||||
ls "${TESTDIR}/weekdays"
|
||||
content=$(fetch /weekdays/)
|
||||
|
||||
# We need row+1 because the first one is the table header.
|
||||
dayname=$(pup -p body table tbody \
|
||||
'tr:nth-child(7)' 'td:nth-child(3)' 'text{}' \
|
||||
<<< "$content")
|
||||
[[ $dayname = Saturday ]] || fail 'Sixth day is not Saturday'
|
||||
|
||||
dayname=$(pup -p body table tbody \
|
||||
'tr:nth-child(8)' 'td:nth-child(3)' 'text{}' \
|
||||
<<< "$content")
|
||||
[[ $dayname = Sunday ]] || fail 'Seventh day is not Sunday'
|
||||
|
||||
nginx_is_running || fail 'Nginx died'
|
16
t/bug61-empty-file-segfault.test
Normal file
16
t/bug61-empty-file-segfault.test
Normal file
|
@ -0,0 +1,16 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
Bug #61: Listing a directory with an empty file crashes Nginx
|
||||
https://github.com/aperezdc/ngx-fancyindex/issues/61
|
||||
--
|
||||
|
||||
# Prepare an empty directory with an empty file
|
||||
mkdir -p "${TESTDIR}/bug61"
|
||||
touch "${TESTDIR}/bug61/bug61.txt"
|
||||
|
||||
nginx_start 'fancyindex_exact_size off;'
|
||||
content=$(fetch /bug61/)
|
||||
test -n "${content}" || fail "Empty response"
|
||||
echo "Response:"
|
||||
echo "${content}"
|
||||
nginx_is_running || fail "Nginx died"
|
8
t/bug78-case-insensitive.test
Normal file
8
t/bug78-case-insensitive.test
Normal file
|
@ -0,0 +1,8 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that case-insensitive sorting works.
|
||||
--
|
||||
|
||||
nginx_start 'fancyindex_case_sensitive off;'
|
||||
content=$(fetch /case-sensitivity/)
|
||||
grep -A 999 '\<alice\>' <<< "${content}" | grep '\<Bob\>' # Bob is after alice
|
8
t/bug78-case-sensitive.test
Normal file
8
t/bug78-case-sensitive.test
Normal file
|
@ -0,0 +1,8 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test checks that case-sensitive sorting works.
|
||||
--
|
||||
|
||||
nginx_start 'fancyindex_case_sensitive on;'
|
||||
content=$(fetch /case-sensitivity/)
|
||||
grep -A 999 '\<Bob\>' <<< "${content}" | grep '\<alice\>' # alice is after Bob
|
19
t/bug95-square-brackets.test
Normal file
19
t/bug95-square-brackets.test
Normal file
|
@ -0,0 +1,19 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
Bug #95: FancyIndex does not encode square brackets
|
||||
https://github.com/aperezdc/ngx-fancyindex/issues/95
|
||||
--
|
||||
use pup
|
||||
|
||||
# Prepare a directory with a file that contains square brackets in the name.
|
||||
mkdir -p "${TESTDIR}/bug95"
|
||||
touch "${TESTDIR}"/bug95/'bug[95].txt'
|
||||
|
||||
nginx_start
|
||||
content=$(fetch /bug95/)
|
||||
test -n "${content}" || fail 'Empty response'
|
||||
|
||||
expected_href='bug%5B95%5D.txt'
|
||||
obtained_href=$(pup -p body tbody 'tr:nth-child(2)' a 'attr{href}' <<< "${content}")
|
||||
test "${expected_href}" = "${obtained_href}" || \
|
||||
fail 'Expected: %s - Obtained: %s' "${expected_href}" "${obtained_href}"
|
36
t/build-and-run
Executable file
36
t/build-and-run
Executable file
|
@ -0,0 +1,36 @@
|
|||
#! /bin/bash
|
||||
set -e
|
||||
|
||||
if [[ $# -lt 1 || $# -gt 2 ]] ; then
|
||||
echo "Usage: $0 <nginx-version> [1]" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
readonly NGINX=$1
|
||||
|
||||
if [[ $2 -eq 1 ]] ; then
|
||||
readonly DYNAMIC=$2
|
||||
fi
|
||||
|
||||
case $(uname -s) in
|
||||
Darwin)
|
||||
JOBS=$(sysctl -n hw.activecpu)
|
||||
;;
|
||||
*)
|
||||
JOBS=1
|
||||
;;
|
||||
esac
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
wget -O - http://nginx.org/download/nginx-${NGINX}.tar.gz | tar -xzf -
|
||||
rm -rf prefix/
|
||||
cd nginx-${NGINX}
|
||||
./configure \
|
||||
--add-${DYNAMIC:+dynamic-}module=.. \
|
||||
--with-http_addition_module \
|
||||
--without-http_rewrite_module \
|
||||
--prefix="$(pwd)/../prefix"
|
||||
make -j"$JOBS"
|
||||
make install
|
||||
cd ..
|
||||
exec ./t/run prefix ${DYNAMIC}
|
0
t/case-sensitivity/Bob
Normal file
0
t/case-sensitivity/Bob
Normal file
0
t/case-sensitivity/alice
Normal file
0
t/case-sensitivity/alice
Normal file
0
t/child-directory/empty-file.txt
Normal file
0
t/child-directory/empty-file.txt
Normal file
105
t/get-pup
Executable file
105
t/get-pup
Executable file
|
@ -0,0 +1,105 @@
|
|||
#! /bin/bash
|
||||
set -e
|
||||
|
||||
declare -r SHASUMS='\
|
||||
ec9522193516ad49c78d40a8163f1d92e98866892a11aadb7be584a975026a8a pup_69c02e189c2aaed331061ee436c39e72b830ef32_darwin_amd64.xz
|
||||
75c27caa0008a9cc639beb7506077ad9f32facbffcc4e815e999eaf9588a527e pup_v0.4.0_darwin_386.zip
|
||||
c539a697efee2f8e56614a54cb3b215338e00de1f6a7c2fa93144ab6e1db8ebe pup_v0.4.0_darwin_amd64.zip
|
||||
259eee82c7d7d766f1b8f93a382be21dcfefebc855a9ce8124fd78717f9df439 pup_v0.4.0_dragonfly_amd64.zip
|
||||
ba0fe5e87a24cab818e5d2efdd7540714ddfb1b7246600135915c666fdf1a601 pup_v0.4.0_freebsd_386.zip
|
||||
1838ef84ec1f961e8009d19a4d1e6a23b926ee315da3d60c08878f3d69af5692 pup_v0.4.0_freebsd_amd64.zip
|
||||
6886a9c60a912a810d012610bc3f784f0417999ff7d7df833a0695b9af60395b pup_v0.4.0_freebsd_arm.zip
|
||||
e486b32ca07552cd3aa713cbf2f9d1b6e210ddb51d34b3090c7643f465828057 pup_v0.4.0_linux_386.zip
|
||||
ec3d29e9fb375b87ac492c8b546ad6be84b0c0b49dab7ff4c6b582eac71ba01c pup_v0.4.0_linux_amd64.zip
|
||||
c09b669fa8240f4f869dee7d34ee3c7ea620a0280cee1ea7d559593bcdd062c9 pup_v0.4.0_linux_arm64.zip
|
||||
ebf70b3c76c02e0202c94af7ef06dcb3ecc866d1b9b84453d43fe01fa5dd5870 pup_v0.4.0_linux_arm.zip
|
||||
a98a4d1f3c3a103e8ebe1a7aba9cb9d3cb045003208ca6f5f3d54889a225f267 pup_v0.4.0_linux_mips64le.zip
|
||||
8e471cf6cfa118b2497bb3f42a7a48c52d0096107f748f37216855c8ab94f8e5 pup_v0.4.0_linux_mips64.zip
|
||||
cfda9375eba65f710e052b1b59893c228c3fc92b0510756bb3f02c25938eee30 pup_v0.4.0_linux_ppc64le.zip
|
||||
91a1e07ffb2c373d6053252e4de732f5db78c8eace49c6e1a0ef52402ecdf56c pup_v0.4.0_linux_ppc64.zip
|
||||
fdc9b28a3daac5ad096023e1647292a7eccea6d9b1686f871307dae9f3bd064f pup_v0.4.0_nacl_386.zip
|
||||
c8d3c9b56783bd5a55446f4580e1835606b2b945da2d1417ed509c5927a5f8bc pup_v0.4.0_nacl_amd64p32.zip
|
||||
48c068c4353672528c8c3447a536208b0719f1e6d0f8fab8416b38b63ad0c1d9 pup_v0.4.0_nacl_arm.zip
|
||||
7a27497b2f0be95c51bb2cbc25da12efba682c4f766bc5abc5742e9fc8d1eeb0 pup_v0.4.0_netbsd_386.zip
|
||||
71a1808eb1b6442aa45d1de9e1c4fca543b2754c1aff5ba3d62b3456f9519691 pup_v0.4.0_netbsd_amd64.zip
|
||||
928e6691b11c68ae3f28826848a13dc5c1c9673848fe7cf7f80dd76c9fb6e8a6 pup_v0.4.0_netbsd_arm.zip
|
||||
5aca20a9b3264d2fde5a8d32f213c434edf9570ee6fae18953b8fff09d2976e2 pup_v0.4.0_openbsd_386.zip
|
||||
e965c6f04b897240d84c60e2c18226deb231a657c5583680f58a61051ff5a100 pup_v0.4.0_openbsd_amd64.zip
|
||||
30bc88a1e06606f4f3449af9fbf586f97c2e958677460a72bb1a168f67c4911c pup_v0.4.0_openbsd_arm.zip
|
||||
9d50decf4572292f187cfec84660648d648336bc6109e1f032b1699ba1d28549 pup_v0.4.0_plan9_386.zip
|
||||
1b2a6bd2388ddd691ca429497d88b2b047ec8dfb7bce9436925cb2f30632bf8e pup_v0.4.0_plan9_amd64.zip
|
||||
0835de9c10a9e2b3b958b82d148da49eaafc695fe4a018cbaf7bb861b455583f pup_v0.4.0_solaris_amd64.zip
|
||||
01acae220b69fb1ba8477d0e7f4d7669ef5de147966dc819cf75a845af74c5f3 pup_v0.4.0_windows_386.zip
|
||||
6755cbd43e94eaf173689e93e914c7056a2249c2977e5b90024fb397f9b45ba4 pup_v0.4.0_windows_amd64.zip
|
||||
'
|
||||
|
||||
declare -r TDIR=$(dirname "$0")
|
||||
|
||||
case $(uname -m) in
|
||||
x86_64 | amd64 ) ARCH=amd64 ;;
|
||||
i[3456]86 ) ARCH=386 ;;
|
||||
* ) ARCH= ;;
|
||||
esac
|
||||
|
||||
OS=$(uname -s | tr 'A-Z' 'a-z')
|
||||
case ${OS} in
|
||||
linux | freebsd | openbsd | netbsd | darwin ) ;;
|
||||
* ) OS= ;;
|
||||
esac
|
||||
|
||||
# The binary of pup 0.4.0 for macOS provided by the original project
|
||||
# crashes immediately on macOS 10.13 (Darwin 17) and up so use a fork:
|
||||
# https://github.com/ericchiang/pup/issues/85
|
||||
if [[ ${OS} = darwin && $(uname -r | cut -d. -f1) -ge 17 ]] ; then
|
||||
USE_FORK=1
|
||||
else
|
||||
USE_FORK=0
|
||||
fi
|
||||
|
||||
if (( USE_FORK )) ; then
|
||||
declare -r VERSION=69c02e189c2aaed331061ee436c39e72b830ef32
|
||||
declare -r DISTFILE="pup_${VERSION}_${OS}_${ARCH}.xz"
|
||||
declare -r URL="https://github.com/frioux/pup/releases/download/untagged-${VERSION}/pup.mac.xz"
|
||||
if ! command -v xz >/dev/null ; then
|
||||
echo "xz not found" 1>&2
|
||||
exit 3
|
||||
fi
|
||||
else
|
||||
declare -r VERSION=0.4.0
|
||||
declare -r DISTFILE="pup_v${VERSION}_${OS}_${ARCH}.zip"
|
||||
declare -r URL="https://github.com/ericchiang/pup/releases/download/v${VERSION}/${DISTFILE}"
|
||||
fi
|
||||
|
||||
if [[ -z ${ARCH} || -z ${OS} ]] ; then
|
||||
echo "pup ${VERSION} is not available for $(uname -s) on $(uname -m)" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EXPECT_SHA=
|
||||
while read sum fname ; do
|
||||
if [[ ${fname} = ${DISTFILE} ]] ; then
|
||||
EXPECT_SHA=${sum}
|
||||
break
|
||||
fi
|
||||
done <<< "${SHASUMS}"
|
||||
|
||||
wget -cO "${TDIR}/${DISTFILE}" "${URL}"
|
||||
|
||||
read -r _ GOT_SHA < <( openssl sha256 < "${TDIR}/${DISTFILE}" )
|
||||
if [[ ${EXPECT_SHA} = ${GOT_SHA} ]] ; then
|
||||
echo "Checksum for ${DISTFILE} verified :-)"
|
||||
else
|
||||
rm -f "${TDIR}/${DISTFILE}" "${TDIR}/pup"
|
||||
echo "Checksum for ${DISTFILE} does not match :-("
|
||||
echo " Expected: ${EXPECT_SHA}"
|
||||
echo " Got: ${GOT_SHA}"
|
||||
exit 2
|
||||
fi 1>&2
|
||||
|
||||
rm -f "${TDIR}/pup"
|
||||
|
||||
if (( USE_FORK )) ; then
|
||||
(cd "${TDIR}" && xz -dk "${DISTFILE}" && mv "${DISTFILE%.*}" pup && chmod a+x pup)
|
||||
else
|
||||
unzip "${TDIR}/${DISTFILE}" pup -d "${TDIR}"
|
||||
fi
|
7
t/has-index.test
Normal file
7
t/has-index.test
Normal file
|
@ -0,0 +1,7 @@
|
|||
#! /bin/bash
|
||||
cat <<---
|
||||
This test ensures that the "index.html" is returned instead of a directory
|
||||
listing when fetching a directory which contains an index file.
|
||||
--
|
||||
nginx_start
|
||||
diff -u "${TESTDIR}/has-index/index.html" <( fetch /has-index/ ) 1>&2
|
10
t/has-index/index.html
Normal file
10
t/has-index/index.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Index file test</title>
|
||||
</head>
|
||||
<body>
|
||||
This is <code>index.html</code>.
|
||||
</body>
|
||||
</html>
|
25
t/nginx.conf
Normal file
25
t/nginx.conf
Normal file
|
@ -0,0 +1,25 @@
|
|||
worker_processes 1;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
location / {
|
||||
root html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root html;
|
||||
}
|
||||
}
|
||||
}
|
124
t/preamble
Normal file
124
t/preamble
Normal file
|
@ -0,0 +1,124 @@
|
|||
#! /bin/bash
|
||||
#
|
||||
# preamble
|
||||
# Copyright (C) 2016 Adrian Perez <aperez@igalia.com>
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-2-Clause
|
||||
#
|
||||
|
||||
function nginx_conf_generate () {
|
||||
if ${DYNAMIC} ; then
|
||||
echo 'load_module modules/ngx_http_fancyindex_module.so;'
|
||||
fi
|
||||
cat <<-EOF
|
||||
worker_processes 1;
|
||||
events { worker_connections 1024; }
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
server {
|
||||
server_name localhost;
|
||||
listen 127.0.0.1:${NGINX_PORT};
|
||||
root ${TESTDIR};
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html { root html; }
|
||||
location / {
|
||||
index index.html;
|
||||
fancyindex on;
|
||||
$*
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
readonly NGINX_CONF="${PREFIX}/conf/nginx.conf"
|
||||
readonly NGINX_PID="${PREFIX}/logs/nginx.pid"
|
||||
|
||||
case $(uname -s) in
|
||||
Darwin)
|
||||
NGINX_PORT=$(netstat -a -n -finet -ptcp | awk '/LISTEN/ { sub(".+\\.", "", $4) ; seen[$4]=1 }
|
||||
END { p=1025 ; while (seen[p]) p++; print p}')
|
||||
;;
|
||||
*)
|
||||
NGINX_PORT=$(ss -4Htnl | awk '{ sub("[^:]+:", "", $4) ; seen[$4]=1 }
|
||||
END { p=1025 ; while (seen[p]) p++; print p}')
|
||||
;;
|
||||
esac
|
||||
readonly NGINX_PORT
|
||||
|
||||
rm -f "${NGINX_CONF}" "${NGINX_PID}"
|
||||
mkdir -p "${PREFIX}/logs"
|
||||
|
||||
function pup () {
|
||||
if [[ -x ${TESTDIR}/pup ]] ; then
|
||||
"${TESTDIR}/pup" "$@"
|
||||
else
|
||||
skip 'Test uses "pup", which is not available'
|
||||
fi
|
||||
}
|
||||
|
||||
function use () {
|
||||
case $1 in
|
||||
pup ) [[ -x ${TESTDIR}/pup ]] \
|
||||
|| skip 'Test uses "pup", which is unavailable\n' ;;
|
||||
* ) warn "Invalid 'use' flag: '%s'\n'" "$1" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
function nginx () {
|
||||
env - PATH="${PATH}" "${PREFIX}/sbin/nginx" "$@"
|
||||
}
|
||||
|
||||
function nginx_conf () {
|
||||
nginx_conf_generate "$@" > "${NGINX_CONF}"
|
||||
}
|
||||
|
||||
function nginx_is_running () {
|
||||
[[ -r ${NGINX_PID} ]] && kill -0 $(< "${NGINX_PID}")
|
||||
}
|
||||
|
||||
function nginx_stop () {
|
||||
if nginx_is_running ; then nginx -s stop ; fi
|
||||
rm -f "${NGINX_PID}"
|
||||
}
|
||||
trap nginx_stop EXIT
|
||||
|
||||
function nginx_start () {
|
||||
if [[ $# -gt 0 || ! -r ${NGINX_CONF} ]] ; then nginx_conf "$@" ; fi
|
||||
nginx_stop # Ensure that it is not running.
|
||||
nginx
|
||||
local n=0
|
||||
while [[ ! -r ${NGINX_PID} && n -lt 20 ]] ; do
|
||||
sleep 0.1 # Wait until pid exists.
|
||||
n=$((n+1))
|
||||
done
|
||||
}
|
||||
|
||||
function fetch () {
|
||||
local -a opts=( -q )
|
||||
if [[ $1 = --with-headers ]] ; then
|
||||
opts+=( -S )
|
||||
shift
|
||||
fi
|
||||
wget "${opts[@]}" -O- "http://localhost:${NGINX_PORT}${1:-/}" 2>&1
|
||||
}
|
||||
|
||||
function skip () {
|
||||
printf '(--) '
|
||||
printf "$@"
|
||||
exit 111
|
||||
} 1>&2
|
||||
|
||||
function fail () {
|
||||
printf '(FF) '
|
||||
printf "$@"
|
||||
exit 1
|
||||
} 1>&2
|
||||
|
||||
function warn () {
|
||||
printf '(WW) '
|
||||
printf "$@"
|
||||
} 1>&2
|
86
t/run
Executable file
86
t/run
Executable file
|
@ -0,0 +1,86 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [[ $# -lt 1 || $# -gt 2 ]] ; then
|
||||
echo "Usage: $0 <prefix-path> [1]" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtain the absolute path to the tests directory
|
||||
pushd "$(dirname "$0")" &> /dev/null
|
||||
readonly T=$(pwd)
|
||||
popd &> /dev/null
|
||||
export T
|
||||
|
||||
# Same for the nginx prefix directory
|
||||
pushd "$1" &> /dev/null
|
||||
readonly prefix=$(pwd)
|
||||
popd &> /dev/null
|
||||
|
||||
dynamic=false
|
||||
if [[ $# -gt 1 && $2 -eq 1 ]] ; then
|
||||
dynamic=true
|
||||
fi
|
||||
readonly dynamic
|
||||
|
||||
declare -a t_pass=( )
|
||||
declare -a t_fail=( )
|
||||
declare -a t_skip=( )
|
||||
|
||||
for t in `ls "$T"/*.test | sort -R` ; do
|
||||
name="t/${t##*/}"
|
||||
name=${name%.test}
|
||||
printf "${name} ... "
|
||||
errfile="${name}.err"
|
||||
outfile="${name}.out"
|
||||
shfile="${name}.sh"
|
||||
cat > "${shfile}" <<-EOF
|
||||
readonly DYNAMIC=${dynamic}
|
||||
readonly TESTDIR='$T'
|
||||
readonly PREFIX='${prefix}'
|
||||
$(< "$T/preamble")
|
||||
$(< "$t")
|
||||
EOF
|
||||
if bash -e "${shfile}" > "${outfile}" 2> "${errfile}" ; then
|
||||
t_pass+=( "${name}" )
|
||||
printf '[1;32mpassed[0;0m\n'
|
||||
elif [[ $? -eq 111 ]] ; then
|
||||
t_skip+=( "${name}" )
|
||||
printf '[1;33mskipped[0;0m\n'
|
||||
else
|
||||
t_fail+=( "${name}" )
|
||||
printf '[1;31mfailed[0;0m\n'
|
||||
fi
|
||||
done
|
||||
|
||||
for name in "${t_fail[@]}" ; do
|
||||
echo
|
||||
printf '[1m===[0m %s.out\n' "${name}"
|
||||
cat "${name}.out"
|
||||
echo
|
||||
printf '[1m===[0m %s.err\n' "${name}"
|
||||
cat "${name}.err"
|
||||
echo
|
||||
done
|
||||
|
||||
if [[ ${#t_skip[@]} -gt 0 ]] ; then
|
||||
echo
|
||||
printf '[1;33mSkipped tests:\n[0;0m'
|
||||
for name in "${t_skip[@]}" ; do
|
||||
reason=$(grep '^(\-\-) ' "${name}.err" | head -1)
|
||||
if [[ -z ${reason} ]] ; then
|
||||
reason='No reason given'
|
||||
else
|
||||
reason=${reason:5}
|
||||
fi
|
||||
printf ' - %s: %s\n' "${name}" "${reason:-No reason given}"
|
||||
done
|
||||
echo
|
||||
fi
|
||||
|
||||
printf '[1m===[0m passed/skipped/failed/total: [1;32m%d[0;0m/[1;33m%d[0;0m/[1;31m%d[0;0m/[1m%d[0m\n' \
|
||||
${#t_pass[@]} ${#t_skip[@]} ${#t_fail[@]} $(( ${#t_pass[@]} + ${#t_fail[@]} ))
|
||||
|
||||
if [[ ${#t_fail[@]} -gt 0 ]] ; then
|
||||
exit 1
|
||||
fi
|
0
t/show_dotfiles/.okay
Normal file
0
t/show_dotfiles/.okay
Normal file
|
@ -3,7 +3,7 @@
|
|||
# Copyright © Adrian Perez <aperez@igalia.com>
|
||||
#
|
||||
# Converts an HTML template into a C header suitable for inclusion.
|
||||
# Take a look at the HACKING.rst file to know how to use it :-)
|
||||
# Take a look at the HACKING.md file to know how to use it :-)
|
||||
#
|
||||
# This code is placed in the public domain.
|
||||
|
||||
|
|
39
template.h
39
template.h
|
@ -1,18 +1,19 @@
|
|||
/* Automagically generated, do not edit! */
|
||||
static const u_char t01_head1[] = ""
|
||||
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
|
||||
"\n"
|
||||
"<html xmlns=\"http://www.w3.org/1999/xhtml\">"
|
||||
"\n"
|
||||
"<!DOCTYPE html>"
|
||||
"<html>"
|
||||
"<head>"
|
||||
"<meta name=\"viewport\" content=\"width=device-width\"/>"
|
||||
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"/>"
|
||||
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"
|
||||
"<meta name=\"viewport\" content=\"width=device-width\">"
|
||||
"<style type=\"text/css\">"
|
||||
"body,html {"
|
||||
"background:#fff;"
|
||||
"font-family:\"Bitstream Vera Sans\",\"Lucida Grande\","
|
||||
"\"Lucida Sans Unicode\",Lucidux,Verdana,Lucida,sans-serif;"
|
||||
"}"
|
||||
"table {"
|
||||
"table-layout: fixed;"
|
||||
"}"
|
||||
"tr:nth-child(even) {"
|
||||
"background:#f4f4f4;"
|
||||
"}"
|
||||
|
@ -35,6 +36,11 @@ static const u_char t01_head1[] = ""
|
|||
"a:hover {"
|
||||
"color:#e33;"
|
||||
"}"
|
||||
".link {"
|
||||
"white-space: nowrap;"
|
||||
"text-overflow: '>';"
|
||||
"overflow: hidden;"
|
||||
"}"
|
||||
"</style>"
|
||||
"\n"
|
||||
;
|
||||
|
@ -56,19 +62,12 @@ static const u_char t05_body2[] = ""
|
|||
"\n"
|
||||
;
|
||||
static const u_char t06_list1[] = ""
|
||||
"<table id=\"list\" cellpadding=\"0.1em\" cellspacing=\"0\">"
|
||||
"\n"
|
||||
"<colgroup>"
|
||||
"<col width=\"55%\"/>"
|
||||
"<col width=\"20%\"/>"
|
||||
"<col width=\"25%\"/>"
|
||||
"</colgroup>"
|
||||
"\n"
|
||||
"<table id=\"list\">"
|
||||
"<thead>"
|
||||
"<tr>"
|
||||
"<th><a href=\"?C=N&O=A\">File Name</a> <a href=\"?C=N&O=D\"> ↓ </a></th>"
|
||||
"<th><a href=\"?C=S&O=A\">File Size</a> <a href=\"?C=S&O=D\"> ↓ </a></th>"
|
||||
"<th><a href=\"?C=M&O=A\">Date</a> <a href=\"?C=M&O=D\"> ↓ </a></th>"
|
||||
"<th colspan=\"2\"><a href=\"?C=N&O=A\">File Name</a> <a href=\"?C=N&O=D\"> ↓ </a></th>"
|
||||
"<th><a href=\"?C=S&O=A\">File Size</a> <a href=\"?C=S&O=D\"> ↓ </a></th>"
|
||||
"<th><a href=\"?C=M&O=A\">Date</a> <a href=\"?C=M&O=D\"> ↓ </a></th>"
|
||||
"</tr>"
|
||||
"</thead>"
|
||||
"\n"
|
||||
|
@ -76,9 +75,9 @@ static const u_char t06_list1[] = ""
|
|||
;
|
||||
static const u_char t_parentdir_entry[] = ""
|
||||
"<tr>"
|
||||
"<td><a href=\"../?C=N&O=A\">Parent directory/</a></td>"
|
||||
"<td>-</td>"
|
||||
"<td>-</td>"
|
||||
"<td colspan=\"2\" class=\"link\"><a href=\"../?C=N&O=A\">Parent directory/</a></td>"
|
||||
"<td class=\"size\">-</td>"
|
||||
"<td class=\"date\">-</td>"
|
||||
"</tr>"
|
||||
"\n"
|
||||
;
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
<!-- var t01_head1 -->
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
|
||||
<meta name="viewport" content="width=device-width"/>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<style type="text/css">
|
||||
body,html {
|
||||
background:#fff;
|
||||
font-family:"Bitstream Vera Sans","Lucida Grande",
|
||||
"Lucida Sans Unicode",Lucidux,Verdana,Lucida,sans-serif;
|
||||
}
|
||||
table {
|
||||
table-layout: fixed;
|
||||
}
|
||||
tr:nth-child(even) {
|
||||
background:#f4f4f4;
|
||||
}
|
||||
|
@ -34,6 +35,11 @@
|
|||
a:hover {
|
||||
color:#e33;
|
||||
}
|
||||
.link {
|
||||
white-space: nowrap;
|
||||
text-overflow: '>';
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- var t02_head2 -->
|
||||
|
@ -54,43 +60,36 @@
|
|||
</h1>
|
||||
|
||||
<!-- var t06_list1 -->
|
||||
<table id="list" cellpadding="0.1em" cellspacing="0">
|
||||
|
||||
<colgroup>
|
||||
<col width="55%"/>
|
||||
<col width="20%"/>
|
||||
<col width="25%"/>
|
||||
</colgroup>
|
||||
|
||||
<table id="list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><a href="?C=N&O=A">File Name</a> <a href="?C=N&O=D"> ↓ </a></th>
|
||||
<th><a href="?C=S&O=A">File Size</a> <a href="?C=S&O=D"> ↓ </a></th>
|
||||
<th><a href="?C=M&O=A">Date</a> <a href="?C=M&O=D"> ↓ </a></th>
|
||||
<th colspan="2"><a href="?C=N&O=A">File Name</a> <a href="?C=N&O=D"> ↓ </a></th>
|
||||
<th><a href="?C=S&O=A">File Size</a> <a href="?C=S&O=D"> ↓ </a></th>
|
||||
<th><a href="?C=M&O=A">Date</a> <a href="?C=M&O=D"> ↓ </a></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<!-- var t_parentdir_entry -->
|
||||
<tr>
|
||||
<td><a href="../?C=N&O=A">Parent directory/</a></td>
|
||||
<td>-</td>
|
||||
<td>-</td>
|
||||
<td colspan="2" class="link"><a href="../?C=N&O=A">Parent directory/</a></td>
|
||||
<td class="size">-</td>
|
||||
<td class="date">-</td>
|
||||
</tr>
|
||||
|
||||
<!-- var NONE -->
|
||||
<tr>
|
||||
<td>test file 1</td>
|
||||
<td colspan="2">test file 1</td>
|
||||
<td>123kB</td>
|
||||
<td>date</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>test file 2</td>
|
||||
<td colspan="2">test file 2</td>
|
||||
<td>321MB</td>
|
||||
<td>date</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>test file 3</td>
|
||||
<td colspan="2">test file 3</td>
|
||||
<td>666</td>
|
||||
<td>date</td>
|
||||
</tr>
|
||||
|
|
Loading…
Add table
Reference in a new issue