Cara memecahkan masalah konektivitas ketika curl mendapat * respons kosong *

27

Saya ingin tahu cara melanjutkan pemecahan masalah mengapa permintaan ikal ke server web tidak berfungsi. Saya tidak mencari bantuan yang tergantung pada lingkungan saya, saya hanya ingin tahu cara mengumpulkan informasi tentang bagian komunikasi yang gagal, nomor port, dll.

chad-integration:~ # curl -v 111.222.159.30
* About to connect() to 111.222.159.30 port 80 (#0)
*   Trying 111.222.159.30... connected
* Connected to 111.222.159.30 (111.222.159.30) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
> Host: 111.222.159.30
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host 111.222.159.30 left intact
curl: (52) Empty reply from server
* Closing connection #0

Jadi, saya mengerti bahwa respons kosong berarti bahwa curl tidak mendapatkan respons dari server. Tidak masalah, justru itulah yang saya coba cari tahu.

Tapi info apa lagi yang bisa saya dapatkan dari CURL di sini?

Itu berhasil "terhubung", jadi tidakkah itu melibatkan komunikasi dua arah? Jika demikian, lalu mengapa tanggapannya tidak juga datang? Catatan, saya telah memverifikasi layanan saya sudah habis dan mengembalikan tanggapan.

Catatan, saya agak hijau di tingkat jaringan ini, jadi jangan ragu untuk memberikan beberapa materi orientasi umum.

chad
sumber
1
Saya mendapatkan kesalahan yang sama, tetapi dalam kasus saya itu adalah perangkat lunak VPN yang mencegat dan memblokir lalu lintas jaringan tertentu. Lihat di sini untuk lebih lanjut: stackoverflow.com/a/24189367/703200
Chris Bartley

Jawaban:

16

Anda mungkin perlu memecahkan masalah ini dari sisi server, bukan sisi klien. Saya yakin Anda mengacaukan 'respons kosong' dengan 'tidak ada respons'. Mereka tidak bermaksud hal yang sama. Kemungkinan Anda mendapatkan balasan yang tidak mengandung data apa pun.

Anda dapat menguji ini dengan hanya menggunakan telnet daripada melalui curl:

telnet 111.222.159.30 80

Setelah terhubung, rekatkan yang berikut ini (diambil dari output ikal Anda):

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: 111.222.159.30
Accept: */*

Anda harus melihat respons persis seperti yang dilihat oleh ikal.

Salah satu kemungkinan alasan Anda mendapat balasan kosong adalah karena Anda mencoba membuka situs web yang merupakan host virtual berbasis nama. Jika itu masalahnya, tergantung pada konfigurasi server (situs yang Anda coba tekan kebetulan dikonfigurasikan sebagai default), Anda tidak dapat mencapai situs dengan alamat IP tanpa sedikit kerja.

Anda dapat mengujinya di sisi klien hanya dengan mengubah baris 'Host' di atas; ganti www.example.com dengan situs yang ingin Anda jangkau:

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: www.example.com
Accept: */*
Yoonix
sumber
Saya berhasil mendapatkan kembali halaman tersebut dari klien lain. Ini khusus untuk jaringan tertentu tempat klien berada, saya pikir.
chad
Dan, untuk respons kosong = tidak ada respons, saya dapat dari stackoverflow.com/questions/5929971/… , tapi saya bersedia mempertimbangkan pendapat kedua;)
chad
1
Anda masih perlu memecahkan masalah dari sisi server. Jika server tidak mengirim data, klien tidak akan tahu mengapa. Hanya tahu itu tidak mengerti. Adapun kosong vs tidak, saya menemukan server yang curl mengeluh tentang respons 'kosong' dan saya pasti menerima respons. * Empty reply from serverdari curl, menghubungkan langsung menunjukkan semua header http yang relevan dengan tubuh yang murni terdiri dari <!-- b5 -->. Jika ia bekerja dengan curl di tempat lain dan tidak pada satu jaringan tertentu, saya akan melihat perbedaan pada jaringan itu. Proksi yang berperilaku buruk mungkin?
yoonix
7

Curl baik-baik saja, tetapi tidak memberikan banyak umpan balik ketika ada masalah. (Seperti yang Anda tahu) wget dapat memberi Anda informasi lebih lanjut, tetapi seperti yoonix menyebutkan, sisi Server (yaitu log kesalahan server web) adalah tempat untuk mencari.

wget -S -O /dev/null http://www.example.com

Anda dapat mengatur nama host juga dengan

wget -s -O /dev/null --header="Host: foo.bar" http://www.example.com
GeoSword
sumber
2

Coba ini -> Daripada melalui CURL, coba ping situs yang Anda coba jangkau dengan Telnet. Respons yang dikembalikan oleh upaya koneksi Anda akan persis seperti yang dilihat CURL saat mencoba terhubung (tapi tidak berhasil jika tidak Anda gunakan). Sekarang, tergantung pada apa yang Anda lihat di sini, Anda mungkin menarik satu dari beberapa kesimpulan:

Anda sedang mencoba untuk terhubung ke situs web yang merupakan host virtual berbasis nama, yang berarti itu tidak dapat dicapai melalui alamat IP. Ada yang salah dengan nama host - Anda mungkin salah ketik. Perhatikan bahwa menggunakan GET daripada POST untuk parameter akan memberi Anda jawaban yang lebih konkret.

Masalah ini juga dapat dikaitkan dengan tajuk 100-lanjut. Coba jalankan curl_getinfo ($ ch, CURLINFO_HTTP_CODE), dan periksa hasilnya.

Felix
sumber
1
Catatan (karena saya melihat Anda memposting jawaban yang sama di pertanyaan cURL yang berbeda): pertanyaan ini adalah tentang cURL, biner CLI, dan bukan implementasi PHP wrapper yang Anda referensikan. Dengan kata lain, tidak ada yang namanya getinfoflag atau fitur untuk CLI cURL. @lihat curl.haxx.se
ken
0

Dalam beberapa kesempatan di bawah WSL Windows. Menjalankan curl di dalam bash akan menghasilkan kesalahan yang sama dan itu karena Kasperksy memblokirnya agar tidak terhubung ke HTTP / s.

Bug ini telah dilaporkan di sini .

Solusi cepat adalah dengan menonaktifkan perlindungan Kaspersky pada port yang Anda coba jangkau di server (tcp 80 untuk exmaple).

Ini dilakukan dengan masuk ke Kaspersky - Pengaturan - Pengaturan Jaringan - centang "Pantau port terpilih saja" - Pilih port - klik ganda pada port (80) dan pilih tidak aktif

masukkan deskripsi gambar di sini

AK_
sumber