Repository: MapServer/MapServer
Pull request #7280: WMS_SERVER: Add sanity check for TRANSPARENT parameter value in GetMap
Author: login: tschorr
Created: 2025-05-15T06:25:30Z | Merged: 2025-05-22T11:28:38Z

According to the [OGC WMS specification](https://portal.ogc.org/files/?artifact_id=14416), the only allowed values for the TRANSPARENT parameter of the GetMap request are TRUE and FALSE. However MapServer only checks for the value TRUE, all other (arbitrary) values evaluate to false.

This causes a test in the INSPIRE validator/ETS repository to fail: https://github.com/inspire-eu-validation/ets-repository/blob/28b66265aab8fc8228672283887475818aade1ab/service/vs-wms-soapui-project.xml#L5084-L5180.

This PR adds a sanity check for the GetMap TRANSPARENT parameter value - allow only TRUE or FALSE and raise a service exception for other values.


Diff:
diff --git a/msautotest/wxs/expected/wms_getmap130transparentinvalidexception.xml b/msautotest/wxs/expected/wms_getmap130transparentinvalidexception.xml
new file mode 100644
index 0000000000..b17da6ff3b
--- /dev/null
+++ b/msautotest/wxs/expected/wms_getmap130transparentinvalidexception.xml
@@ -0,0 +1,8 @@
+Content-Type: text/xml; charset=UTF-8
+
+<?xml version='1.0' encoding="UTF-8" standalone="no" ?>
+<ServiceExceptionReport version="1.3.0" xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/wms/1.3.0/exceptions_1_3_0.xsd">
+<ServiceException>
+msWMSLoadGetMapParams(): WMS server error. Value for TRANSPARENT must be either TRUE or FALSE.
+</ServiceException>
+</ServiceExceptionReport>
diff --git a/msautotest/wxs/wms_simple.map b/msautotest/wxs/wms_simple.map
index c2e87440be..9daf9f0972 100644
--- a/msautotest/wxs/wms_simple.map
+++ b/msautotest/wxs/wms_simple.map
@@ -68,6 +68,9 @@
 # GetMap exception (number of layers < LayerLimit)
 # RUN_PARMS: wms_getmap130layerlimitexception.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&SRS=EPSG%3A4326&BBOX=35.18749999863387,-141.0000000021858,90.81250000136613,-51.99999999781419&WIDTH=560&HEIGHT=350&LAYERS=road,road&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=FALSE&EXCEPTIONS=XML" > [RESULT]
 #
+# GetMap (non-standard compliant parameter value for TRANSPARENT evaluates to FALSE)
+# RUN_PARMS: wms_getmap130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG%3A4326&BBOX=35.18749999863387,-141.0000000021858,90.81250000136613,-51.99999999781419&WIDTH=560&HEIGHT=350&LAYERS=road&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=zzzz&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME]
+#
 # GetFeatureInfo
 # RUN_PARMS: wms_getfeatureinfo130.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&CRS=EPSG%3A4326&BBOX=35.18749999863387,-141.0000000021858,90.81250000136613,-51.99999999781419&WIDTH=560&HEIGHT=350&LAYERS=road&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=FALSE&QUERY_LAYERS=road&INFO_FORMAT=application%2Fvnd.ogc.gml&I=483&J=291&FEATURE_COUNT=5" > [RESULT]
 
diff --git a/msautotest/wxs/wms_simple_strict_compliance.map b/msautotest/wxs/wms_simple_strict_compliance.map
new file mode 100644
index 0000000000..d7a4160eb0
--- /dev/null
+++ b/msautotest/wxs/wms_simple_strict_compliance.map
@@ -0,0 +1,119 @@
+#
+# Test WMS, check for strict standard compliance
+#
+# REQUIRES: INPUT=GDAL OUTPUT=PNG SUPPORTS=WMS
+#
+# GetMap
+# RUN_PARMS: wms_getmap130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG%3A4326&BBOX=35.18749999863387,-141.0000000021858,90.81250000136613,-51.99999999781419&WIDTH=560&HEIGHT=350&LAYERS=road&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME]
+#
+# GetMap exception (wrong parameter value for TRANSPARENT)
+# RUN_PARMS: wms_getmap130transparentinvalidexception.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG%3A4326&BBOX=35.18749999863387,-141.0000000021858,90.81250000136613,-51.99999999781419&WIDTH=560&HEIGHT=350&LAYERS=road&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=zzzz&EXCEPTIONS=XML" > [RESULT]
+#
+# GetMap exception (TRANSPARENT parameters are case sensitive)
+# RUN_PARMS: wms_getmap130transparentinvalidexception.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG%3A4326&BBOX=35.18749999863387,-141.0000000021858,90.81250000136613,-51.99999999781419&WIDTH=560&HEIGHT=350&LAYERS=road&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=true&EXCEPTIONS=XML" > [RESULT]
+#
+MAP
+
+NAME WMS_TEST
+STATUS ON
+SIZE 400 300
+#EXTENT   2018000 -73300 3410396 647400
+#UNITS METERS
+EXTENT -67.5725 42 -58.9275 48.5
+UNITS DD
+IMAGECOLOR 255 255 255
+SHAPEPATH ./data
+SYMBOLSET etc/symbols.sym
+FONTSET etc/fonts.txt
+
+
+OUTPUTFORMAT
+  NAME png
+  DRIVER "AGG/PNG8"
+  MIMETYPE "image/png"
+  EXTENSION "png"
+END
+
+
+#
+# Start of web interface definition
+#
+WEB
+
+ IMAGEPATH "/tmp/ms_tmp/"
+ IMAGEURL "/ms_tmp/"
+ EMPTY    "https://example.com/empty.html"
+
+  METADATA
+    "ows_updatesequence"   "123"
+    "wms_title"		   "Test simple wms"
+    "wms_onlineresource"   "http://localhost/path/to/wms_simple?"
+    "wms_srs"		   "EPSG:42304 EPSG:42101 EPSG:4269 EPSG:4326"
+    "ows_schemas_location" "http://schemas.opengis.net"
+    "ows_keywordlist" "ogc,wms,mapserver"
+    "ows_service_onlineresource" "http://www.mapserver.org/"
+    "ows_fees" "None"
+    "ows_accessconstraints" "None"
+    "ows_addresstype" "postal"
+    "ows_address"     "123 SomeRoad Road"
+    "ows_city" "Toronto"
+    "ows_stateorprovince" "Ontario"
+    "ows_postcode" "xxx-xxx"
+    "ows_country" "Canada"
+    "ows_contactelectronicmailaddress" "tomkralidis@xxxxxxx.xxx"
+    "ows_contactvoicetelephone" "+xx-xxx-xxx-xxxx"
+    "ows_contactfacsimiletelephone" "+xx-xxx-xxx-xxxx"
+    "ows_contactperson" "Tom Kralidis"
+    "ows_contactorganization" "MapServer"
+    "ows_contactposition" "self"
+
+    "ows_rootlayer_title" "My Layers"
+    "ows_rootlayer_abstract" "These are my layers"
+    "ows_rootlayer_keywordlist" "layers,list"
+    "ows_layerlimit" "1"
+    "ows_enable_request" "*"
+
+    "wms_getmap_formatlist" "image/png,image/png; mode=24bit,image/jpeg,image/gif,image/png; mode=8bit,image/tiff"
+    "wms_getfeatureinfo_formatlist" "application/vnd.ogc.gml,OTHER_GFI_RESULT"
+
+    "wms_compliance_mode" "true"
+  END
+END
+
+PROJECTION
+  "init=epsg:4326"
+  #"init=./data/epsg2:42304"
+END
+
+
+#
+# Start of layer definitions
+#
+
+LAYER
+  NAME road
+  DATA road
+  TEMPLATE "ttt"
+  METADATA
+    "wms_title"       "road"
+    "wms_description" "Roads of I.P.E."
+    "wms_srs" "EPSG:43204"
+    "gml_include_items" "all"
+  END
+  TYPE LINE
+  STATUS ON
+  PROJECTION
+    "init=./data/epsg2:42304"
+  END
+
+  CLASSITEM "Name_e"
+  CLASS
+    NAME "Roads"
+    STYLE
+        SYMBOL 0 
+        COLOR 220 0 0
+    END
+  END
+END # Layer
+
+END # Map File
diff --git a/src/mapwms.cpp b/src/mapwms.cpp
index d054557b7d..19a19dbe21 100644
--- a/src/mapwms.cpp
+++ b/src/mapwms.cpp
@@ -977,12 +977,26 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion, char **names,
 
   const char *filter = NULL;
 
+  const char *compliance_mode_str = NULL;
+  bool compliance_mode = false;
+
   /* Some of the getMap parameters are actually required depending on the */
   /* request, but for now we assume all are optional and the map file */
   /* defaults will apply. */
 
   msAdjustExtent(&(map->extent), map->width, map->height);
 
+  /*
+    Check if we need strict checks for standard compliance.
+    Defaults to false.
+    So far only used for TRANSPARENT parameter value, but we will eventually
+    need this more often.
+  */
+  compliance_mode_str =
+      msOWSLookupMetadata(&(map->web.metadata), "MO", "compliance_mode");
+  compliance_mode = (compliance_mode_str != NULL) &&
+                    (strcasecmp(compliance_mode_str, "true") == 0);
+
   /*
     Check for SLDs first. If SLD is available LAYERS and STYLES parameters are
     non mandatory
@@ -1288,7 +1302,18 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion, char **names,
       msFree(map->imagetype);
       map->imagetype = msStrdup(values[i]);
     } else if (strcasecmp(names[i], "TRANSPARENT") == 0) {
-      transparent = (strcasecmp(values[i], "TRUE") == 0);
+      if (compliance_mode) {
+        transparent = (strcmp(values[i], "TRUE") == 0);
+        if ((!transparent) && (strcmp(values[i], "FALSE") != 0)) {
+          msSetErrorWithStatus(
+              MS_WMSERR, MS_HTTP_400_BAD_REQUEST,
+              "Value for TRANSPARENT must be either TRUE or FALSE.",
+              "msWMSLoadGetMapParams()");
+          return msWMSException(map, nVersion, NULL, wms_exception_format);
+        }
+      } else {
+        transparent = (strcasecmp(values[i], "TRUE") == 0);
+      }
     } else if (strcasecmp(names[i], "BGCOLOR") == 0) {
       long c;
       c = strtol(values[i], NULL, 16);


Reviews:
user: login: jratike80
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-15T13:32:24Z
user: login: tschorr
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T13:55:22Z
user: login: jratike80
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-15T14:08:35Z
user: login: geographika
body: Very nice addition - thanks @tschorr 
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-17T08:34:05Z

Review comments:
diff_hunk: @@ -1289,6 +1289,13 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion, char **names,
       map->imagetype = msStrdup(values[i]);
     } else if (strcasecmp(names[i], "TRANSPARENT") == 0) {
       transparent = (strcasecmp(values[i], "TRUE") == 0);
+      if ((!transparent) && (strcasecmp(values[i], "FALSE") != 0)) {
path: src/mapwms.cpp
user: login: jratike80
body: By the WMS standard, using strcasecmp for the value is WRONG. Or am I right that it ignores case in comparison? Accepted values are `TRUE` of `FALSE`. I hope that the INSPIRE validator does not check that, though. But are you willing to sell your soul and break the standard, just a little bit?
created_at: 2025-05-15T13:32:24Z
author_association: NONE
diff_hunk: @@ -1289,6 +1289,13 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion, char **names,
       map->imagetype = msStrdup(values[i]);
     } else if (strcasecmp(names[i], "TRANSPARENT") == 0) {
       transparent = (strcasecmp(values[i], "TRUE") == 0);
+      if ((!transparent) && (strcasecmp(values[i], "FALSE") != 0)) {
path: src/mapwms.cpp
user: login: tschorr
body: There's this statement in section 6.8.1: "Parameter names shall not be case sensitive, but parameter values shall be.". BUT there's also section 6.5 on boolean values having lowercase "true" and "false" (and also allows 1 and 0, not currently checked by MapServer at all). So yes it is confusing.

In any case the INSPIRE validator does not check that (yet).
created_at: 2025-05-15T13:55:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1289,6 +1289,13 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion, char **names,
       map->imagetype = msStrdup(values[i]);
     } else if (strcasecmp(names[i], "TRANSPARENT") == 0) {
       transparent = (strcasecmp(values[i], "TRUE") == 0);
+      if ((!transparent) && (strcasecmp(values[i], "FALSE") != 0)) {
path: src/mapwms.cpp
user: login: jratike80
body: That boolean values section deals with other things. The GetMap parameters are defined in Table 8 — The Parameters of a GetMap request `TRANSPARENT=TRUE|FALSE`.
For my mind not checking the case is a good thing, but accepting `&TRANSPARENT=true` is undoubtedly against the WMS standard.
created_at: 2025-05-15T14:08:35Z
author_association: NONE

PR comments:
user: login: jratike80
created_at: 2025-05-15T06:59:06Z
body: That it true by the standard, even so that only upper case TRUE or FALSE are allowed.
It seems that Geoserver accepts `&TRANSPARENT=FOO` and sends a map. Geoserver can be run in a special CITE compliant mode, maybe those who use Geoserver for INSPIRE are using that mode.

Corresponding discussion at https://github.com/INSPIRE-MIF/helpdesk-validator/issues/171
author_association: NONE
user: login: tschorr
created_at: 2025-05-15T09:54:42Z
body: The 2 failing checks seem unrelated, at least I cannot find any failing WMS requests in the logs.
author_association: CONTRIBUTOR
user: login: jratike80
created_at: 2025-05-15T10:30:28Z
body: Are you sure that your change does not break any existing applications?  It may be a surprise if someone has been sending &TRANSPARENT=NO for years and then after the next upgrade the application stops working.

The change is correct, the standard requires TRUE|FALSE, but the only real advantage that the change gives is that the INSPIRE validator gets happy. From users perspective things work correctly already. TRUE gives maps with transparency, FALSE gives maps without transparency, the default without &TRANSPARENT= means no transparency.
The OGC test suite does not test this thing and therefore MapServer WMS 1.3.0 is certified https://portal.ogc.org/public_ogc/compliance/product.php?pid=1083

See https://cite.ogc.org/teamengine/about/wms-client/1.3.0/site/

> Capabilities not tested
> GetMap request for transparent picture [7.3.3.9]
> 

The best option would be if INSPIRE validator would test only &TRANSPARENT=TRUE and &TRANSPARENT=FALSE.  Unfortunately by the discussion on that old, closed issue I believe that INSPIRE validator remains strict. The second best option might be to make the strict TRUE|FALSE configurable and default to current behavior but that would require more work and is something that Mapserver normally does not support.

The Geoserver way is to run the tests with special settings
<img width="121" alt="image" src="https://github.com/user-attachments/assets/28cbb99f-d61d-4d4a-a9d7-4f9704de6fdd" />
and then let the server admins to decide if they really want to run the production servers with the strict rules or with more forgiving ones.

author_association: NONE
user: login: tschorr
created_at: 2025-05-15T11:59:10Z
body: > Are you sure that your change does not break any existing applications? It may be a surprise if someone has been sending &TRANSPARENT=NO for years and then after the next upgrade the application stops working.

Quite on the contrary I'm sure my changes definitely *will* break existing applications that are sending wrong parameter values for TRANSPARENT. But I assume this could be dealt with with a sensible release policy and mentioning in the release notes.

 > The change is correct, the standard requires TRUE|FALSE, but the only real advantage that the change gives is that the INSPIRE validator gets happy. From users perspective things work correctly already. 
 
The current behaviour doesn't conform to the standard, so I'd say it doesn't work correctly. I can see how this just works fine for many people, although one could argue that e.g. your example from above might lead people into thinking &TRANSPARENT=YES will actually work...

> TRUE gives maps with transparency, FALSE gives maps without transparency, the default without &TRANSPARENT= means no transparency. The OGC test suite does not test this thing and therefore MapServer WMS 1.3.0 is certified https://portal.ogc.org/public_ogc/compliance/product.php?pid=1083
> 
> See https://cite.ogc.org/teamengine/about/wms-client/1.3.0/site/
> 
> > Capabilities not tested
> > GetMap request for transparent picture [7.3.3.9]
> 
> The best option would be if INSPIRE validator would test only &TRANSPARENT=TRUE and &TRANSPARENT=FALSE. Unfortunately by the discussion on that old, closed issue I believe that INSPIRE validator remains strict.

There's maybe missing a link here - what old closed issue are you referring to? But apart from that, the INSPIRE check might be overdoing things a bit but on the whole it is a valid test.

> The second best option might be to make the strict TRUE|FALSE configurable and default to current behavior but that would require more work and is something that Mapserver normally does not support.

I agree this would require more work and most likely would need an RFC to start with. Here I'm proposing a fix for the problem at hand. For others to decide whether this PR will be accepted.
author_association: CONTRIBUTOR
user: login: jmckenna
created_at: 2025-05-15T12:18:58Z
body: @tschorr please also include a test for this, as part of your pull request, in /[msautotest ](https://mapserver.org/development/tests/autotest.html) 
author_association: MEMBER
user: login: geographika
created_at: 2025-05-15T12:30:11Z
body: @tschorr thanks for raising this. 

For the OGC Features API compliancy, an additional METADATA item was added, that allowed users to run a Mapfile in a compliant mode. That would be my preference in this case too (with the default set to `false`). 

```
      "oga_compliance_mode" "true"
```

The implementation could work the same way. See https://github.com/MapServer/MapServer/blob/d54aae0311066e116974ef888b82959bcefb8c24/src/mapogcapi.cpp#L1306

The failing CI is likely due to https://github.com/MapServer/MapServer/issues/7279

I'd be very much in favour of adding in a compliant WMS mode, with a test. 

```
  WEB
    METADATA
      ...
      "wms_compliance_mode" "true"
    END
  END
```

author_association: MEMBER
user: login: tschorr
created_at: 2025-05-15T12:41:27Z
body: > ```
>       "oga_compliance_mode" "true"
> ```
> 
> ```
>   WEB
>     METADATA
>       ...
>       "wms_compliance_mode" "true"
>     END
>   END
> ```

Do we want to restrict this to WMS? What about having an "ogc_compliance_mode"?
author_association: CONTRIBUTOR
user: login: tschorr
created_at: 2025-05-15T12:42:52Z
body: > > ```
> >       "oga_compliance_mode" "true"
> > ```
> > 
> > 
> >     
> >       
> >     
> > 
> >       
> >     
> > 
> >     
> >   
> > ```
> >   WEB
> >     METADATA
> >       ...
> >       "wms_compliance_mode" "true"
> >     END
> >   END
> > ```
> 
> Do we want to restrict this to WMS? What about having an "ogc_compliance_mode"?

or rather 'ows_compliance_mode' maybe.
author_association: CONTRIBUTOR
user: login: geographika
created_at: 2025-05-15T12:47:34Z
body: > or rather 'ows_compliance_mode' maybe.

Yes - the way it works when looking up metadata is the check would be first made for "wms_compliance_mode" and if missing then "ows_compliance_mode". 
"ows_compliance_mode" could then be set once in the Mapfile to apply to WFS, WMS, WCS etc. 


author_association: MEMBER
user: login: jratike80
created_at: 2025-05-15T13:06:00Z
body: > There's maybe missing a link here - what old closed issue are you referring to?

I meants this link from my previous comment https://github.com/INSPIRE-MIF/helpdesk-validator/issues/171

> Quite on the contrary I'm sure my changes definitely will break existing applications that are sending wrong parameter values for TRANSPARENT. But I assume this could be dealt with with a sensible release policy and mentioning in the release notes.

Such release policy is ok when we have security fixes and real improvements which are backwards incompatible, but implementing the fixes into client applications pays money, and in this case the change is cosmetic. Money for nothing, I would say.

For comparison, we have made a similar change when we started to require `&STYLES=` in Mapserver 8 because it is mandatory. This fails nowadays with an error message:

https://demo.mapserver.org/cgi-bin/msautotest?SERVICE=wms&VERSION=1.3.0&REQUEST=GetMap&LAYERS=world_latlong&FORMAT=image/jpeg&BBOX=-90,-180,90,180&WIDTH=720&HEIGHT=360&CRS=EPSG:4326

```
<ServiceException code="MissingParameterValue"> msWMSLoadGetMapParams(): WMS server error. Missing required parameter STYLES. Note to service administrators: defining the "wms_allow_getmap_without_styles" "true" MAP.WEB.METADATA item will disable this check (backward compatibility with behavior of MapServer < 8.0) </ServiceException>
</ServiceExceptionReport
```

Set empty "STYLES" and request succeeds:

https://demo.mapserver.org/cgi-bin/msautotest?SERVICE=wms&VERSION=1.3.0&REQUEST=GetMap&LAYERS=world_latlong&FORMAT=image/jpeg&BBOX=-90,-180,90,180&WIDTH=720&HEIGHT=360&CRS=EPSG:4326&STYLES=

However, the request should yield an error because `&SERVICE=wms` is wrong. The WMS standard says:

> ...the SERVICE parameter of the request shall have the value “WMS” 
> ...
> Parameter names shall not be case sensitive, but parameter values shall be. 

The INSPIRE validator is nonchalant when it comes to this violation and I think it is good so.

+1 for `I'd be very much in favour of adding in a compliant WMS mode, with a test`


author_association: NONE
user: login: jmckenna
created_at: 2025-05-15T13:10:09Z
body: @jratike80 yes I was also thinking of the styles change from the MapServer 8.0 release.  But if we setup this "ows_compliance_mode" it might not need to wait until MapServer 9.0 (if we set the default to false).
author_association: MEMBER
user: login: tschorr
created_at: 2025-05-15T13:22:37Z
body: @jmckenna @jratike80 @geographika I've added a test. As for adding the `ows_compliance_mode`, I'm waiting a bit for the discussion to settle/more reactions/a decision before I continue :-)
author_association: CONTRIBUTOR
user: login: jmckenna
created_at: 2025-05-15T13:31:24Z
body: great, thanks @tschorr 
author_association: MEMBER
user: login: tschorr
created_at: 2025-05-16T09:37:40Z
body: @jmckenna @jratike80 @geographika I have implemented the `ows/wms_compliance_mode` check as proposed. For the strict checking case the TRANSPARENT parameter value also has to be all upper case now.
author_association: CONTRIBUTOR
user: login: geographika
created_at: 2025-05-17T08:38:41Z
body: @tschorr I'll try and get the CI updated to use the new version of GDAL so everything is passing again, and you can rebase this on top. 
Out of interest, are you testing MapServer against CITE tests? Getting WMS compliancy was on the development roadmap but has been stalled for some time now. 
author_association: MEMBER
user: login: tschorr
created_at: 2025-05-19T06:37:46Z
body: > Out of interest, are you testing MapServer against CITE tests? Getting WMS compliancy was on the development roadmap but has been stalled for some time now.

@geographika we are using our own installation of the [INSPIRE Reference validator](https://inspire.ec.europa.eu/validator/home/index.html) for testing a couple of WMS/WFS services. In theory this includes OGC WMS compliance testing but we are still evaluating our test setup. So far this issue is the only test failure we could attribute to MapServer.
author_association: CONTRIBUTOR
user: login: geographika
created_at: 2025-05-20T07:58:52Z
body: > @geographika we are using our own installation of the [INSPIRE Reference validator](https://inspire.ec.europa.eu/validator/home/index.html) for testing a couple of WMS/WFS services. In theory this includes OGC WMS compliance testing but we are still evaluating our test setup. So far this issue is the only test failure we could attribute to MapServer.

Thanks for the details. If you do run into any further test failures please open an issue (or a PR with a fix like this!). 
I have the fixed the CI, so if you rebase against main then the checks for this PR should then pass. 


author_association: MEMBER