คำขอ HTTP (S) ด้วยตนเอง


9

ฉันกำลังมองหาเครื่องมือ (อาจเป็นบน Linux) ที่จะอนุญาตให้ฉันทำการร้องขอ HTTP หรือ HTTPS ด้วยตนเอง ตามคู่มือฉันหมายถึง: ฉันควรจะสามารถป้อนไฟล์ข้อความที่ดูเหมือนว่า

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11

Hello world

และ URL ปลายทาง (www.example.com/foo) และส่งคำขอไปยัง URL อย่างมากจะมีประโยชน์หากส่วนหัวของ Content_Length คำนวณโดยอัตโนมัติ

ฉันจะสามารถเขียนเครื่องมือดังกล่าวโดยใช้ไลบรารี่อย่าง httplib ใน Python ได้ แต่เหตุผลที่ฉันต้องการคือการตรวจสอบด้วยตนเองเมื่อมีสิ่งผิดปกติเกิดขึ้นกับไลบรารี่


คำตอบ:


9

wgetมีตัวเลือก --post-file ซึ่งควรใช้กับคุณ

แก้ไข: นอกจากนี้ยังมีNcatซึ่งคุณจะใช้ในลักษณะเดียวกันกับคำแนะนำทางโทรศัพท์ของ Randolf Richardson ยกเว้นว่ามันรองรับ SSL / HTTPS ด้วย:

ncat -C --ssl www.example.com 443 < input.txt > output.txt

5
หากคุณต้องการ HTTPS ให้ใช้ openssl แทน netcat: openssl s_client -connect <address>: 443
Ambroz Bizjak

wget --post-file จะเพิ่มส่วนหัวและใช้ไฟล์ที่ระบุเฉพาะสำหรับเนื้อความของคำขอ
David Balažic

6

สำหรับ HTTP (ไม่ใช่ HTTPS) ทางเลือกหนึ่งสำหรับคำสั่ง "wget" ที่คำนึงถึงคือการใช้ telnet ดังนี้:

  • telnet hostname 80 <input.txt> output.txt

ไฟล์ "input.txt" เป็นรายการคำสั่งที่ตั้งไว้ล่วงหน้าที่คุณต้องการฟีดไปยังโฮสต์ที่ชื่อโฮสต์และไฟล์ "output.txt" จะเก็บการตอบกลับ


1
นี่ทำให้ฉันสงสัยว่า netcat รองรับ SSL และแท้จริงแล้วมี Ncat ซึ่งเป็นโคลน netcat ที่เปิดใช้งาน SSL
Chris Acheson

@Chris Acheson (+1): เยี่ยมมาก! โปรดคัดลอกสิ่งที่ฉันเขียนไว้ในคำตอบแยกต่างหากและปรับใช้กับโซลูชันที่ใช้ NetCat (ฉันจะลงคะแนนให้คำตอบของคุณหากคุณทำสิ่งนี้)
Randolf Richardson

1

คุณสามารถออกคำขอ GET ด้วย OpenSSL:

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

โปรดทราบว่าคุณยังสามารถใช้ "HTTP / 2" ได้ แต่ต้องระวังเพราะเซิร์ฟเวอร์บางตัว (เช่น github.com) ไม่รองรับ


0

สำหรับผมมันทำงานสร้างไฟล์คำขอ (ตัวอย่าง: request.txt)

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: close

Hello world

จากนั้นเรียกopenssl s_clientคำสั่ง:

cat request.txt | openssl s_client -quiet -connect www.example.com:443

อย่างไรก็ตามโปรดระวังบางประเด็น:

  • ไฟล์นั้นจะต้องได้รับการเข้ารหัสอย่างถูกต้องโดยเฉพาะเนื้อหาของเนื้อหา ดีกว่าถ้าคุณรวมส่วนหัวContent-type: text/plain; charset=utf-8ถ้าไฟล์ถูกเข้ารหัส utf-8
  • ตอนจบบรรทัดสำหรับส่วนหัวจะต้องCR / LF เฉพาะกับ LF ที่เว็บเซิร์ฟเวอร์สามารถส่งคืนHTTP/1.1 505 HTTP Version Not Supportedได้เนื่องจากโปรโตคอล HTTP มาตรฐานใช้ CR / LF สำหรับการสิ้นสุดบรรทัด ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ) คุณสามารถใช้unix2dosคำสั่งเพื่อทำการแปลงนี้
  • เพิ่มConnection: closeส่วนหัวเพื่อยกเลิกคำขอและส่งคืนจากการโทร มิฉะนั้นคำสั่งจะรอการโต้ตอบกับผู้ใช้หากเซิร์ฟเวอร์ตอบสนองด้วยConnection: keep-aliveส่วนหัว

-1

ฉันประหลาดใจที่ไม่มีใครกล่าวถึงม้วน มันทำตรงสำหรับสิ่งที่คุณต้องการจะทำ และสามารถใช้ได้กับทุกแพลตฟอร์ม (รวมถึง Windows)

ดังนั้นสำหรับตัวอย่างของคุณสิ่งที่คุณต้องทำคือ:

curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com

ซึ่งจับจาก Wireshark จะทำให้คุณ:

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11

Hello world

คุณสามารถปรับเปลี่ยนส่วนหัวเพิ่มเติมได้อย่างง่ายดายหากคุณต้องการทำทุกสิ่ง (เช่นเปลี่ยน user-agent ฯลฯ )

แก้ไข: ไม่พบข้อกำหนด "จากไฟล์" คุณสามารถทำได้เช่นกันทั้ง ASCII ธรรมดาหรือไฟล์ไบนารี คุณเพียงระบุชื่อไฟล์ที่มีสัญลักษณ์ @

-d @/tmp/HelloWorldFile

ขดเกือบจะเป็นสิ่งที่ฉันต้องการ แต่ฉันต้องระบุส่วนหัวในบรรทัดคำสั่งซึ่งทำไม่ได้มาก ฉันต้องการบางสิ่งที่ทำให้ฉันสามารถระบุข้อความทั้งหมดของคำขอรวมถึงวิธีการและส่วนหัวจากไฟล์และ ncat ทำสิ่งที่ฉันต้องการอย่างแน่นอน ขอบคุณอยู่ดี :-)
Andrea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.