From d70de5bf95ee9c257fb0818d6ac6df035653488d Mon Sep 17 00:00:00 2001 From: David Hummel <6109326+hummeltech@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:41:28 -0700 Subject: [PATCH 1/3] Add test for #33 --- docs/man/renderd.conf.5 | 4 +- etc/renderd/renderd.conf.examples | 6 +-- includes/mod_tile.h | 2 +- tests/CMakeLists.txt | 61 ++++++++++++++++++++++++++++--- tests/renderd.conf.in | 4 +- 5 files changed, 64 insertions(+), 13 deletions(-) diff --git a/docs/man/renderd.conf.5 b/docs/man/renderd.conf.5 index 4148d0d1f..f188c6e4f 100644 --- a/docs/man/renderd.conf.5 +++ b/docs/man/renderd.conf.5 @@ -15,6 +15,8 @@ This manual page documents briefly the \fBrenderd.conf\fR configuration file. The default location is \fB'/etc/renderd.conf'\fR (macro definition \fB'RENDERD_CONFIG'\fR). .PP All option names are \fBcase-insensitive\fR. +.PP +Any values containing semicolons must be \fBquoted\fR, however \fBdouble quotes\fR cannot be escaped. .SH RENDERD @@ -115,7 +117,7 @@ The default value is \fB'1'\fR. .B attribution Specify the data attribution to be provided by \fBmod_tile\fR as \fBTileJSON\fR (via \fB{URI}/tile-layer.json\fR). Only used by \fBmod_tile\fR. -The default value is \fB'©OpenStreetMap and contributors, (ODbL)'\fR (macro definition \fB'DEFAULT_ATTRIBUTION'\fR). +The default value is \fB'©OpenStreetMap and contributors, (ODbL)'\fR (macro definition \fB'DEFAULT_ATTRIBUTION'\fR). .TP .B cors diff --git a/etc/renderd/renderd.conf.examples b/etc/renderd/renderd.conf.examples index 7e1c2609d..c0047103a 100644 --- a/etc/renderd/renderd.conf.examples +++ b/etc/renderd/renderd.conf.examples @@ -56,7 +56,7 @@ XML=/var/www/example-map/mapnik.xml ;MAXZOOM=18 ;TYPE=png image/png png256 ; Values are: (for more information about output format see https://github.com/mapnik/mapnik/wiki/Image-IO) ;DESCRIPTION=This is a description of the tile layer used in the tile json request -;ATTRIBUTION=©OpenStreetMap and contributors, ODbL +;ATTRIBUTION="© style1" ;SERVER_ALIAS=http://localhost/ ;CORS=http://www.openstreetmap.org ;ASPECTX=1 @@ -75,7 +75,7 @@ XML=/var/www/example-map/mapnik.xml ;MAXZOOM=22 ;TYPE=png image/png png256 ; Values are: (for more information about output format see https://github.com/mapnik/mapnik/wiki/Image-IO) ;DESCRIPTION=This is a description of the tile layer used in the tile json request -;ATTRIBUTION=©OpenStreetMap and contributors, ODbL +;ATTRIBUTION='© style2' ;SERVER_ALIAS=http://localhost/ ;CORS=* @@ -91,6 +91,6 @@ XML=/var/www/example-map/mapnik.xml ;MAXZOOM=22 ;TYPE=png image/png png256 ; Values are: (for more information about output format see https://github.com/mapnik/mapnik/wiki/Image-IO) ;DESCRIPTION=This is a description of the tile layer used in the tile json request -;ATTRIBUTION=©OpenStreetMap and contributors, ODbL +;ATTRIBUTION='© \'style3\'' ;SERVER_ALIAS=http://localhost/ ;CORS=* diff --git a/includes/mod_tile.h b/includes/mod_tile.h index cb3958e73..882310344 100644 --- a/includes/mod_tile.h +++ b/includes/mod_tile.h @@ -51,7 +51,7 @@ /* Maximum number of times we camp out before giving up */ #define MAXCAMP 10 -#define DEFAULT_ATTRIBUTION "©OpenStreetMap and contributors, (ODbL)" +#define DEFAULT_ATTRIBUTION "©OpenStreetMap and contributors, (ODbL)" typedef struct delaypool_entry { struct in6_addr ip_addr; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e973e5d0a..be26e98ae 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1087,28 +1087,77 @@ foreach(STORAGE_BACKEND_INDEX RANGE ${STORAGE_BACKENDS_LENGTH}) COMMAND ${BASH} -c " TILE_DEFAULT_TILEJSON_CMD=\"${CURL_CMD} ${TILE_DEFAULT_TILEJSON_URL}\" TILE_DEFAULT_TILEJSON_OUTPUT=$(\${TILE_DEFAULT_TILEJSON_CMD}) + TILE_DEFAULT_TILEJSON_ATTRIBUTION=$(echo \"\${TILE_DEFAULT_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .attribution) - if [ \"\${TILE_DEFAULT_TILEJSON_ATTRIBUTION}\" != \"Attribution for ${DEFAULT_MAP_NAME}\" ]; then + TILE_DEFAULT_TILEJSON_ATTRIBUTION_EXPECTED=\"Attribution for '${DEFAULT_MAP_NAME}' ©\" + if [ \"\${TILE_DEFAULT_TILEJSON_ATTRIBUTION}\" != \"\${TILE_DEFAULT_TILEJSON_ATTRIBUTION_EXPECTED}\" ]; then + echo \"Error in .attribution\"; + echo \"Found: \${TILE_DEFAULT_TILEJSON_ATTRIBUTION}\"; + echo \"Expected: \${TILE_DEFAULT_TILEJSON_ATTRIBUTION_EXPECTED}\"; exit 1; fi TILE_DEFAULT_TILEJSON_DESCRIPTION=$(echo \"\${TILE_DEFAULT_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .description) - if [ \"\${TILE_DEFAULT_TILEJSON_DESCRIPTION}\" != \"Description for ${DEFAULT_MAP_NAME}\" ]; then + TILE_DEFAULT_TILEJSON_DESCRIPTION_EXPECTED=\"Description for '${DEFAULT_MAP_NAME}' ©\" + if [ \"\${TILE_DEFAULT_TILEJSON_DESCRIPTION}\" != \"\${TILE_DEFAULT_TILEJSON_DESCRIPTION_EXPECTED}\" ]; then + echo \"Error in .description\"; + echo \"Found: \${TILE_DEFAULT_TILEJSON_DESCRIPTION}\"; + echo \"Expected: \${TILE_DEFAULT_TILEJSON_DESCRIPTION_EXPECTED}\"; exit 1; fi TILE_DEFAULT_TILEJSON_NAME=$(echo \"\${TILE_DEFAULT_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .name) - if [ \"\${TILE_DEFAULT_TILEJSON_NAME}\" != \"${DEFAULT_MAP_NAME}\" ]; then + TILE_DEFAULT_TILEJSON_NAME_EXPECTED=\"${DEFAULT_MAP_NAME}\" + if [ \"\${TILE_DEFAULT_TILEJSON_NAME}\" != \"\${TILE_DEFAULT_TILEJSON_NAME_EXPECTED}\" ]; then + echo \"Error in .name\"; + echo \"Found: \${TILE_DEFAULT_TILEJSON_NAME}\"; + echo \"Expected: \${TILE_DEFAULT_TILEJSON_NAME_EXPECTED}\"; exit 1; fi TILE_DEFAULT_TILEJSON_VERSION=$(echo \"\${TILE_DEFAULT_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .tilejson) - if [ \"\${TILE_DEFAULT_TILEJSON_VERSION}\" != \"2.0.0\" ]; then + TILE_DEFAULT_TILEJSON_VERSION_EXPECTED=\"2.0.0\" + if [ \"\${TILE_DEFAULT_TILEJSON_VERSION}\" != \"\${TILE_DEFAULT_TILEJSON_VERSION_EXPECTED}\" ]; then + echo \"Error in .tilejson\"; + echo \"Found: \${TILE_DEFAULT_TILEJSON_VERSION}\"; + echo \"Expected: \${TILE_DEFAULT_TILEJSON_VERSION_EXPECTED}\"; exit 1; fi TILE_DEFAULT_TILEJSON_TILES_0=$(echo \"\${TILE_DEFAULT_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .tiles[0]) - if [ \"\${TILE_DEFAULT_TILEJSON_TILES_0}\" != \"http://localhost/tiles/${DEFAULT_MAP_NAME}/{z}/{x}/{y}.png\" ]; then + TILE_DEFAULT_TILEJSON_TILES_0_EXPECTED=\"http://localhost/tiles/${DEFAULT_MAP_NAME}/{z}/{x}/{y}.png\" + if [ \"\${TILE_DEFAULT_TILEJSON_TILES_0}\" != \"\${TILE_DEFAULT_TILEJSON_TILES_0_EXPECTED}\" ]; then + echo \"Error in .tiles[0]\"; + echo \"Found: \${TILE_DEFAULT_TILEJSON_TILES_0}\"; + echo \"Expected: \${TILE_DEFAULT_TILEJSON_TILES_0_EXPECTED}\"; exit 1; fi TILE_DEFAULT_TILEJSON_TILES_1=$(echo \"\${TILE_DEFAULT_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .tiles[1]) - if [ \"\${TILE_DEFAULT_TILEJSON_TILES_1}\" != \"http://alias/tiles/${DEFAULT_MAP_NAME}/{z}/{x}/{y}.png\" ]; then + TILE_DEFAULT_TILEJSON_TILES_1_EXPECTED=\"http://alias/tiles/${DEFAULT_MAP_NAME}/{z}/{x}/{y}.png\" + if [ \"\${TILE_DEFAULT_TILEJSON_TILES_1}\" != \"\${TILE_DEFAULT_TILEJSON_TILES_1_EXPECTED}\" ]; then + echo \"Error in .tiles[1]\"; + echo \"Found: \${TILE_DEFAULT_TILEJSON_TILES_1}\"; + echo \"Expected: \${TILE_DEFAULT_TILEJSON_TILES_1_EXPECTED}\"; + exit 1; + fi + + TILE_TILEJSON_URL=\"${TILE_DEFAULT_TILEJSON_URL}\" + TILE_CORS_ALL_TILEJSON_CMD=\"${CURL_CMD} \${TILE_TILEJSON_URL/${DEFAULT_MAP_NAME}/cors_all}\" + TILE_CORS_ALL_TILEJSON_OUTPUT=$(\${TILE_CORS_ALL_TILEJSON_CMD}) + + TILE_CORS_ALL_TILEJSON_ATTRIBUTION=$(echo \"\${TILE_CORS_ALL_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .attribution) + TILE_CORS_ALL_TILEJSON_ATTRIBUTION_EXPECTED=\"©OpenStreetMap and \" + TILE_CORS_ALL_TILEJSON_ATTRIBUTION_EXPECTED+=\"\" + TILE_CORS_ALL_TILEJSON_ATTRIBUTION_EXPECTED+=\"contributors, \" + TILE_CORS_ALL_TILEJSON_ATTRIBUTION_EXPECTED+=\"(ODbL)\" + if [ \"\${TILE_CORS_ALL_TILEJSON_ATTRIBUTION}\" != \"\${TILE_CORS_ALL_TILEJSON_ATTRIBUTION_EXPECTED}\" ]; then + echo \"Error in .attribution\"; + echo \"Found: \${TILE_CORS_ALL_TILEJSON_ATTRIBUTION}\"; + echo \"Expected: \${TILE_CORS_ALL_TILEJSON_ATTRIBUTION_EXPECTED}\"; + exit 1; + fi + TILE_CORS_ALL_TILEJSON_DESCRIPTION=$(echo \"\${TILE_CORS_ALL_TILEJSON_OUTPUT}\" | ${JQ_EXECUTABLE} -r .description) + TILE_CORS_ALL_TILEJSON_DESCRIPTION_EXPECTED=\"\" + if [ \"\${TILE_CORS_ALL_TILEJSON_DESCRIPTION}\" != \"\${TILE_CORS_ALL_TILEJSON_DESCRIPTION_EXPECTED}\" ]; then + echo \"Error in .description\"; + echo \"Found: \${TILE_CORS_ALL_TILEJSON_DESCRIPTION}\"; + echo \"Expected: \${TILE_CORS_ALL_TILEJSON_DESCRIPTION_EXPECTED}\"; exit 1; fi " diff --git a/tests/renderd.conf.in b/tests/renderd.conf.in index 7e34e0ea1..213a69ba1 100644 --- a/tests/renderd.conf.in +++ b/tests/renderd.conf.in @@ -8,8 +8,8 @@ plugins_dir=@MAPNIK_PLUGINS_DIR@ # Test Comment: Default Map Section ; Test Comment: Default Map Section [@DEFAULT_MAP_NAME@] -ATTRIBUTION=Attribution for @DEFAULT_MAP_NAME@ -DESCRIPTION=Description for @DEFAULT_MAP_NAME@ +ATTRIBUTION="Attribution for '@DEFAULT_MAP_NAME@' ©" +DESCRIPTION='Description for \'@DEFAULT_MAP_NAME@\' ©' MAXZOOM=5 MINZOOM=0 SERVER_ALIAS=http://alias/ From 66fffe530f3af52bc39845c20c1ef14cf9f81244 Mon Sep 17 00:00:00 2001 From: David Hummel <6109326+hummeltech@users.noreply.github.com> Date: Wed, 21 Oct 2026 07:51:52 -0700 Subject: [PATCH 2/3] Remove ambiguous however, add clarification --- docs/man/renderd.conf.5 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/man/renderd.conf.5 b/docs/man/renderd.conf.5 index f188c6e4f..0c76c208e 100644 --- a/docs/man/renderd.conf.5 +++ b/docs/man/renderd.conf.5 @@ -16,7 +16,9 @@ The default location is \fB'/etc/renderd.conf'\fR (macro definition \fB'RENDERD_ .PP All option names are \fBcase-insensitive\fR. .PP -Any values containing semicolons must be \fBquoted\fR, however \fBdouble quotes\fR cannot be escaped. +Any values containing semicolons must be \fBquoted\fR. +.PP +Any \fBdouble quoted\fR values must not contain \fBdouble quotes\fR as they cannot be escaped, only \fBsingle quotes\fR can be escaped within \fBsingle quoted\fR values. .SH RENDERD From 1d1eff5b5db88ca499286d0ad2a38ae775953950 Mon Sep 17 00:00:00 2001 From: David Hummel <6109326+hummeltech@users.noreply.github.com> Date: Wed, 21 Oct 2026 07:59:14 -0700 Subject: [PATCH 3/3] Update date --- docs/man/renderd.conf.5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/man/renderd.conf.5 b/docs/man/renderd.conf.5 index 0c76c208e..8e563f223 100644 --- a/docs/man/renderd.conf.5 +++ b/docs/man/renderd.conf.5 @@ -1,4 +1,4 @@ -.TH RENDERD.CONF 5 "2024-06-06" "mod_tile v0.8.1" +.TH RENDERD.CONF 5 "2026-10-21" "mod_tile v0.8.1" .\" Please adjust this date whenever revising the manpage. .SH NAME