SQLite-HTTP: A SQLite extension for making HTTP requests
observablehq.com
observablehq.com
Direct link to the project: https://github.com/asg017/sqlite-http
Few other projects of interest:
- sqlite-html: https://github.com/asg017/sqlite-html
- sqlite-lines: https://github.com/asg017/sqlite-lines
- various other extensions: https://github.com/nalgeon/sqlean
And past HN threads:
Mike Bostock himself is constantly adding latest work https://observablehq.com/@mbostock. Great learning resource.
What makes me hesitate to look closer is that I almost always am doing some text processing after the HTTP response and before the SQL commands. Due to resource constraints, I do not want to store HTML cruft.
I mostly am doing
HTTP response --> text processing --> SQLite3
rather than
HTTP response --> SQLite3
However I also have a need for storing different combinations of HTTP request headers and values in a database. I currently use the UNIX filesystem as a database (one header per file, djb's envdir loads the headers into environment from a selected folder), but maybe I could use SQLite3. For unprocessed text, e.g., from pipelined DoH responses, I use tmux buffers as a temporary database. Then do something like
HTTP responses --> tmux loadb /dev/stdin
tmux saveb -b b1 /dev/stdout|textprocessingutility --> ip-map.txt (append unique, i.e., "add unique")
The ip-map.txt file gets loaded into memory of a localhost forward proxy.Databases, such as NetBSD's db, djb's cdb, kdb+, or sqlite3 can help with the "append unique" step if the data gets big.
Note: Any JSON I retrieve is "text", not binary data. Most HTTP responses are HTML, sometimes with embedded JSON. Pipelined DoH is binary but I still use drill to print the packets as text. (When I finally learn ldns I will stop using drill.)
How complex is your text processing? If I'm working with a small dataset, I typically just save the "raw" responses into a table and create several intermediate tables that extracts the data I need. Something like:
create table raw_responses as http_get('https:/....');
create table intermediate1 as select xxxx(response_body) as message from raw_responses;
create table final as select message from intermediate;
(some CTEs[0] will be very useful here)The "lambda" pattern described about half-way through this post might be useful as well, if you need to do some complex text processing.
I myself never had to do text processing but instead JSON processing and that was convenient to do in Postgres directly, and I assume it's convenient to do in SQLite given the recent advancements in SQLite's JSON capabilities.
Look also at possibility of libpcap for printing catenated DNS packets.
Many years ago my boss told me to make a scheduled task in Windows to execute a SQL query to make an HTTP call and I asked him why we couldn't just use crontab/cURL? His response: "cURL? Like from the 90s?"
Anyhow I didn't last very long. Got fired shortly thereafter.
[0] https://github.com/asg017/sqlite-http/blob/main/docs.md#no-n...
SSRF and lambdas directly in your db engine. What other antipatters could you possibly want?
Also to note, this is mainly meant for use with local data processing, I doubt there's a need for sqlite-http in a SQLite DB used in regular applications. If you're just wrangling some data locally with SQLite with these extensions, I doubt there's much of a security risk
[0] https://github.com/asg017/sqlite-http/blob/main/docs.md#no-n... [1] https://sqlite-extension-examples.fly.dev/data?sql=select+*+...
The creators of Python still released Python, even though people could use it to build insecure software.
Engineers doing engineering for the sake of engineering.