Open-EO / openeo-opensearch-client

Simple opensearch client for openeo.
Apache License 2.0
0 stars 0 forks source link

unbounded number of requests towards CDSE catalog #28

Closed bossie closed 1 year ago

bossie commented 1 year ago

CDSE process graphs including the one from the integration tests started failing suddenly:


Traceback (most recent call last):   File "/opt/openeo/lib64/python3.8/site-packages/openeogeotrellis/deploy/batch_job.py", line 1278, in <module>     main(sys.argv)   File "/opt/openeo/lib64/python3.8/site-packages/openeogeotrellis/deploy/batch_job.py", line 1013, in main     run_driver()   File "/opt/openeo/lib64/python3.8/site-packages/openeogeotrellis/deploy/batch_job.py", line 984, in run_driver     run_job(   File "/opt/openeo/lib/python3.8/site-packages/openeogeotrellis/utils.py", line 54, in memory_logging_wrapper     return function(*args, **kwargs)   File "/opt/openeo/lib64/python3.8/site-packages/openeogeotrellis/deploy/batch_job.py", line 1077, in run_job     result = ProcessGraphDeserializer.evaluate(process_graph, env=env, do_dry_run=tracer)   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 348, in evaluate     result = convert_node(result_node, env=env)   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 368, in convert_node     process_result = apply_process(process_id=process_id, args=processGraph.get('arguments', {}),   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 1470, in apply_process     args = {name: convert_node(expr, env=env) for (name, expr) in sorted(args.items())}   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 1470, in <dictcomp>     args = {name: convert_node(expr, env=env) for (name, expr) in sorted(args.items())}   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 380, in convert_node     return convert_node(processGraph['node'], env=env)   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 368, in convert_node     process_result = apply_process(process_id=process_id, args=processGraph.get('arguments', {}),   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 1470, in apply_process     args = {name: convert_node(expr, env=env) for (name, expr) in sorted(args.items())}   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 1470, in <dictcomp>     args = {name: convert_node(expr, env=env) for (name, expr) in sorted(args.items())}   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 380, in convert_node     return convert_node(processGraph['node'], env=env)   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 368, in convert_node     process_result = apply_process(process_id=process_id, args=processGraph.get('arguments', {}),   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 1502, in apply_process     return process_function(args=ProcessArgs(args, process_id=process_id), env=env)   File "/opt/openeo/lib/python3.8/site-packages/openeo_driver/ProcessGraphDeserializer.py", line 546, in load_collection     return env.backend_implementation.catalog.load_collection(collection_id, load_params=load_params, env=env)   File "/opt/openeo/lib/python3.8/site-packages/openeo/util.py", line 393, in wrapper     return f(*args, **kwargs)   File "/opt/openeo/lib/python3.8/site-packages/openeogeotrellis/layercatalog.py", line 123, in load_collection     return self._load_collection_cached(collection_id, load_params, WhiteListEvalEnv(env,WHITELIST))   File "/opt/openeo/lib/python3.8/site-packages/openeogeotrellis/layercatalog.py", line 643, in _load_collection_cached     pyramid = s1_backscatter_orfeo.creodias(   File "/opt/openeo/lib/python3.8/site-packages/openeogeotrellis/collections/s1backscatter_orfeo.py", line 808, in creodias     feature_pyrdd, layer_metadata_py = self._build_feature_rdd(   File "/opt/openeo/lib/python3.8/site-packages/openeogeotrellis/collections/s1backscatter_orfeo.py", line 158, in _build_feature_rdd     feature_pyrdd, layer_metadata_sc = self._load_feature_rdd(   File "/opt/openeo/lib/python3.8/site-packages/openeogeotrellis/collections/s1backscatter_orfeo.py", line 117, in _load_feature_rdd     json_rdd = file_rdd_factory.loadSpatialFeatureJsonRDD(projected_polygons, from_date, to_date, zoom, tile_size,datacubeParams)   File "/usr/local/spark/python/lib/py4j-0.10.9.7-src.zip/py4j/java_gateway.py", line 1322, in __call__   File "/usr/local/spark/python/lib/py4j-0.10.9.7-src.zip/py4j/protocol.py", line 326, in get_return_value py4j.protocol.Py4JJavaError: An error occurred while calling o1565.loadSpatialFeatureJsonRDD. : java.lang.StackOverflowError         at java.base/java.security.AccessController.doPrivileged(Native Method)         at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1170)         at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1081)         at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:189)         at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1592)         at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520)         at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250)         at scalaj.http.HttpRequest.closeStreams(Http.scala:444)         at scalaj.http.HttpRequest.doConnection(Http.scala:370)         at scalaj.http.HttpRequest.exec(Http.scala:343)         at scalaj.http.HttpRequest.asString(Http.scala:492)         at org.openeo.opensearch.OpenSearchClient.$anonfun$execute$1(OpenSearchClient.scala:137)         at org.openeo.opensearch.package$.attempt$1(package.scala:42)
bossie commented 1 year ago

We're relying on the value of "itemsPerPage" in the response to determine whether we should request another page; looks like up until recently this was indeed the number of features in the page, whereas now it (probably correctly) corresponds to the maximum number of features in a page (= maxRecords param passed by the client):

{
  "type": "FeatureCollection",
  "properties": {
    "id": "b4df5ab2-00b1-57ea-b8b7-06114fd00b90",
    "totalResults": null,
    "exactCount": 0,
    "startIndex": 1,
    "itemsPerPage": 100,
    "query": {
      "originalFilters": {
        "box": "3.7496741657535795,51.28966910932136,3.8003477052967813,51.310330842158784",
        "status": "ONLINE",
        "dataset": "ESA-DATASET",
        "processingLevel": "LEVEL1",
        "productType": "IW_GRDH_1S-COG",
        "startDate": "2017-03-05T00:00:00Z",
        "completionDate": "2017-03-10T00:00:00Z",
        "collection": "SENTINEL-1"
      },
      "appliedFilters": {
        "box": "3.7496741657535795,51.28966910932136,3.8003477052967813,51.310330842158784",
        "status": "ONLINE",
        "dataset": "ESA-DATASET",
        "processingLevel": "LEVEL1",
        "productType": "IW_GRDH_1S-COG",
        "startDate": "2017-03-05T00:00:00Z",
        "completionDate": "2017-03-10T00:00:00Z",
        "collection": "SENTINEL-1"
      },
      "processingTime": 0.14925187
    },
    "links": [
      {
        "rel": "self",
        "type": "application/json",
        "title": "self",
        "href": "https://catalogue.dataspace.copernicus.eu/resto/api/collections/Sentinel1/search.json?box=3.7496741657535795,51.28966910932136,3.8003477052967813,51.310330842158784&sortParam=startDate&sortOrder=ascending&page=1&maxRecords=100&status=ONLINE&dataset=ESA-DATASET&processingLevel=LEVEL1&productType=IW_GRDH_1S-COG&startDate=2017-03-05T00:00:00Z&completionDate=2017-03-10T00:00:00Z"
      },
      {
        "rel": "search",
        "type": "application/opensearchdescription+xml",
        "title": "OpenSearch Description Document",
        "href": "https://catalogue.dataspace.copernicus.eu/resto/api/collections/Sentinel1/describe.xml"
      }
    ]
  },
  "features": [
    {
      "type": "Feature",
      "id": "c54540d4-c41c-46f3-851b-d528f398abb4",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              176.346802,
              52.884926
            ],
            [
              -179.948532,
              53.28022
            ],
            [
              -179.418274,
              51.167206
            ],
            [
              177.046661,
              50.775261
            ],
            [
              176.346802,
              52.884926
            ]
          ]
        ]
      },
      "properties": {
        "collection": "SENTINEL-1",
        "status": "ONLINE",
        "license": {
          "licenseId": "unlicensed",
          "hasToBeSigned": "never",
          "grantedCountries": null,
          "grantedOrganizationCountries": null,
          "grantedFlags": null,
          "viewService": "public",
          "signatureQuota": -1,
          "description": {
            "shortName": "No license"
          }
        },
        "productIdentifier": "/eodata/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/05/S1A_IW_GRDH_1SSV_20170305T055325_20170305T055400_015553_0198FA_C97D_COG.SAFE",
        "parentIdentifier": null,
        "title": "S1A_IW_GRDH_1SSV_20170305T055325_20170305T055400_015553_0198FA_C97D_COG.SAFE",
        "description": "The Sentinel-1 mission is the European Radar Observatory for the Copernicus joint initiative of the European Commission (EC) and the European Space Agency (ESA). The Sentinel-1 mission includes C-band imaging operating in four exclusive imaging modes with different resolution (down to 5 m) and coverage (up to 400 km). It provides dual polarization capability, short revisit times and rapid product delivery. Additionally, precise measurements of spacecraft position and attitude are available for every observation [https://dataspace.copernicus.eu/explore-data/data-collections/sentinel-data/sentinel-1].",
        "organisationName": null,
        "startDate": "2017-03-05T05:53:25.049Z",
        "completionDate": "2017-03-05T05:54:00.379Z",
        "productType": "IW_GRDH_1S-COG",
        "processingLevel": "LEVEL1",
        "platform": "S1A",
        "instrument": "SAR",
        "resolution": 0,
        "sensorMode": "IW",
        "orbitNumber": 15553,
        "quicklook": null,
        "thumbnail": "https://catalogue.dataspace.copernicus.eu/get-object?path=/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/05/S1A_IW_GRDH_1SSV_20170305T055325_20170305T055400_015553_0198FA_C97D_COG.SAFE/preview/thumbnail.png",
        "updated": "2023-05-17T11:27:24.873Z",
        "published": "2023-05-17T11:27:24.873Z",
        "snowCover": 0,
        "cloudCover": 0,
        "gmlgeometry": "<gml:Polygon srsName=\"EPSG:4326\"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>176.346802,52.884926 -179.948532,53.28022 -179.418274,51.167206 177.046661,50.775261 176.346802,52.884926</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>",
        "centroid": {
          "type": "Point",
          "coordinates": [
            -1.54306954860383,
            52.026873966941
          ]
        },
        "orbitDirection": "ASCENDING",
        "timeliness": "Fast-24h",
        "relativeOrbitNumber": 81,
        "processingBaseline": 0,
        "polarisation": "VV",
        "swath": "IW",
        "services": {
          "download": {
            "url": "https://catalogue.dataspace.copernicus.eu/download/c54540d4-c41c-46f3-851b-d528f398abb4",
            "mimeType": "application/octet-stream",
            "size": 760131231
          }
        },
        "links": [
          {
            "rel": "self",
            "type": "application/json",
            "title": "GeoJSON link for c54540d4-c41c-46f3-851b-d528f398abb4",
            "href": "https://catalogue.dataspace.copernicus.eu/resto/collections/SENTINEL-1/c54540d4-c41c-46f3-851b-d528f398abb4.json"
          }
        ]
      }
    },
    {
      "type": "Feature",
      "id": "c3c9964f-d0bb-4b77-b8b1-fcbccbd0dd05",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              178.642426,
              52.181767
            ],
            [
              -177.711365,
              52.575821
            ],
            [
              -177.26889,
              50.792316
            ],
            [
              179.223633,
              50.400803
            ],
            [
              178.642426,
              52.181767
            ]
          ]
        ]
      },
      "properties": {
        "collection": "SENTINEL-1",
        "status": "ONLINE",
        "license": {
          "licenseId": "unlicensed",
          "hasToBeSigned": "never",
          "grantedCountries": null,
          "grantedOrganizationCountries": null,
          "grantedFlags": null,
          "viewService": "public",
          "signatureQuota": -1,
          "description": {
            "shortName": "No license"
          }
        },
        "productIdentifier": "/eodata/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/06/S1B_IW_GRDH_1SDV_20170306T054423_20170306T054452_004584_007FD6_FE04_COG.SAFE",
        "parentIdentifier": null,
        "title": "S1B_IW_GRDH_1SDV_20170306T054423_20170306T054452_004584_007FD6_FE04_COG.SAFE",
        "description": "The Sentinel-1 mission is the European Radar Observatory for the Copernicus joint initiative of the European Commission (EC) and the European Space Agency (ESA). The Sentinel-1 mission includes C-band imaging operating in four exclusive imaging modes with different resolution (down to 5 m) and coverage (up to 400 km). It provides dual polarization capability, short revisit times and rapid product delivery. Additionally, precise measurements of spacecraft position and attitude are available for every observation [https://dataspace.copernicus.eu/explore-data/data-collections/sentinel-data/sentinel-1].",
        "organisationName": null,
        "startDate": "2017-03-06T05:44:23.124Z",
        "completionDate": "2017-03-06T05:44:52.938Z",
        "productType": "IW_GRDH_1S-COG",
        "processingLevel": "LEVEL1",
        "platform": "S1A",
        "instrument": "SAR",
        "resolution": 0,
        "sensorMode": "IW",
        "orbitNumber": 4584,
        "quicklook": null,
        "thumbnail": "https://catalogue.dataspace.copernicus.eu/get-object?path=/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/06/S1B_IW_GRDH_1SDV_20170306T054423_20170306T054452_004584_007FD6_FE04_COG.SAFE/preview/thumbnail.png",
        "updated": "2023-05-17T11:28:38.948Z",
        "published": "2023-05-17T11:28:38.948Z",
        "snowCover": 0,
        "cloudCover": 0,
        "gmlgeometry": "<gml:Polygon srsName=\"EPSG:4326\"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>178.642426,52.181767 -177.711365,52.575821 -177.26889,50.792316 179.223633,50.400803 178.642426,52.181767</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>",
        "centroid": {
          "type": "Point",
          "coordinates": [
            0.67655839416745,
            51.4876681093702
          ]
        },
        "orbitDirection": "ASCENDING",
        "timeliness": "Fast-24h",
        "relativeOrbitNumber": 8,
        "processingBaseline": 0,
        "polarisation": "VV&VH",
        "swath": "IW",
        "services": {
          "download": {
            "url": "https://catalogue.dataspace.copernicus.eu/download/c3c9964f-d0bb-4b77-b8b1-fcbccbd0dd05",
            "mimeType": "application/octet-stream",
            "size": 1091363144
          }
        },
        "links": [
          {
            "rel": "self",
            "type": "application/json",
            "title": "GeoJSON link for c3c9964f-d0bb-4b77-b8b1-fcbccbd0dd05",
            "href": "https://catalogue.dataspace.copernicus.eu/resto/collections/SENTINEL-1/c3c9964f-d0bb-4b77-b8b1-fcbccbd0dd05.json"
          }
        ]
      }
    },
    {
      "type": "Feature",
      "id": "bd98263f-606e-4fc4-97b8-1416b38154ef",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              5.046123,
              49.674469
            ],
            [
              1.418298,
              50.084042
            ],
            [
              1.783734,
              51.579407
            ],
            [
              5.527987,
              51.167858
            ],
            [
              5.046123,
              49.674469
            ]
          ]
        ]
      },
      "properties": {
        "collection": "SENTINEL-1",
        "status": "ONLINE",
        "license": {
          "licenseId": "unlicensed",
          "hasToBeSigned": "never",
          "grantedCountries": null,
          "grantedOrganizationCountries": null,
          "grantedFlags": null,
          "viewService": "public",
          "signatureQuota": -1,
          "description": {
            "shortName": "No license"
          }
        },
        "productIdentifier": "/eodata/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/07/S1A_IW_GRDH_1SDV_20170307T055827_20170307T055852_015582_0199DD_092E_COG.SAFE",
        "parentIdentifier": null,
        "title": "S1A_IW_GRDH_1SDV_20170307T055827_20170307T055852_015582_0199DD_092E_COG.SAFE",
        "description": "The Sentinel-1 mission is the European Radar Observatory for the Copernicus joint initiative of the European Commission (EC) and the European Space Agency (ESA). The Sentinel-1 mission includes C-band imaging operating in four exclusive imaging modes with different resolution (down to 5 m) and coverage (up to 400 km). It provides dual polarization capability, short revisit times and rapid product delivery. Additionally, precise measurements of spacecraft position and attitude are available for every observation [https://dataspace.copernicus.eu/explore-data/data-collections/sentinel-data/sentinel-1].",
        "organisationName": null,
        "startDate": "2017-03-07T05:58:27.150Z",
        "completionDate": "2017-03-07T05:58:52.149Z",
        "productType": "IW_GRDH_1S-COG",
        "processingLevel": "LEVEL1",
        "platform": "S1A",
        "instrument": "SAR",
        "resolution": 0,
        "sensorMode": "IW",
        "orbitNumber": 15582,
        "quicklook": null,
        "thumbnail": "https://catalogue.dataspace.copernicus.eu/get-object?path=/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/07/S1A_IW_GRDH_1SDV_20170307T055827_20170307T055852_015582_0199DD_092E_COG.SAFE/preview/thumbnail.png",
        "updated": "2023-05-17T11:29:33.173Z",
        "published": "2023-05-17T11:29:33.173Z",
        "snowCover": 0,
        "cloudCover": 0,
        "gmlgeometry": "<gml:Polygon srsName=\"EPSG:4326\"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>5.046123,49.674469 1.418298,50.084042 1.783734,51.579407 5.527987,51.167858 5.046123,49.674469</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>",
        "centroid": {
          "type": "Point",
          "coordinates": [
            3.44731195543216,
            50.6300314606846
          ]
        },
        "orbitDirection": "DESCENDING",
        "timeliness": "Fast-24h",
        "relativeOrbitNumber": 110,
        "processingBaseline": 0,
        "polarisation": "VV&VH",
        "swath": "IW",
        "services": {
          "download": {
            "url": "https://catalogue.dataspace.copernicus.eu/download/bd98263f-606e-4fc4-97b8-1416b38154ef",
            "mimeType": "application/octet-stream",
            "size": 1233251317
          }
        },
        "links": [
          {
            "rel": "self",
            "type": "application/json",
            "title": "GeoJSON link for bd98263f-606e-4fc4-97b8-1416b38154ef",
            "href": "https://catalogue.dataspace.copernicus.eu/resto/collections/SENTINEL-1/bd98263f-606e-4fc4-97b8-1416b38154ef.json"
          }
        ]
      }
    },
    {
      "type": "Feature",
      "id": "42d8671b-8395-4af5-9e89-d53bc9699484",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              7.238886,
              50.045876
            ],
            [
              3.550875,
              50.459496
            ],
            [
              3.923542,
              51.954117
            ],
            [
              7.731516,
              51.538158
            ],
            [
              7.238886,
              50.045876
            ]
          ]
        ]
      },
      "properties": {
        "collection": "SENTINEL-1",
        "status": "ONLINE",
        "license": {
          "licenseId": "unlicensed",
          "hasToBeSigned": "never",
          "grantedCountries": null,
          "grantedOrganizationCountries": null,
          "grantedFlags": null,
          "viewService": "public",
          "signatureQuota": -1,
          "description": {
            "shortName": "No license"
          }
        },
        "productIdentifier": "/eodata/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/08/S1B_IW_GRDH_1SDV_20170308T054925_20170308T054950_004613_0080A8_E008_COG.SAFE",
        "parentIdentifier": null,
        "title": "S1B_IW_GRDH_1SDV_20170308T054925_20170308T054950_004613_0080A8_E008_COG.SAFE",
        "description": "The Sentinel-1 mission is the European Radar Observatory for the Copernicus joint initiative of the European Commission (EC) and the European Space Agency (ESA). The Sentinel-1 mission includes C-band imaging operating in four exclusive imaging modes with different resolution (down to 5 m) and coverage (up to 400 km). It provides dual polarization capability, short revisit times and rapid product delivery. Additionally, precise measurements of spacecraft position and attitude are available for every observation [https://dataspace.copernicus.eu/explore-data/data-collections/sentinel-data/sentinel-1].",
        "organisationName": null,
        "startDate": "2017-03-08T05:49:25.228Z",
        "completionDate": "2017-03-08T05:49:50.226Z",
        "productType": "IW_GRDH_1S-COG",
        "processingLevel": "LEVEL1",
        "platform": "S1A",
        "instrument": "SAR",
        "resolution": 0,
        "sensorMode": "IW",
        "orbitNumber": 4613,
        "quicklook": null,
        "thumbnail": "https://catalogue.dataspace.copernicus.eu/get-object?path=/Sentinel-1/SAR/IW_GRDH_1S-COG/2017/03/08/S1B_IW_GRDH_1SDV_20170308T054925_20170308T054950_004613_0080A8_E008_COG.SAFE/preview/thumbnail.png",
        "updated": "2023-05-17T11:30:30.722Z",
        "published": "2023-05-17T11:30:30.722Z",
        "snowCover": 0,
        "cloudCover": 0,
        "gmlgeometry": "<gml:Polygon srsName=\"EPSG:4326\"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>7.238886,50.045876 3.550875,50.459496 3.923542,51.954117 7.731516,51.538158 7.238886,50.045876</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>",
        "centroid": {
          "type": "Point",
          "coordinates": [
            5.6145455179921,
            51.0030479699523
          ]
        },
        "orbitDirection": "DESCENDING",
        "timeliness": "Fast-24h",
        "relativeOrbitNumber": 37,
        "processingBaseline": 0,
        "polarisation": "VV&VH",
        "swath": "IW",
        "services": {
          "download": {
            "url": "https://catalogue.dataspace.copernicus.eu/download/42d8671b-8395-4af5-9e89-d53bc9699484",
            "mimeType": "application/octet-stream",
            "size": 1272416835
          }
        },
        "links": [
          {
            "rel": "self",
            "type": "application/json",
            "title": "GeoJSON link for 42d8671b-8395-4af5-9e89-d53bc9699484",
            "href": "https://catalogue.dataspace.copernicus.eu/resto/collections/SENTINEL-1/42d8671b-8395-4af5-9e89-d53bc9699484.json"
          }
        ]
      }
    }
  ]
}
bossie commented 1 year ago

Fixed by looking at the actual number of features in the response instead (also for OSCARS; STAC was fixed some time ago).

Note that other properties like totalResults (null instead of 4) and exactCount (used to be a boolean) are b0rked as well: changes