From 6347beba3fc00dd72523c5f7831020552bc9414f Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Tue, 9 Dec 2025 13:53:02 -0900 Subject: [PATCH 1/9] pull token from request headers instead of token keyword --- src/SearchAPI/application/asf_opts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SearchAPI/application/asf_opts.py b/src/SearchAPI/application/asf_opts.py index ccf7313..56a095d 100644 --- a/src/SearchAPI/application/asf_opts.py +++ b/src/SearchAPI/application/asf_opts.py @@ -167,7 +167,7 @@ async def process_search_request(request: Request, is_baseline: bool = False) -> if (token := merged_args.get('cmr_token')): session = SearchAPISession() - session.headers.update({'Authorization': 'Bearer {0}'.format(token)}) + session.headers.update({'Authorization': request.headers.get('Authorization')}) query_opts.session = session output = merged_args.get('output', 'metalink') From 82b9dc244139060f83a8306126e095ed24a4cca2 Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Tue, 9 Dec 2025 14:18:22 -0900 Subject: [PATCH 2/9] fix: revert bearer token parsing change --- src/SearchAPI/application/asf_opts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SearchAPI/application/asf_opts.py b/src/SearchAPI/application/asf_opts.py index 56a095d..ccf7313 100644 --- a/src/SearchAPI/application/asf_opts.py +++ b/src/SearchAPI/application/asf_opts.py @@ -167,7 +167,7 @@ async def process_search_request(request: Request, is_baseline: bool = False) -> if (token := merged_args.get('cmr_token')): session = SearchAPISession() - session.headers.update({'Authorization': request.headers.get('Authorization')}) + session.headers.update({'Authorization': 'Bearer {0}'.format(token)}) query_opts.session = session output = merged_args.get('output', 'metalink') From 2f369469968da749ecbfea720b658133dc994d10 Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Wed, 10 Dec 2025 14:06:31 -0900 Subject: [PATCH 3/9] feature: add kml_footprint endpoint --- src/SearchAPI/application/application.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/SearchAPI/application/application.py b/src/SearchAPI/application/application.py index 8116389..780bc51 100644 --- a/src/SearchAPI/application/application.py +++ b/src/SearchAPI/application/application.py @@ -1,3 +1,4 @@ +from typing import Optional from copy import copy import json @@ -226,6 +227,26 @@ async def file_to_wkt(files: list[UploadFile]): headers=constants.DEFAULT_HEADERS ) +@router.get('/services/utils/kml_footprint') +async def kml_to_footprint(request: Request, granule: str, maturity: str = 'prod'): + config = load_config_maturity(maturity=maturity) + + query_opts = asf.ASFSearchOptions(granule_list=[granule]) + if (auth:=request.headers.get('authorization')) is not None: + session = SearchAPISession() + session.headers.update({'Authorization': auth}) + query_opts.session = session + + + query_opts.host = config['cmr_base'] + + results = asf.search(opts=query_opts, dataset=asf.DATASET.NISAR) + + kml_file = results.find_urls(extension='.kml')[0] + + kml_response = query_opts.session.get(kml_file) + return kml_response.text + # example: https://api.daac.asf.alaska.edu/services/redirect/NISAR_L2_STATIC/{granule_id}.h5 # @router.get('/services/redirect/{short_name}/{granule_id}') # async def nisar_static_layer(short_name: str, granule_id: str): From 19c754843829503f3d5aa7fa22633e42136586d2 Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Wed, 10 Dec 2025 14:41:19 -0900 Subject: [PATCH 4/9] fix: revert auth header parsing. Requires stricter allowed domains for CORs --- src/SearchAPI/application/application.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SearchAPI/application/application.py b/src/SearchAPI/application/application.py index 780bc51..e70b988 100644 --- a/src/SearchAPI/application/application.py +++ b/src/SearchAPI/application/application.py @@ -228,13 +228,13 @@ async def file_to_wkt(files: list[UploadFile]): ) @router.get('/services/utils/kml_footprint') -async def kml_to_footprint(request: Request, granule: str, maturity: str = 'prod'): +async def kml_to_footprint(granule: str, cmr_token: Optional[str] = None, maturity: str = 'prod'): config = load_config_maturity(maturity=maturity) query_opts = asf.ASFSearchOptions(granule_list=[granule]) - if (auth:=request.headers.get('authorization')) is not None: + if (cmr_token) is not None: session = SearchAPISession() - session.headers.update({'Authorization': auth}) + session.headers.update({'Authorization': f'Bearer {cmr_token}'}) query_opts.session = session From b7b51de368b17897e12a6710f42eacada530251b Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Wed, 10 Dec 2025 15:42:24 -0900 Subject: [PATCH 5/9] feat: l1 browses swapped with l2 also projected with kml --- src/SearchAPI/application/application.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SearchAPI/application/application.py b/src/SearchAPI/application/application.py index e70b988..794ac7f 100644 --- a/src/SearchAPI/application/application.py +++ b/src/SearchAPI/application/application.py @@ -245,7 +245,7 @@ async def kml_to_footprint(granule: str, cmr_token: Optional[str] = None, maturi kml_file = results.find_urls(extension='.kml')[0] kml_response = query_opts.session.get(kml_file) - return kml_response.text + return kml_response.text.strip('"') # example: https://api.daac.asf.alaska.edu/services/redirect/NISAR_L2_STATIC/{granule_id}.h5 # @router.get('/services/redirect/{short_name}/{granule_id}') From 143cbc9a696b1719ee8854d3c2a6c8ffd590a14a Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Wed, 10 Dec 2025 15:44:22 -0900 Subject: [PATCH 6/9] fix: proper response media type set for kml endpoint --- src/SearchAPI/application/application.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/SearchAPI/application/application.py b/src/SearchAPI/application/application.py index 794ac7f..a71cba7 100644 --- a/src/SearchAPI/application/application.py +++ b/src/SearchAPI/application/application.py @@ -245,7 +245,12 @@ async def kml_to_footprint(granule: str, cmr_token: Optional[str] = None, maturi kml_file = results.find_urls(extension='.kml')[0] kml_response = query_opts.session.get(kml_file) - return kml_response.text.strip('"') + return Response( + content=str(kml_response.text), + status_code=200, + media_type='text/html; charset=utf-8', + headers=constants.DEFAULT_HEADERS + ) # example: https://api.daac.asf.alaska.edu/services/redirect/NISAR_L2_STATIC/{granule_id}.h5 # @router.get('/services/redirect/{short_name}/{granule_id}') From fab36546191e906a3018b246cc6f96d8a19b053a Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Thu, 22 Jan 2026 15:05:37 -0900 Subject: [PATCH 7/9] req: bump asf-search in requirements --- CHANGELOG.md | 8 ++++++++ requirements.txt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f96ab80..a80915c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,14 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - --> +------ +## [1.0.11](https://github.com/asfadmin/Discovery-SearchAPI-v3/compare/v1.0.10...v1.0.11) +### Changed +- bump asf-search to v11.0.1 + - NISAR CRID field + - NISAR track number searchable with relativeOrbit, parsed from UMM + - remove `nisar_stuf` collection from NISAR dataset collections list (further removals pending) + ------ ## [1.0.10](https://github.com/asfadmin/Discovery-SearchAPI-v3/compare/v1.0.9...v1.0.10) ### Changed diff --git a/requirements.txt b/requirements.txt index 101f2ff..41420a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,7 +22,7 @@ ujson==5.7.0 uvicorn==0.21.1 watchfiles==0.19.0 -asf-search[asf-enumeration]==10.2.0 +asf-search[asf-enumeration]==11.0.1 python-json-logger==2.0.7 pyshp==2.1.3 From 9bdb0c57d240758929e8036282182fedd5658473 Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Thu, 22 Jan 2026 15:23:56 -0900 Subject: [PATCH 8/9] test: update/remove outdated seasat/aria test cases --- tests/yml_tests/test_URLs.yml | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/tests/yml_tests/test_URLs.yml b/tests/yml_tests/test_URLs.yml index 4ec019b..786aad0 100644 --- a/tests/yml_tests/test_URLs.yml +++ b/tests/yml_tests/test_URLs.yml @@ -190,8 +190,8 @@ tests: expected file: csv expected code: 200 -- beamSwath STD SS 100: - beamSwath: STD +- beamMode STD SS 100: + beamMode: STD platform: SEASAT maxresults: 100 output: csv @@ -468,7 +468,7 @@ tests: - groupid S1 Insar: groupid: S1-GUNW-D-R-087-tops-20190816_20190804-161614-19149N_17138N-PP-fee7-v2_0_2 - output: json + output: blank json expected file: json expected code: 200 @@ -2042,15 +2042,6 @@ tests: expected file: csv expected code: 200 -- processingLevel SEASAT: - processingLevel: L1,BROWSE,THUMBNAIL - platform: SEASAT - maxResults: 10 - output: csv - - expected file: csv - expected code: 200 - - processingLevel S1: processingLevel: METADATA_GRD,GRD_HS,GRD_HD,GRD_MS,GRD_MD,GRD_FS,GRD_FD,SLC,RAW,OCN,METADATA_RAW,METADATA,METADATA_SLC, THUMBNAIL platform: Sentinel-1A,Sentinel-1B @@ -2400,6 +2391,7 @@ tests: - start end 6monthago: start: 6+month+ago end: now + dataset: SENTINEL-1A maxResults: 10 output: csv @@ -2438,6 +2430,7 @@ tests: - start backwards reversed: start: now end: 1+year+ago + dataset: SENTINEL-1A output: csv maxResults: 10 @@ -2447,6 +2440,7 @@ tests: - start tomorrow reversed: start: tomorrow end: 1+year+ago + dataset: SENTINEL-1A output: csv maxResults: 10 From ba8af09cabfee6461c617a3880e514c0a9716633 Mon Sep 17 00:00:00 2001 From: SpicyGarlicAlbacoreRoll Date: Thu, 22 Jan 2026 15:38:35 -0900 Subject: [PATCH 9/9] test: further test case updates --- tests/yml_tests/test_URLs.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/yml_tests/test_URLs.yml b/tests/yml_tests/test_URLs.yml index 786aad0..a33ccf7 100644 --- a/tests/yml_tests/test_URLs.yml +++ b/tests/yml_tests/test_URLs.yml @@ -192,7 +192,7 @@ tests: - beamMode STD SS 100: beamMode: STD - platform: SEASAT + platform: "SEASAT 1" maxresults: 100 output: csv @@ -468,9 +468,9 @@ tests: - groupid S1 Insar: groupid: S1-GUNW-D-R-087-tops-20190816_20190804-161614-19149N_17138N-PP-fee7-v2_0_2 - output: blank json + output: json - expected file: json + expected file: blank json expected code: 200 - groupid SMAP: @@ -2391,7 +2391,7 @@ tests: - start end 6monthago: start: 6+month+ago end: now - dataset: SENTINEL-1A + dataset: SENTINEL-1 maxResults: 10 output: csv @@ -2430,7 +2430,7 @@ tests: - start backwards reversed: start: now end: 1+year+ago - dataset: SENTINEL-1A + dataset: SENTINEL-1 output: csv maxResults: 10 @@ -2440,7 +2440,7 @@ tests: - start tomorrow reversed: start: tomorrow end: 1+year+ago - dataset: SENTINEL-1A + dataset: SENTINEL-1 output: csv maxResults: 10