diff --git a/docs/man/renderd.conf.5 b/docs/man/renderd.conf.5
index 4148d0d1..8e563f22 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
@@ -15,6 +15,10 @@ 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.
+.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
@@ -115,7 +119,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 7e1c2609..c0047103 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 cb3958e7..88231034 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 e973e5d0..be26e98a 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 7e34e0ea..213a69ba 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/