Use case: Usually, when integrating with external service endpoints in your backend application, you will be using libraries (require('https') for Nodejs, import requests or import aiohttp for Python, HttpUrlConnection for Java, etc.) to make HTTP calls. It might be difficult to debug what request headers and payload are sent to remote instances; in this case, tcpdump can show how the request is structured (headers and payload) and forwarded to the server; this will help debug.

Make sure you have tcpdump installed. In general, if the service you are integrating is on http, you can use a command like below to see how the request is sent. First, using ifconfig find the network interface used to communicate with the internet. And you can use tcpdump to see the network traffic sent to an external service.

tcpdump -i utun2 -qettttAS -vv host integrated.service.com

Note: here utun2 is the network interface and integrated.service.com is the service endpoint host to which the request is sent.

You should see request headers and payload, but for the HTTPS endpoint, you would see encrypted data. In this case, you can start a simple web server using - python3 -m http.server 4000 (you can use any port here.)

$ python3 -m http.server
Serving HTTP on :: port 4000 (http://[::]:4000/) ...

All localhost/127.0.0.1 traffic goes to another interface, mostly lo for Linux and lo0 for macOS (you can check using ifconfig). You can use tcpdump like below and use port instead of host.

tcpdump -i lo0 -qettttAS -vv port 4000

Now in your application, instead of the actual service endpoint, you can put http://localhost:4000 and make the call; you should be seeing something like below -

Host: localhost:4000
consumer.id: 1111-1111-11111
svc.name: abc-svc
svc.env: stg:1.0.0
sec.key_version: 1
consumer.intimestamp: 1645211463000
sec.auth_signature: aVgPTNGxsrHs9WiddSIgcPH2wl7EPU6eeFIg==
qos.correlation_id: 1234
content-type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Python/3.8 aiohttp/3.7.4.post0
Content-Length: 436


2022-02-18 11:11:04.276214 IPv4, length 56: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.terabase > localhost.64452: tcp 0
E..4..@.@.................6..'.......(.....
..a.....
2022-02-18 11:11:04.276309 IPv4, length 492: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 488, bad cksum 0 (->3b0e)!)
    localhost.64452 > localhost.terabase: tcp 436
E.....@.@................'....6............
......a.{"notification": {"data": {"dynamic_data": {"products": "[{\"product_image\": \"https:\\/\\/test.com\\/is\\/image\\/test\\/0040615720019_A\", \"product_name\": \"Gel Pen, Black Ink, Medium - 12 Pens\", \"product_url\": \"https:\\/\\/test.com\\/p\\/1700\"}]"}}, "email_recipients": ["test.name@mail.com"]}}

You can see how request headers and (after a few lines) the payload {"notification": {"data": {" ... are sent.

Thus using tcpdump and creating a fake HTTP server, you can peek at the request payload sent to the remote server. I hope this helps.

– RC