Compare commits

..

No commits in common. "master" and "v0.4.0" have entirely different histories.

45 changed files with 378 additions and 1489 deletions

4
.gitattributes vendored
View file

@ -1,4 +0,0 @@
/.gitignore export-ignore
/.travis.yml export-ignore
/make-dist export-ignore
t/* text eol=lf

View file

@ -1,49 +0,0 @@
---
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
View file

@ -1,8 +1 @@
*.sw[op]
/nginx-*
/t/*.sh
/t/*.out
/t/*.err
/t/pup*
/t/bug*/
/prefix/

30
.travis.yml Normal file
View file

@ -0,0 +1,30 @@
language: c
compiler:
- clang
- gcc
env:
# At least try stable and mainline versions
- NGINX=1.10.0 TYPE=dynamic
- NGINX=1.9.15 TYPE=dynamic
- NGINX=1.8.1 TYPE=static
# Also, the oldest supported version
# TODO: Fails building because it won't find IOV_MAX from header.
#- NGINX=0.7.69
sudo: false
addons:
apt:
packages:
- libpcre3-dev
- libssl-dev
cache: ccache
script: |
wget -O - http://nginx.org/download/nginx-${NGINX}.tar.gz | tar -xzf -
cd nginx-${NGINX}
if [[ ${TYPE} = "dynamic" ]] ; then ./configure --add-dynamic-module=.. --with-http_addition_module ; else ./configure --add-module=.. --with-http_addition_module ; fi
make

View file

@ -3,98 +3,6 @@ All notable changes to this project will be documented in this file.
## [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
@ -182,14 +90,7 @@ All notable changes to this project will be documented in this file.
- `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
[Unreleased]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.0...HEAD
[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

View file

@ -21,10 +21,4 @@ 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.
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).
install it and use `gawk` instead in the command line above.

View file

@ -2,8 +2,8 @@
Nginx Fancy Index module
========================
.. image:: https://travis-ci.com/aperezdc/ngx-fancyindex.svg?branch=master
:target: https://travis-ci.com/aperezdc/ngx-fancyindex
.. image:: https://travis-ci.org/aperezdc/ngx-fancyindex.svg?branch=master
:target: https://travis-ci.org/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
allows a certain degree of customization of the generated content:
module 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 your own CSS style rules.
* Custom headers. Either local or stored remotely.
* Custom footers. Either local or stored remotely.
* Add you own CSS style rules.
* Allow choosing to sort elements by name (default), modification time, or
size; both ascending (default), or descending.
@ -26,35 +26,13 @@ server written by `Igor Sysoev <http://sysoev.ru>`__.
Requirements
============
CentOS, RHEL, Fedora Linux
~~~~~~~~~~~~~~~~~~~~~~~~~~
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).
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>`_
In order to use the fancyindex_header_ and fancyindex_footer_ directives
you will also need the `ngx_http_addition_module <http://nginx.org/en/docs/http/ngx_http_addition_module.html>`_
built into Nginx.
@ -80,9 +58,7 @@ Building
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
using ``--add-dynamic-module=…`` instead.
4. Build and install the software::
@ -116,15 +92,10 @@ 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.
* `Theme <https://github.com/stayn0ided/Nginx-Fancyindex-Theme>`__ by
`@stayn0ided <https://github.com/stayn0ided>`__. Uses custom header and footer, the
header includes search field to filter by filename using JavaScript
(`demo <http://noided.grr.io/fancyindex/>`__).
Directives
@ -146,24 +117,6 @@ 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*
@ -181,26 +134,32 @@ 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* [*subrequest* | *local*]
:Syntax: *fancyindex_footer path*
: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. 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.
be sent.
.. note:: Using this directive needs the ngx_http_addition_module_ built
into Nginx.
.. warning:: When inserting custom a header/footer, a subrequest will be
.. warning:: When inserting custom 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
@ -210,49 +169,38 @@ fancyindex_footer
fancyindex_header
~~~~~~~~~~~~~~~~~
:Syntax: *fancyindex_header path* [*subrequest* | *local*]
:Syntax: *fancyindex_header path*
: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. 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.
be sent.
.. 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.
Whether to output or not 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
~~~~~~~~~~~~~~~~~
:Syntax: *fancyindex_ignore string1 [string2 [... stringN]]*
:Default: No default.
:Context: http, server, location
:Description:
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
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
regular expressions.
fancyindex_hide_symlinks
@ -263,14 +211,6 @@ fancyindex_hide_symlinks
: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*]
@ -286,7 +226,7 @@ fancyindex_time_format
: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>`_
those supported by the `strftime <http://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:
@ -319,6 +259,6 @@ fancyindex_time_format
* ``%Y``: Year as a decimal number including the century.
.. _nginx: https://nginx.org
.. _nginx: http://nginx.net
.. vim:ft=rst:spell:spelllang=en:

