Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/apiaryio/curl-trace-parser
Parser for output from Curl --trace option
https://github.com/apiaryio/curl-trace-parser
curl http parser sjs-team trace
Last synced: 4 days ago
JSON representation
Parser for output from Curl --trace option
- Host: GitHub
- URL: https://github.com/apiaryio/curl-trace-parser
- Owner: apiaryio
- License: mit
- Archived: true
- Created: 2013-07-01T15:54:52.000Z (over 11 years ago)
- Default Branch: master
- Last Pushed: 2021-08-02T13:22:16.000Z (over 3 years ago)
- Last Synced: 2024-11-21T11:04:01.759Z (21 days ago)
- Topics: curl, http, parser, sjs-team, trace
- Language: JavaScript
- Size: 91.8 KB
- Stars: 197
- Watchers: 21
- Forks: 14
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-software-supply-chain-security - apiaryio/curl-trace-parser: Parser for output from Curl --trace option
README
# The `curl --trace` parser
[![NPM Version](https://img.shields.io/npm/v/curl-trace-parser.svg)](https://www.npmjs.com/package/curl-trace-parser)
[![Build Status](https://travis-ci.org/apiaryio/curl-trace-parser.svg)](https://travis-ci.org/apiaryio/curl-trace-parser)
[![Dependency Status](https://david-dm.org/apiaryio/curl-trace-parser.svg)](https://david-dm.org/apiaryio/curl-trace-parser)
[![devDependency Status](https://david-dm.org/apiaryio/curl-trace-parser/dev-status.svg)](https://david-dm.org/apiaryio/curl-trace-parser?type=dev)
[![Greenkeeper badge](https://badges.greenkeeper.io/apiaryio/curl-trace-parser.svg)](https://greenkeeper.io/)## The story
Did you know that you can record raw HTTP communication of [Curl command-line tool](http://curl.haxx.se/docs/manpage.html) with the `--trace` and `--trace-ascii` option? It's the only way I know to get raw HTTP communication without using the [`tcpdump`](http://www.tcpdump.org/) or [`wireshark`](http://www.wireshark.org/).
For example, this trick is very useful for the proper introspection into HTTP communication of an undocumented RESTful API.The only glitch is that cURL `--trace` saves data in [its custom format][gist], far from human-friendly, saving chunks as they are being received and splitting them by packets. If you want a human readable form then this parser is what you need. Delivered as a Node.js package.
[gist]: https://gist.github.com/netmilk/6048533
## Usage
```
$ curl --trace - http://httpbin.org/ip | curl-trace-parser
```## Sample API
We will be using this [sample API][apiarydoc] created with the [Apiary.io mock server](http://apiary.io) to demonstrate tracing an HTTP communication and the use of the cURL trace parser.
[apiarydoc]: http://docs.curltraceparser.apiary.io/
## Install the cURL trace parser
```bash
$ npm install -g curl-trace-parser
```## Record your first trace file
```bash
$ curl --trace tracefile --header "Content-Type: application/json" \
--request POST \
--data-binary "{ \"product\":\"1AB23ORM\", \"quantity\": 2 }" \
"http://curltraceparser.apiary.io/shopping-cart"
```Note this cURL example is copied and pasted from [Apiary interactive API documentation][example].
[example]: http://docs.curltraceparser.apiary.io/#get-%2Fshopping-cart
## Examples
### `--raw` format
The output is ASCII representation of a raw [HTTP message][message] with few modifications:
- Request line begins with `> `
- Response line begins with `< `
- Request and Response is delimited by CR+LF
- Both Request and Response are terminated by an extra trailing LFNote: This is little bit tricky because HTTP RFC does not have declared delimiter for Request and Response, for obvious reasons.
```bash
$ cat tracefile | curl-trace-parser --raw
> POST /shopping-cart HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
> Host: curltraceparser.apiary.io
> Accept: */*
> Content-Type: application/json
> Content-Length: 39
>
> { "product":"1AB23ORM", "quantity": 2 }< HTTP/1.1 201 Created
< Content-Type: application/json
< Date: Tue, 30 Jul 2013 11:32:30 GMT
< X-Apiary-Ratelimit-Limit: 120
< X-Apiary-Ratelimit-Remaining: 119
< Content-Length: 50
< Connection: keep-alive
<
< { "status": "created", "url": "/shopping-cart/2" }
```### `--blueprint` format
The output is HTTP Request and Response in the [API blueprint format](http://apiblueprint.org) which is the superset of markdown.
```
$ cat tracefile | ./bin/curl-trace-parser --blueprint
# POST /shopping-cart
+ Request
+ HeadersUser-Agent:curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
Host:curltraceparser.apiary.io
Accept:*/*
Content-Type:application/json
Content-Length:39+ Body
{ "product":"1AB23ORM", "quantity": 2 }
+ Response 201
+ HeadersContent-Type:application/json
Date:Tue, 30 Jul 2013 11:32:30 GMT
X-Apiary-Ratelimit-Limit:120
X-Apiary-Ratelimit-Remaining:119
Content-Length:50
Connection:keep-alive+ Body
{ "status": "created", "url": "/shopping-cart/2" }
```
Note: This format does not expect any CR+LF in the message body
### Parse the trace to raw HTTP file using Node.JS
```javascript
var fs = require('fs');
var parser = require('curl-trace-parser');
fs.readFile('./tracefile', 'utf8', function (err,trace) {
console.log(parser.parse(trace));
})
```## Output format reverse parser
```javascript
var fs = require('fs');
var parser = require('curl-trace-parser');
fs.readFile('./tracefile', 'utf8', function (err,trace) {
console.log(parser.parseBack(trace));
})
```## API Reference
`parse(traceString)` - parse string with trace to object with raw request and response
`parseToString(traceString)` - parse string with trace to [output format]
`parseBack(outputString)` - parse string with [output format] back to object with raw request an resposne
[output format]: https://github.com/apiaryio/curl-trace-parser#output-format
[message]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html