Skip to content

Commit 8a1f10a

Browse files
committed
URL Length check for locate data, loops through chunks if too long initially
1 parent 479d4de commit 8a1f10a

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

astroquery/heasarc/core.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import tarfile
77
import warnings
88
import numpy as np
9-
from astropy.table import Table, Row
9+
from astropy.table import Table, Row, vstack
1010
from astropy import coordinates
1111
from astropy import units as u
1212
from astropy.utils.decorators import deprecated, deprecated_renamed_argument
13+
from pathlib import Path
1314

1415
import pyvo
1516

@@ -517,13 +518,35 @@ def locate_data(self, query_result=None, catalog_name=None):
517518

518519
# datalink url
519520
dlink_url = f'{self.VO_URL}/datalink/{catalog_name}'
521+
def query_func(query_chunk):
522+
return pyvo.dal.adhoc.DatalinkQuery(
523+
baseurl=dlink_url,
524+
id=query_chunk['__row'],
525+
session=self._session
526+
)
527+
528+
# Standard URL limit of ~2000 characters for GET
529+
# With query formula https://[urlbase]?ID=###, could get 100 16 digit IDs
530+
URI_MAX = 100
531+
if len(query_result) > URI_MAX:
532+
# execute a set amount at a time
533+
chunks = len(query_result) % URI_MAX
534+
for chunk in range(chunks):
535+
query_chunk = query_result[URI_MAX*chunk: URI_MAX*chunk+URI_MAX]
536+
query = query_func(query_chunk)
537+
dl_result_chunk = query.execute().to_table()
538+
if chunk == 0:
539+
dl_result = dl_result_chunk
540+
else:
541+
dl_result = vstack([dl_result, dl_result_chunk])
542+
query_chunk = query_result[URI_MAX*chunk+URI_MAX:]
543+
query = query_func(query_chunk)
544+
dl_result_chunk = query.execute().to_table()
545+
dl_result = vstack([dl_result, dl_result_chunk])
546+
else:
547+
query = query_func(query_result)
548+
dl_result = query.execute().to_table()
520549

521-
query = pyvo.dal.adhoc.DatalinkQuery(
522-
baseurl=dlink_url,
523-
id=query_result['__row'],
524-
session=self._session
525-
)
526-
dl_result = query.execute().to_table()
527550
# include rows that have directory links (i.e. data) and those
528551
# that report errors (usually means there are no data products)
529552
dl_result = dl_result[np.ma.mask_or(

0 commit comments

Comments
 (0)