{"id":15372080,"url":"https://github.com/xquery/curlpipe","last_synced_at":"2025-04-15T14:06:36.429Z","repository":{"id":141753216,"uuid":"111997795","full_name":"xquery/curlpipe","owner":"xquery","description":"Curlpipe, an experimental DSL for building http execution pipelines.","archived":false,"fork":false,"pushed_at":"2018-11-30T12:15:00.000Z","size":205,"stargazers_count":5,"open_issues_count":6,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-15T14:06:28.163Z","etag":null,"topics":["curl","http","http-client"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xquery.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-25T11:18:16.000Z","updated_at":"2024-09-19T08:26:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"a8ee09f9-1427-4f23-83c9-80a9558d3f79","html_url":"https://github.com/xquery/curlpipe","commit_stats":{"total_commits":237,"total_committers":3,"mean_commits":79.0,"dds":"0.012658227848101222","last_synced_commit":"b5a745ae481f578044b6c6016442b2f4620a0156"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xquery%2Fcurlpipe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xquery%2Fcurlpipe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xquery%2Fcurlpipe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xquery%2Fcurlpipe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xquery","download_url":"https://codeload.github.com/xquery/curlpipe/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249085437,"owners_count":21210267,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["curl","http","http-client"],"created_at":"2024-10-01T13:49:32.720Z","updated_at":"2025-04-15T14:06:36.407Z","avatar_url":"https://github.com/xquery.png","language":"C++","readme":"# Curlpipe - DSL for making http execution pipelines.\n\n(WARNING - under development as in everything is probably broken!)\n\n[![Build Status](https://travis-ci.org/xquery/curlpipe.svg?branch=develop)](https://travis-ci.org/xquery/curlpipe)\n[![Coverage Status](https://coveralls.io/repos/github/xquery/curlpipe/badge.svg?branch=develop)](https://coveralls.io/github/xquery/curlpipe?branch=develop)\n[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](COPYING)\n\n\n[Curlpipe](https://github.com/xquery/curlpipe) is a little [DSL](https://en.wikipedia.org/wiki/Domain-specific_language) making it easy to build up http execution pipelines.\n\nCurlpipe uses [libcurl](https://curl.haxx.se/) under the covers, curl is a great ~~swiss army knife~~ http client that does much more then just make it easy to work with HTTP, supporting a plethora of URI addressable protocols.  Over the years, the curl command line interface has grown - exposing many options with most users only ever invoking a subset of features, learning more advanced features over time.\n\n[Getting Started](#getting-started) | [Usage](#usage) | [Language](#the-curlpipe-language) | [Examples](#examples) | [Points of Interest](#points-of-interests) | [Developing](#developing-curlpipe) | [License](#license)\n\n## Getting started\n\nEventually you will be able to [Download](https://github.com/xquery/curlpipe/releases) the latest release for your platform but today you are on the bleeding edge and\n must [build](#compiling) the software.\n\nTo try it out,\n\n```bash\necho \"[http://www.httpbin.org/get] \u003e [/tmp/output.txt]\" | curlpipe\n```\n\nor define a file (example.cp)\n\n```bash\n[http://www.httpbin.org/get] \u003e [/tmp/output.txt]\n```\n\nand invoke curlpipe, supplying that file as its only argument.\n\n```bash\n\u003e curlpipe example.cp\n```\n\nYou should now observe the output from the URI saved to a file.\n\nIt is easy to send data eg.\n\n```bash\n\"name=Jasmine\u0026age=1\" | [http://www.httpbin.org/post]\n```\n\nSome more [examples](https://github.com/xquery/curlpipe#examples).\n\n## Usage\n\nTo get help run\n\n```bash\n\u003e curlpipe -h\n```\n\n```bash\ncurlpipe 0.1.0 | ⓒ 2017-2018 James Fuller \u003cjim.fuller@webcomposite.com\u003e | https://github.com/xquery/curlpipe\n\n\u003e curlpipe mycurlpipe.cp\n    -h | --help   : Help.\n    -d | --debug  : Emit debug info logging.\n    -i | --info   : Emit info logging.\n    -l | --log    : Enable logging to file.\n    -q | --quiet  : Suppress output to stdout (console).\n    -a | --auth   : Pass a username:password pair as the argument.\n    -A | --auth-type : Specify the auth mechanism (basic|digest).\n    -p | --params : Define set of parameters for token replacement (json|xml).\n    -P | --param  : Define parameter(s) for token replacement.\n    -o | --options : Define set of options controlling curlpipe behavior (default is ~/.curlpiperc).\n    -O | --option  : Define option(s) controlling curlpipe behavior.\n```\n\nCurlpipe flags for controlling how much information is emitted during processing.\n\n| short  | long     | description   |\n|--------|----------|---------------|\n| -h     | --help   | Obtain help   |\n| -d     | --debug  | Emit debug info logging.|\n| -i     | --info   | Emit info logging.|\n| -l     | --log    | Enable logging to file.|\n| -q     | --quiet  | Suppress output to stdout (console).|\n\n### Authentication\nThe following flags set the default auth credentials and auth-type used by curlpipe.\n\n| short  | long        | description   |\n|--------|-------------|---------------|\n| -a     | --auth      |  Pass a username:password pair as the argument.  |\n| -A     | --auth-type |  Specify the auth mechanism (basic|digest). |\n\n~/.netrc (on windows ~/_netrc) is also supported by curlpipe (by dint of libcurl support):\n```bash\n\u003e cat ~/.netrc\nmachine example.org\nlogin myuser\npassword mypassword\n```\n\n### Parameters\n\nParameters maybe passed to curlpipe, replacing tokens in the curlpipe script.\n\n| short  | long     | description   |\n|--------|----------|---------------|\n| -p     | --params | set file containing params (xml|json format).|\n| -P     | --param  | set a param (ex. -Pid=1).|\n\nParameters can be passed in via a file, for example, using data.json:\n```json\n{\"id\":1, \"name\":\"Ali G\"}\n```\n\nThe call to curlpipe would be\n```bash\n\u003e curlpipe -p data.json example.cp\n```\n\nor data.xml looks like\n```xml\n\u003cparams\u003e\n\u003cparam\u003e\n\u003cname\u003eid\u003c/name\u003e\n\u003cvalue\u003e1\u003c/value\u003e\n\u003c/param\u003e\n\u003cparam\u003e\n\u003cname\u003ename\u003c/name\u003e\n\u003cvalue\u003eAli G\u003c/value\u003e\n\u003c/param\u003e\n\u003c/params\u003e\n```\nand similarly called\n```bash\n\u003e curlpipe -p data.xml example.cp\n```\n\nParamaters may also be individually defined, overidding params if used in conjunction with above -p flag.\n\n```bash\n\u003e curlpipe -Pid=1 -Pname=Ali G example.cp\n```\n### Options\n\nBy default, curlpipe looks for a ~/.curlpiperc file (on windows _curlpiperc) containing options that control curlpipe\nprocessing behavior. An example ~/.curlpiperc file is [here](https://github.com/xquery/curlpipe/blob/develop/etc/.curlpiperc)\n\n| short  | long     | description   |\n|--------|----------|---------------|\n| -o     | --options | set file containing curlpipe options (xml|json format).|\n| -O     | --option  | set an option (ex. -Pid=1).|\n\nAlternately you can set the location of this file with the -o flag.\n\nOptions can be overriden at the command line using the -O flag. The set of options curlpipe exposes are:\n\n| option | example  | description   |\n|--------|----------|---------------|\n|        |          | TBA.|\n|        |          | TBA.|\n\n\n## The curlpipe language\n\nCurlpipe defines a series of statement(s). The simplest statement defines retrieval of a URI:\n```bash\n[http://www.httpbin.org/get] ;\n```\nwhere the seperator (;) is optional.\n\nWhen this is run the output of dereferencing the URI is sent to stdout (con).\n\n### Data types\n\nIn addition to a URI, curlpipe supports boolean, literal, binary, xml, json and null data types.\n\n| data type  | example |description   |\n|------------|---------|--------------|\n| URI        | `[http://www.example.org]`   | used to POST, PUT or DELETE.|\n| literal    | `\"name=value;name=value\"`   | literal data value.|\n| binary     |  ex. zip file              | binary data value.|\n| xml        | `\u003cperson\u003e\u003cname\u003eTommy\u003c/name\u003e\u003c/person\u003e`        | well formed xml data.|\n| json       | `{id:1,name:\"Tommy\"}`        | json data.|\n| boolean    | `? ?`                      | true or false.|\n| null       | `[]`                       | an empty/null value.|\n\nLiteral string data can be used to pass in name value pairs (using application/x-www-form-urlencoded content type):\n```bash\n\"name=value\u0026name=value\" ;\n```\nBinary data (for example, a zip file) is also supported.\n\nSupport for common formats, like XML and json.\n```xml\n\"\u003cperson\u003e\u003cname\u003eTommy\u003c/name\u003e\u003c/person\u003e\" ;\n```\n\n```json\n\"{id:1,name:'Tommy;}\";\n```\n\n### Statements\n\nA single curlpipe statement can be comprised of\n\n```\n(datatype | datatype operator datatype)\n```\n\neither a datatype or a datatype + operator + datatype where operators perform actions (or test conditions) on datatypes.\n\nThe following example illustrates how the contents of /temp/data.json is sent to a HTTP endpoint supporting POST method.\n```bash\n[/tmp/data.json] | [http://httpbin.org/post]\n```\nIf the endpoint URI supports PUT it may opt to use that. If the endpoint does not support these methods then the appropriate\nhttp error code is thrown.\n\n```bash\n\"name=Jim\u0026age=21\" | [http://httpbin.org/post]\n```\n\nThe following would POST xml to the URI.\n\n```bash\n\"\u003cperson\u003e\u003cname\u003eTommy\u003c/name\u003e\u003c/person\u003e\" | [http://httpbin.org/post]\n```\nor now with a json datatype.\n\n```bash\n\"{id:1,name:'Tommy'}\" | [http://httpbin.org/post]\n```\n\nThe pipe operator can be used to perform an HTTP DELETE\n```bash\n[] | [http://httpbin.org/delete]\n```\n\nLike the PUT the pipe operator will deduce if the endpoint supports DELETE. This built in behavior is enabled\nby curlpipe options (which can be set when invoking curlpipe).\n\nOtherwise one is always free to force a PUT\n```bash\n\"{id:1,name:'Tommy'}\" =| [http://httpbin.org/put]\n```\nTo force a DELETE method\n```bash\n[] =| [http://httpbin.org/delete]\n```\n\nTo force a HEAD method use a conditional (explained further down)\n```bash\n[http://httpbin.org/head] != []\n```\n\n### Operators\n\nOperators chain together to build execution pipeline of arbitrary length.\n\n```bash\n[/tmp/data.json] | [http://httpbin.org/post] \u003e [/tmp/output.txt] | [http://httpbin.org/post]\n```\n\nThe set of processing operators are:\n\n| operator  | description   |\n|-----------|---------------|\n| \u0026#124;    | used to POST, PUT or DELETE.|\n| \u0026#62;     | redirect output to file.|\n| \u0026#62;\u0026#62;| append output to file.|\n| =\u0026#124;   | used to force PUT or DELETE.|\n\n\n### Parameters\n\nParameters can be passed into curlpipe\n```bash\n\u003e curlpipe -Pname=Tommy example.cp -Pid=1\n```\nand used for token replacement (ex. ${token}) in either data or URIs.\n```bash\n{name:\"${name}\"} | [http://httpbin.org/get/${id}]\n```\n\n### Conditional Logic\n\ncurlpipe implements boolean and null datatype which can be used with conditional operators\nto test data values.\n\n```bash\n[http://www.httpbin.org/get] == \"test\"\n```\n\n```bash\n[http://www.httpbin.org/get] ~= \"test\"\n```\n\nWhere conditionals can be composited up using AND(\u0026\u0026) or OR(||) operators.\n\n```bash\n[http://www.httpbin.org/get] ~= \"test\" \u0026\u0026 [http://www.httpbin.org/get] != \"not test\"\n```\n\ncurlpipe supports boolean logic, in the following form.\n\n```bash\n[http://www.httpbin.org/get] =~ \"test\" \u003e [/tmp/matches.txt]\n```\nwhere the file is only written if the match is a success.\n\nAdditionally, curlpipe supports trinary logic, in the following form.\n\n```bash\n[http://www.httpbin.org/get] =~ \"test\"\n       ? \u003e [/tmp/success.txt]\n       : 2\u003e [/tmp/fail.txt]\n```\n\nThe set of conditional operators are:\n\n| operator  | description        |\n|-----------|--------------------|\n| ==        |  equal             |\n| !=        |  does not equal    |\n| ~=        |  regex text        |\n| \u0026\u0026        |  AND chain condition    |\n| \u0026#124;\u0026#124; | OR chain condition    |\n\n### Selectors\n\nYou can narrow down data using selectors, with postfix defining a simple xpath like selection.\n\n```bash\n[http://localhost:81/image/svg].svg.title | [http://localhost:81/post \"Content-type\":\"application/xml\"]\n```\n\nWhere the above example will retrieve elements under svg/title ... this simple path selection works equally\nacross xml or json.\n\n### Options\n\nCurlpipe defines the following options\n\n| option  | type | default |description        |\n|---------|------|---------|-------------------|\n| deduce-methods-on-pipe | boolean   | true |will detect if URI supports PUT or DELETE when using pipe operator.|\n\n## Examples\n\nFind more examples [here](https://github.com/xquery/curlpipe/tree/develop/docs/examples).\n\n##### Retrieve (GET) and save to file\n```bash\n[http://www.httpbin.org/get] \u003e [/tmp/output.txt]\n```\n##### Retrieve (GET) and save to file\n```bash\n[http://www.httpbin.org/get auth=myser:password auth-type=digest] \u003e [/tmp/output3.txt]\n```\n\n##### Retrieve (GET) setting headers\n```bash\n[http://www.httpbin.org/get \"Accept\":\"application/json\"]\n```\n\n##### GET and append to file\n```bash\n[http://www.httpbin.org/get] \u003e\u003e [/tmp/response.txt]\n```\n```bash\n[http://www.httpbin.org/get],[http://www.httpbin.org/uuid] \u003e\u003e [/tmp/response.txt]\n```\n\n##### GET and narrow down result with selector and POST results\n```bash\n[http://www.httpbin.org/image/svg].svg.title | [http://www.httpbin.org \"Content-type\":\"application/xml\"]\n```\n\n##### conditional operation\n```bash\n[http://www.httpbin.org/get] =~ \"test\" \u003e [/tmp/matches.txt]\n```\n\n##### Trinary operator\n```bash\n[http://www.httpbin.org/get] =~ \"test\"\n       ? \u003e [/tmp/success.txt]\n       : \u003e [/tmp/fail/fail.txt]\n\n```\n\n##### POST json\n```bash\n\"{'id':1 , \"name\":'James Fuller' age='${age}'}\" | [http://www.httpbin.org/post] ;\n```\n\n```bash\n[/tmp/data.json] | [http://www.httpbin.org/post \"Content-type\":\"application/json\"] ;\n```\n\n##### POST xml\n```bash\n\"\u003cperson id=\"1\"\u003e\u003cname\u003eJohn Smith\u003cname\u003e\u003cage\u003e${age}\u003c/age\u003e\u003c/person\u003e\" | [http://www.httpbin.org/post] ;\n```\n\n```bash\n[/tmp/data.xml] | [http://www.httpbin.org/post \"Content-type\":\"application/xml\"] ;\n```\n\n##### POST name=value\n```bash\n\"id=1\u0026name=James Fuller\" | [http://www.httpbin.org/post] ;\n```\n\n##### POST zip file\n```bash\n[/tmp/mydoc.zip] | [http://www.httpbin.org/post \"Content-type\":\"application/zip\"] ;\n```\n\n##### PUT some json\n\nwill deduce if endpoint supports PUT\n```bash\n\"{\"test\":1}\" | [http://www.httpbin.org/put]\n```\n\nforce an HTTP PUT\n```bash\n\"{\"test\":1}\" =| [http://www.httpbin.org/put]\n```\n\n##### DELETE\nwill deduce if endpoint supports DELETE\n```bash\n[] | [http://www.httpbin.org/delete]\n```\n\nforce an HTTP DELETE\n```bash\n[/dev/null] =| [http://www.httpbin.org/delete]\n```\n\n##### Transclusion in URI\n```\n\"${mypayload}\" | [http://www.httpbin.org/delete/${myid}]\n```\n\n##### Transclusion in payload\n```\n{\"id\":${myid}} | [http://www.httpbin.org/delete/${myid}]\n```\n\n##### Comparison\n```bash\n[http://www.httpbin.org/get].url == 'http://www.httpbin.org/get'\n```\n```bash\n[http://www.httpbin.org/get] .url != 'http://www.example.com'\n```\n\n## Points of Interests\n\ncurlpipe is by design a 'little language' and most likely missing features from your 'favourite' language. It is intended as an adjunct to your existing script processing or host language.\n\nTo provide a framework for design thoughts, here are a few possibly non obvious gaps in the current codebase.\n\n* curlpipe is not intended as a drop in replacement for the curl tool (which is already a great [CLI](https://en.wikipedia.org/wiki/Command-line_interface)).\n* Intentionally [lazy](http://threevirtues.com/) defining internals or worrying too much about performance at this stage.\n* curlpipe language is defined with an [EBNF](etc/csparser.ebnf) which is used to produce a strict parser.\n* Designing a programming language is hard - coherence and an easy to run AST are the first goals, please do [raise an issue](https://github.com/xquery/curlpipe/issues) if you feel strongly where syntax could change.\n* I find using [CMake](https://cmake.org/) non intuitive ... its enforced usage on this project is an attempt to learn more (otherwise you would see a Makefile here!).\n* Currently curlpipe is http centric in initial releases.\n* Woefully ignorant of windows platform ... looking at [appveyor](https://www.appveyor.com/) to eventually help solve that ([issue #2](https://github.com/xquery/curlpipe/issues/2)).\n\nI have blatantly stolen (and deformed) concepts from many places (bash, unix pipes, prolog, etc..). The following projects provide alternate approaches to solving similar problems that\ncurlpipe is trying to address and worth a mention.\n\n* [httpie](https://github.com/jakubroztocil/httpie)\n* [curlrc](https://github.com/benwebber/curlrc)\n\n## Developing curlpipe\n\nPlease [raise an issue](https://github.com/xquery/curlpipe/issues) or make a contribution by forking the repository and creating a [pr](https://github.com/xquery/curlpipe/pulls).\n\nDevelopment work happens on the [develop branch])(https://github.com/xquery/curlpipe/tree/develop) and\nreleases are based on [master branch](https://github.com/xquery/curlpipe/tree/master).\n\n### Compiling\n\nTo build software, run cmake:\n\n```bash\n\u003e mkdir build\n\u003e cd build\n\u003e cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_MANUAL=OFF -DBUILD_TESTING=OFF ..\n\u003e make\n\u003e make test\n\u003e make install\n```\n\nRunning cmake requires access to the internet to pull down dependencies. This is problematic  approach for\nthose wishing to build on a standalone machine off the network (tracked as [issue 1](https://github.com/xquery/curlpipe/issues/1))\n\nThe build should complain if any other dependencies are missing (ex. openssl). Please review third party [dependencies](#dependencies) for any other build requirements.\n\n### Testing\n\nTests require [httpbin](http://httpbin.org) - to setup run docker-compose from top level dir (which will setup both http/https)\n\n```\n\u003e docker-compose -d up\n```\n\nalternately, run the docker command.\n\n```bash\n\u003e docker run -p 81:80 kennethreitz/httpbin\n```\n\nAfter building usually it is just a matter of running make test target.\n\n```bash\n\u003e make test\n```\n\nor you could run directly\n```bash\n\u003e cd test\n\u003e ./runAllTests\n```\n\n### Generating the Parser\n\nlib/curlpipe/csparser.cpp is generated using [REx Parser Generator](http://www.bottlecaps.de/rex/) with the\nfollowing flags.\n\n```bash\n-name csparser -tree -cpp -faster\n```\n\n### Release Package\n\nRelease packages are built using CPack.\n\nMake a release build.\n```bash\n\u003e mkdir build\n\u003e cd build\n\u003e cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_MANUAL=OFF -DBUILD_TESTING=OFF ..\n\u003e make\n```\nThen run cpack.\n```\n\u003e cpack --config CPackConfig.cmake\n\n````\n\n### Dependencies\nThis project depends on the following external libs:\n* [curl](https://curl.haxx.se/): libcurl (of course!).\n* [REx Parser Generator](http://www.bottlecaps.de/rex/): Gunther Rademacher \u003cgrd@gmx.net\u003e excellant parser generator.\n* [loguru](https://github.com/emilk/loguru): no fuss logging.\n* [cxxopt](https://github.com/jarro2783/cxxopts): parsing command args.\n* [googletest](https://github.com/google/googletest): testing.\n* [rapidjson](https://github.com/miloyip/rapidjson): json munging.\n* [pugixml](https://github.com/zeux/pugixml): xml dancing.\n\nPlease review these individual projects for more details on their own dependencies.\n\n## License\n\ncurlpipe is provided under the [MIT License](COPYING)\n\nMIT License\n\nCopyright (c) 2017-2018 James Fuller \u003cjim.fuller@webcomposite.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---\n[Getting Started](#getting-started) | [Usage](#usage) | [Language](#the-curlpipe-language) | [Examples](#examples) | [Points of Interest](#points-of-interests) | [Developing](#developing-curlpipe) | [License](#license)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxquery%2Fcurlpipe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxquery%2Fcurlpipe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxquery%2Fcurlpipe/lists"}