5
config
View file

@ -1,12 +1,11 @@
# vim:ft=sh:
ngx_addon_name=ngx_http_fancyindex_module
if [ "$ngx_module_link" = DYNAMIC ] ; then
if test -n "$ngx_module_link"; 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!

View file

@ -1,10 +0,0 @@
#! /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"

23
nginx-0.6-support.patch Normal file
View file

@ -0,0 +1,23 @@
=== 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

View file

@ -1,22 +0,0 @@
#! /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

View file

@ -1,7 +0,0 @@
#! /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 )

View file

@ -1,11 +0,0 @@
#! /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}"

View file

@ -1,9 +0,0 @@
#! /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}"

View file

@ -1,24 +0,0 @@
#! /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 ]]

View file

@ -1,36 +0,0 @@
#! /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{} )

View file

@ -1,23 +0,0 @@
#! /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} != - ]]

View file

@ -1,50 +0,0 @@
#! /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"

View file

@ -1,21 +0,0 @@
#! /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

View file

@ -1,17 +0,0 @@
#! /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'

View file

@ -1,17 +0,0 @@
#! /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'

View file

@ -1,26 +0,0 @@
#! /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'

View file

@ -1,31 +0,0 @@
#! /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'

View file

@ -1,11 +0,0 @@
#! /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'

View file

@ -1,9 +0,0 @@
#! /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

View file

@ -1,27 +0,0 @@
#! /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'

View file

@ -1,16 +0,0 @@
#! /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"

View file

@ -1,8 +0,0 @@
#! /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

View file

@ -1,8 +0,0 @@
#! /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

View file

@ -1,19 +0,0 @@
#! /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}"

View file

@ -1,36 +0,0 @@
#! /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}

View file

105
t/get-pup
View file

@ -1,105 +0,0 @@
#! /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

View file

@ -1,7 +0,0 @@
#! /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

View file

@ -1,10 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Index file test</title>
</head>
<body>
This is <code>index.html</code>.
</body>
</html>

View file

@ -1,25 +0,0 @@
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;
}
}
}

View file

@ -1,124 +0,0 @@
#! /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
View file

