Code Monkey home page Code Monkey logo

curl-trace-parser's Introduction

The curl --trace parser

NPM Version Build Status Dependency Status devDependency Status Greenkeeper badge

The story

Did you know that you can record raw HTTP communication of Curl command-line tool with the --trace and --trace-ascii option? It's the only way I know to get raw HTTP communication without using the tcpdump or wireshark. 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, 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.

Usage

$ curl --trace - http://httpbin.org/ip | curl-trace-parser

Sample API

We will be using this sample API created with the Apiary.io mock server to demonstrate tracing an HTTP communication and the use of the cURL trace parser.

Install the cURL trace parser

$ npm install -g curl-trace-parser

Record your first trace file

$ 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.

Examples

--raw format

The output is ASCII representation of a raw HTTP 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 LF

Note: This is little bit tricky because HTTP RFC does not have declared delimiter for Request and Response, for obvious reasons.

$ 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 which is the superset of markdown.

$ cat tracefile | ./bin/curl-trace-parser --blueprint
# POST /shopping-cart
+ Request
    + Headers

            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

    + Body

            { "product":"1AB23ORM", "quantity": 2 }

+ Response 201
    + Headers

            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

    + 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

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

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

curl-trace-parser's People

Contributors

dependabot-preview[bot] avatar greenkeeper[bot] avatar honzajavorek avatar realityking avatar zdne avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

curl-trace-parser's Issues

SSL data in curl tracefile not ignored

version 0.0.8

When a curl trace file is generated going against an endpoint using HTTPS, the resulting "Send SSL data", "Recv SSL data" chunks in the tracefile cause 'noisy' output for both the --raw and --blueprint options.
Removing these chunks from the tracefile eliminates the noisy output.
Perhaps the first for loop in the parse() function (in parser.js) could filter out these chunks?

But, on a more positive node, nice tool - as the description states, "If you want a human readable form then this parser is what you need". The blueprint output is a quite nice feature.

Split CLI off into its own project?

I noticed that the parser itself is actually completely free of dependencies, they're only used in the CLI. What do you think of splitting the CLI into its own repository (maybe curl-trace-parser-cli)? It would reduce the update churn due to the new fixed versioning.

LICENSE?

You need to include license text for MIT license

Simple example?

Do you really need a POST example with POST data and a custom HTTP header in order to demonstrate how to run curl and capture the traffic? I would suggest a simple GET without parameters or headers would suffice.

Add Newline after HTTP body

Request and response are pressed on one line if POST body is present, missing newline after data is breaking terminal:

kolotoc:curl-trace-parser netmilk$ curl --trace - --header "Content-Type: application/json" \
      --silent --output /dev/null --request POST \
      --data-binary "{ \"product\":\"1AB23ORM\", \"quantity\": 2 }" \
      "http://curltraceparser.apiary.io/shopping-cart" | \
      curl-trace-parser
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: Sun, 21 Jul 2013 14:32:46 GMT
X-Apiary-Ratelimit-Limit: 120
X-Apiary-Ratelimit-Remaining: 118
Content-Length: 50
Connection: keep-alive

{ "status": "created", "url": "/shopping-cart/2" }kolotoc:curl-trace-parser netmilk$

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.