Skip to content

Commit b3910ef

Browse files
Merge pull request #39 from stac-utils/mah/fix_headers
Fix headers
2 parents d2a6387 + f034bad commit b3910ef

File tree

7 files changed

+3120
-13
lines changed

7 files changed

+3120
-13
lines changed

pystac_client/cli.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import sys
66

77
from .item_collection import ItemCollection
8-
98
from .client import Client
109
from .version import __version__
1110

@@ -14,11 +13,11 @@
1413
logger = logging.getLogger(__name__)
1514

1615

17-
def search(url=STAC_URL, matched=False, save=None, **kwargs):
16+
def search(url=STAC_URL, matched=False, save=None, headers=None, **kwargs):
1817
""" Main function for performing a search """
1918

2019
try:
21-
catalog = Client.open(url)
20+
catalog = Client.open(url, headers=headers)
2221
search = catalog.search(**kwargs)
2322

2423
if matched:
@@ -35,6 +34,7 @@ def search(url=STAC_URL, matched=False, save=None, **kwargs):
3534
except Exception as e:
3635
logger.error(e, exc_info=True)
3736
print(e)
37+
return 1
3838

3939

4040
def parse_args(args):
@@ -51,7 +51,7 @@ def parse_args(args):
5151
parent.add_argument('--url', help='Root Catalog URL', default=os.getenv('STAC_URL', None))
5252
parent.add_argument('--limit', help='Page size limit', type=int, default=500)
5353
parent.add_argument('--headers',
54-
help='Additional request headers (JSON file or string)',
54+
help='Additional request headers (JSON string or file)',
5555
default=None)
5656

5757
subparsers = parser0.add_subparsers(dest='command')
@@ -106,6 +106,15 @@ def parse_args(args):
106106
else:
107107
parsed_args['intersects'] = data
108108

109+
# if headers provided, parse it
110+
if 'headers' in parsed_args:
111+
headers = parsed_args['headers']
112+
if os.path.exists(headers):
113+
with open(headers) as headers_file:
114+
parsed_args['headers'] = json.load(headers_file)
115+
else:
116+
parsed_args['headers'] = json.loads(headers)
117+
109118
return parsed_args
110119

111120

@@ -125,8 +134,10 @@ def cli():
125134

126135
cmd = args.pop('command')
127136
if cmd == 'search':
128-
search(**args)
137+
return search(**args)
129138

130139

131140
if __name__ == "__main__":
132-
cli()
141+
return_code = cli()
142+
if return_code and return_code != 0:
143+
sys.exit(return_code)

pystac_client/client.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from copy import deepcopy
22
from typing import Callable, Optional
3+
from urllib.request import Request
34

45
import pystac
56
import pystac.stac_object
67
import pystac.validation
8+
from pystac import STAC_IO
79

810
from pystac_client.conformance import ConformanceClasses
911
from pystac_client.exceptions import ConformanceError
@@ -48,7 +50,8 @@ def __init__(self,
4850
extra_fields=None,
4951
href=None,
5052
catalog_type=None,
51-
conformance=None):
53+
conformance=None,
54+
headers=None):
5255
super().__init__(id=id,
5356
description=description,
5457
title=title,
@@ -66,13 +69,13 @@ def __init__(self,
6669
'API does not conform to {ConformanceClasses.STAC_API_CORE}. Must contain one of the following '
6770
f'URIs to conform (preferably the first):\n\t{allowed_uris}.')
6871

69-
self.headers = {}
72+
self.headers = headers or {}
7073

7174
def __repr__(self):
7275
return '<Catalog id={}>'.format(self.id)
7376

7477
@classmethod
75-
def open(cls, url, headers={}):
78+
def open(cls, url, headers=None):
7679
"""Alias for PySTAC's STAC Object `from_file` method
7780
7881
Parameters
@@ -84,7 +87,16 @@ def open(cls, url, headers={}):
8487
-------
8588
catalog : Client
8689
"""
90+
import pystac_client.stac_io
91+
92+
def read_text_method(url):
93+
request = Request(url, headers=headers or {})
94+
return pystac_client.stac_io.read_text_method(request)
95+
96+
old_read_text_method = STAC_IO.read_text_method
97+
STAC_IO.read_text_method = read_text_method
8798
catalog = cls.from_file(url)
99+
STAC_IO.read_text_method = old_read_text_method
88100
catalog.headers = headers
89101
return catalog
90102

pystac_client/item_search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def __init__(
171171
):
172172
self.conformance = conformance
173173
self.session = Session()
174-
self.session.headers.update(headers)
174+
self.session.headers.update(headers or {})
175175
self.request = Request(method=method, url=url)
176176

177177
self._next_resolver = next_resolver or simple_stac_resolver

pystac_client/stac_io.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def read_text_method(uri):
1818
instances as input. This method also raises any :exc:`urllib.error.HTTPError` exceptions rather than catching
1919
them to allow us to handle different response status codes as needed."""
2020
if isinstance(uri, Request):
21-
logger.debug(f"Requesting {uri.get_full_url()}")
21+
logger.debug(f"Requesting {uri.get_full_url()} with headers {uri.headers}")
2222
with urlopen(uri) as response:
2323
resp = response.read()
2424
return resp.decode("utf-8")
@@ -34,10 +34,14 @@ def make_request(session, request, additional_parameters={}):
3434
_request = deepcopy(request)
3535
if _request.method == 'POST':
3636
_request.json.update(additional_parameters)
37-
logger.debug(f"Requesting {_request.url}, Payload: {json.dumps(_request.json)}")
37+
logger.debug(
38+
f"Requesting {_request.url}, Payload: {json.dumps(_request.json)}, Headers: {session.headers}"
39+
)
3840
else:
3941
_request.params.update(additional_parameters)
40-
logger.debug(f"Requesting {_request.url}, Payload: {json.dumps(_request.params)}")
42+
logger.debug(
43+
f"Requesting {_request.url}, Payload: {json.dumps(_request.params)}, Headers: {session.headers}"
44+
)
4145
prepped = session.prepare_request(_request)
4246
resp = session.send(prepped)
4347
if resp.status_code != 200:

requirements-dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ flake8==3.8.*
44
pytest~=6.2.3
55
pytest-cov~=2.11.1
66
pytest-recording~=0.11.0
7+
pytest-console-scripts~=1.1.0
78
recommonmark~=0.7.1
89
Sphinx~=3.5.1
910
toml~=0.10.2

0 commit comments

Comments
 (0)