@ -1,86 +0,0 @@
#!/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 'passed\n'
elif [[ $? -eq 111 ]] ; then
t_skip+=( "${name}" )
printf 'skipped\n'
else
t_fail+=( "${name}" )
printf 'failed\n'
fi
done
for name in "${t_fail[@]}" ; do
echo
printf '=== %s.out\n' "${name}"
cat "${name}.out"
echo
printf '=== %s.err\n' "${name}"
cat "${name}.err"
echo
done
if [[ ${#t_skip[@]} -gt 0 ]] ; then
echo
printf 'Skipped tests:\n'
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 '=== passed/skipped/failed/total: %d/%d/%d/%d\n' \
${#t_pass[@]} ${#t_skip[@]} ${#t_fail[@]} $(( ${#t_pass[@]} + ${#t_fail[@]} ))
if [[ ${#t_fail[@]} -gt 0 ]] ; then
exit 1
fi

View file

View 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.md file to know how to use it :-)
# Take a look at the HACKING.rst file to know how to use it :-)
#
# This code is placed in the public domain.

View file

@ -1,19 +1,18 @@
/* Automagically generated, do not edit! */
static const u_char t01_head1[] = ""
"<!DOCTYPE html>"
"<html>"
"<!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"
"<head>"
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"
"<meta name=\"viewport\" content=\"width=device-width\">"
"<meta name=\"viewport\" content=\"width=device-width\"/>"
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"/>"
"<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;"
"}"
@ -36,11 +35,6 @@ static const u_char t01_head1[] = ""
"a:hover {"
"color:#e33;"
"}"
".link {"
"white-space: nowrap;"
"text-overflow: '>';"
"overflow: hidden;"
"}"
"</style>"
"\n"
;
@ -62,12 +56,19 @@ static const u_char t05_body2[] = ""
"\n"
;
static const u_char t06_list1[] = ""
"<table id=\"list\">"
"<table id=\"list\" cellpadding=\"0.1em\" cellspacing=\"0\">"
"\n"
"<colgroup>"
"<col width=\"55%\"/>"
"<col width=\"20%\"/>"
"<col width=\"25%\"/>"
"</colgroup>"
"\n"
"<thead>"
"<tr>"
"<th colspan=\"2\"><a href=\"?C=N&amp;O=A\">File Name</a>&nbsp;<a href=\"?C=N&amp;O=D\">&nbsp;&darr;&nbsp;</a></th>"
"<th><a href=\"?C=S&amp;O=A\">File Size</a>&nbsp;<a href=\"?C=S&amp;O=D\">&nbsp;&darr;&nbsp;</a></th>"
"<th><a href=\"?C=M&amp;O=A\">Date</a>&nbsp;<a href=\"?C=M&amp;O=D\">&nbsp;&darr;&nbsp;</a></th>"
"<th><a href=\"?C=N&O=A\">File Name</a>&nbsp;<a href=\"?C=N&O=D\">&nbsp;&#8595;&nbsp;</a></th>"
"<th><a href=\"?C=S&O=A\">File Size</a>&nbsp;<a href=\"?C=S&O=D\">&nbsp;&#8595;&nbsp;</a></th>"
"<th><a href=\"?C=M&O=A\">Date</a>&nbsp;<a href=\"?C=M&O=D\">&nbsp;&#8595;&nbsp;</a></th>"
"</tr>"
"</thead>"
"\n"
@ -75,9 +76,9 @@ static const u_char t06_list1[] = ""
;
static const u_char t_parentdir_entry[] = ""
"<tr>"
"<td colspan=\"2\" class=\"link\"><a href=\"../?C=N&amp;O=A\">Parent directory/</a></td>"
"<td class=\"size\">-</td>"
"<td class=\"date\">-</td>"
"<td><a href=\"../?C=N&amp;O=A\">Parent directory/</a></td>"
"<td>-</td>"
"<td>-</td>"
"</tr>"
"\n"
;

View file

@ -1,18 +1,17 @@
<!-- var t01_head1 -->
<!DOCTYPE html>
<html>
<!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">
<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;
}
@ -35,11 +34,6 @@
a:hover {
color:#e33;
}
.link {
white-space: nowrap;
text-overflow: '>';
overflow: hidden;
}
</style>
<!-- var t02_head2 -->
@ -60,36 +54,43 @@
</h1>
<!-- var t06_list1 -->
<table id="list">
<table id="list" cellpadding="0.1em" cellspacing="0">
<colgroup>
<col width="55%"/>
<col width="20%"/>
<col width="25%"/>
</colgroup>
<thead>
<tr>
<th colspan="2"><a href="?C=N&amp;O=A">File Name</a>&nbsp;<a href="?C=N&amp;O=D">&nbsp;&darr;&nbsp;</a></th>
<th><a href="?C=S&amp;O=A">File Size</a>&nbsp;<a href="?C=S&amp;O=D">&nbsp;&darr;&nbsp;</a></th>
<th><a href="?C=M&amp;O=A">Date</a>&nbsp;<a href="?C=M&amp;O=D">&nbsp;&darr;&nbsp;</a></th>
<th><a href="?C=N&O=A">File Name</a>&nbsp;<a href="?C=N&O=D">&nbsp;&#8595;&nbsp;</a></th>
<th><a href="?C=S&O=A">File Size</a>&nbsp;<a href="?C=S&O=D">&nbsp;&#8595;&nbsp;</a></th>
<th><a href="?C=M&O=A">Date</a>&nbsp;<a href="?C=M&O=D">&nbsp;&#8595;&nbsp;</a></th>
</tr>
</thead>
<tbody>
<!-- var t_parentdir_entry -->
<tr>
<td colspan="2" class="link"><a href="../?C=N&amp;O=A">Parent directory/</a></td>
<td class="size">-</td>
<td class="date">-</td>
<td><a href="../?C=N&amp;O=A">Parent directory/</a></td>
<td>-</td>
<td>-</td>
</tr>
<!-- var NONE -->
<tr>
<td colspan="2">test file 1</td>
<td>test file 1</td>
<td>123kB</td>
<td>date</td>
</tr>
<tr>
<td colspan="2">test file 2</td>
<td>test file 2</td>
<td>321MB</td>
<td>date</td>
</tr>
<tr>
<td colspan="2">test file 3</td>
<td>test file 3</td>
<td>666</td>
<td>date</td>
</tr>