Server HTTP umum yang hanya mengirim permintaan POST?

24

Saya mencari alat baris perintah yang mendengarkan pada bagian tertentu, dengan senang hati kecuali setiap permintaan HTTP POST dan mencampakkannya.

Saya ingin menggunakannya untuk tujuan pengujian, yaitu untuk menguji klien yang mengeluarkan permintaan HTTP POST.

Itu berarti saya mencari mitra untuk curl -F(yang dapat saya gunakan untuk mengirim POST HTTP uji ke server HTTP).

Mungkin sesuatu seperti socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- tetapi socat tidak cukup karena tidak berbicara HTTP.

maxschlepzig
sumber
1
Mungkin saya tidak mengerti pertanyaannya dengan benar, tetapi jika yang Anda butuhkan adalah membuang permintaan POST, Anda dapat menggunakan netcat( ncpada beberapa sistem) dengan opsi -l(dengarkan) dan -p(nomor port).
peterph
1
@peterph, Anda dapat menggunakan ncuntuk pengujian parsial - tetapi saya dapat melihat kelemahan berikut: 1) tidak mengirim kode status HTTP 2) Saya harus menekan Ctrl + D setelah saya melihat permintaan untuk menutup koneksi 3) tidak tahu bagaimana bereaksi setelah itu 'Harapkan: 100-lanjut' tajuk 4) ia tidak tahu bagaimana menangani tajuk 'Transfer-Encoding: chunked' - mungkin hanya menampilkan potongan kosong pertama (mungkin)
maxschlepzig
Pertanyaan serupa tentang stackoverflow: stackoverflow.com/questions/5725430/…
maxschlepzig

Jawaban:

16

Alat-alat baris perintah inti sederhana seperti nc, socattampaknya tidak dapat menangani hal-hal HTTP spesifik yang terjadi (potongan, transfer encodings, dll.). Akibatnya ini dapat menghasilkan perilaku yang tidak terduga dibandingkan dengan berbicara dengan server web nyata. Jadi, pemikiran pertama saya adalah membagikan cara tercepat yang saya tahu tentang pengaturan server web kecil dan membuatnya hanya melakukan apa yang Anda inginkan: buang semua output.

Terpendek yang bisa saya lakukan dengan menggunakan Python Tornado :

#!/usr/bin/env python

import tornado.ioloop
import tornado.web
import pprint

class MyDumpHandler(tornado.web.RequestHandler):
    def post(self):
        pprint.pprint(self.request)
        pprint.pprint(self.request.body)

if __name__ == "__main__":
    tornado.web.Application([(r"/.*", MyDumpHandler),]).listen(8080)
    tornado.ioloop.IOLoop.instance().start()

Ganti pprintbaris untuk hanya output bidang spesifik yang Anda butuhkan, misalnya self.request.bodyatau self.request.headers. Pada contoh di atas ia mendengarkan pada port 8080, pada semua antarmuka.

Alternatif untuk ini banyak. web.py , Botol , dll.

(Saya cukup berorientasi Python, maaf)


Jika Anda tidak menyukai cara keluarannya, jalankan saja dan coba tcpdumpseperti ini:

tcpdump -i lo 'tcp[32:4] = 0x484f535420'

untuk melihat dump mentah nyata semua permintaan HTTP-POST. Atau, jalankan Wireshark.

gertvdijk
sumber
1
Bagi orang lain yang menemukan cuplikan ini sangat membantu - ia melakukan apa yang diminta - tetapi jika Anda ingin melihat badan POST, itu pprint.pprint(self.request.body). Catat, self.request.bodybukan self.body. Sama untuk self.request.headers. Lihat tornado.readthedocs.org/en/latest/…
mozz100
40

Saya juga sedang mencari ini dan berlari ke server Node.js http-echo :

npm install http-echo-server -g
PORT=8081 http-echo-server

Itu menerima semua permintaan dan menggemakan permintaan penuh termasuk tajuk ke baris perintah.

Tobias
sumber