Skip to content

Commit 560cc78

Browse files
authored
readers.stac & readers.tindex: forward HTTP headers & queries to readers (PDAL#4738)
* initial filespec support for tindex reader_args * move into setReaderOptions; add docs
1 parent c9cf0d9 commit 560cc78

File tree

5 files changed

+55
-8
lines changed

5 files changed

+55
-8
lines changed

doc/stages/readers.stac.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,14 @@ reader_args
112112
```bash
113113
--readers.stac.reader_args \
114114
'[{"type": "readers.ept", "resolution": 100}, {"type": "readers.las", "nosrs": true}]'
115+
```
116+
117+
HTTP headers & queries can be forwarded to the reader using a partial {ref}`filespec`
118+
JSON object, omitting the `path` component:
119+
120+
```bash
121+
--readers.stac.reader_args \
122+
'{"type": "readers.copc", "filespec": {"headers": {"your_header_key": "header_val"}, "query": {"your_query_key": "query_val"}}}'
115123
```
116124

117125
catalog_schema_url

doc/stages/readers.tindex.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,16 @@ reader_args
6767
Exmaple:
6868

6969
```bash
70-
--readers.stac.reader_args \
70+
--readers.tindex.reader_args \
7171
'[{"type": "readers.ept", "resolution": 100}, {"type": "readers.las", "nosrs": true}]'
72+
```
73+
74+
HTTP headers & queries can be forwarded to the reader using a partial {ref}`filespec`
75+
JSON object, omitting the `path` component:
76+
77+
```bash
78+
--readers.tindex.reader_args \
79+
'{"type": "readers.copc", "filespec": {"headers": {"your_header_key": "header_val"}, "query": {"your_query_key": "query_val"}}}'
7280
```
7381

7482
srs_column

io/TIndexReader.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,30 @@ NL::json handleReaderArgs(NL::json rawReaderArgs)
119119
return readerArgs;
120120
}
121121

122-
Options setReaderOptions(const NL::json& readerArgs, const std::string& driver)
122+
Options setReaderOptions(const NL::json& readerArgs, const std::string& driver,
123+
const std::string& filename)
123124
{
124125
Options readerOptions;
126+
readerOptions.add("filename", filename);
125127
if (readerArgs.contains(driver)) {
126128
NL::json args = readerArgs.at(driver).get<NL::json>();
127129
for (auto& arg : args.items()) {
128130
NL::detail::value_t type = readerArgs.at(driver).at(arg.key()).type();
131+
132+
// We treat the partial FileSpec as a special case
133+
if (arg.key() == "file_spec" || arg.key() == "filespec")
134+
{
135+
NL::json filespecArg = arg.value();
136+
if (!filespecArg.is_object())
137+
throw pdal_error("value for " + driver + "'file_spec' argument " +
138+
" must be a valid JSON object.");
139+
filespecArg += {"path", filename};
140+
141+
// This doesn't check if the driver supports headers/queries: if not,
142+
// the reader will only use the filename
143+
readerOptions.replace("filename", filespecArg.dump());
144+
continue;
145+
}
129146
switch(type)
130147
{
131148
case NL::detail::value_t::string:
@@ -354,9 +371,9 @@ void TIndexReader::initialize()
354371
throwError("Unable to create reader for file '" + f.m_filename +
355372
"'.");
356373
reader->setLog(log());
357-
Options readerOptions = setReaderOptions(m_args->m_readerArgs, driver);
358374

359-
readerOptions.add("filename", f.m_filename);
375+
Options readerOptions = setReaderOptions(m_args->m_readerArgs, driver, f.m_filename);
376+
360377
reader->setOptions(readerOptions);
361378
Stage *premerge = reader;
362379

io/private/stac/Item.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ bool Item::init(const Filters& filters, NL::json rawReaderArgs,
7575
validate();
7676

7777
NL::json readerArgs = handleReaderArgs(rawReaderArgs);
78-
m_readerOptions = setReaderOptions(readerArgs, m_driver);
79-
m_readerOptions.add("filename", m_assetPath);
78+
m_readerOptions = setReaderOptions(readerArgs, m_driver, m_assetPath);
8079
return true;
8180
}
8281

@@ -137,16 +136,30 @@ NL::json Item::handleReaderArgs(NL::json rawReaderArgs)
137136
}
138137

139138
Options Item::setReaderOptions(const NL::json& readerArgs,
140-
const std::string& driver) const
139+
const std::string& driver, const std::string& filename) const
141140
{
142141
Options readerOptions;
142+
readerOptions.add("filename", filename);
143143
if (readerArgs.contains(driver)) {
144144
NL::json args = jsonValue(readerArgs, driver);
145145
for (auto& arg : args.items())
146146
{
147147
std::string key = arg.key();
148148
NL::json val = arg.value();
149149
NL::detail::value_t type = val.type();
150+
// We treat a partial FileSpec as a special case
151+
if (key == "file_spec" || key == "filespec")
152+
{
153+
if (!val.is_object())
154+
throw pdal_error("value for " + driver + "'file_spec' argument " +
155+
" must be a valid JSON object.");
156+
val += {"path", filename};
157+
158+
// This doesn't check if the driver supports headers/queries: if not,
159+
// the reader will only use the filename
160+
readerOptions.replace("filename", val.dump());
161+
continue;
162+
}
150163

151164
// if value is of type string, dump() returns string with
152165
// escaped string inside and kills pdal program args

io/private/stac/Item.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ class Item
103103
std::string m_id;
104104

105105
std::string extractDriverFromItem(const NL::json& asset) const;
106-
Options setReaderOptions(const NL::json& readerArgs, const std::string& driver) const;
106+
Options setReaderOptions(const NL::json& readerArgs, const std::string& driver,
107+
const std::string& filename) const;
107108

108109
NL::json handleReaderArgs(NL::json rawReaderArgs);
109110
void validate();

0 commit comments

Comments
 (0)