Saya telah mengunduh Privoxy beberapa minggu lalu dan untuk bersenang-senang saya ingin tahu bagaimana versi sederhana dapat dilakukan.
Saya mengerti bahwa saya perlu mengkonfigurasi browser (klien) untuk mengirim permintaan ke proxy. Proxy mengirim permintaan ke web (katakanlah itu proxy http). Proxy akan menerima jawabannya ... tetapi bagaimana proxy mengirim kembali permintaan ke browser (klien)?
Saya telah mencari proxy C # dan http di web tetapi belum menemukan sesuatu yang membuat saya mengerti cara kerjanya di belakang layar dengan benar. (Saya percaya saya tidak ingin proksi terbalik tetapi saya tidak yakin).
Apakah ada di antara Anda yang memiliki beberapa penjelasan atau informasi yang akan membuat saya melanjutkan proyek kecil ini?
Memperbarui
Inilah yang saya mengerti (lihat grafik di bawah).
Langkah 1 Saya mengonfigurasikan klien (browser) untuk semua permintaan agar dikirim ke 127.0.0.1 di port yang Proxy dengarkan. Dengan cara ini, permintaan tidak akan dikirim ke Internet secara langsung tetapi akan diproses oleh proxy.
Step2 Proxy melihat koneksi baru, membaca header HTTP dan melihat permintaan yang harus dijalankan. Dia mengeksekusi permintaan itu.
Step3 Proxy menerima jawaban dari permintaan. Sekarang dia harus mengirim jawaban dari web ke klien tapi bagaimana caranya ???
Tautan yang bermanfaat
Mentalis Proxy : Saya telah menemukan proyek ini yang merupakan proxy (tetapi lebih banyak yang saya inginkan) Saya mungkin memeriksa sumbernya tetapi saya benar-benar menginginkan sesuatu yang mendasar untuk lebih memahami konsepnya.
ASP Proxy : Saya mungkin bisa mendapatkan beberapa informasi di sini juga.
Permintaan reflektor : Ini adalah contoh sederhana.
Berikut adalah Repositori Git Hub dengan Proxy Http Sederhana .
Jawaban:
Anda dapat membangun satu dengan
HttpListener
kelas untuk mendengarkan permintaan yang masuk danHttpWebRequest
kelas untuk menyampaikan permintaan.sumber
Saya tidak akan menggunakan HttpListener atau sesuatu seperti itu, dengan cara itu Anda akan menemukan begitu banyak masalah.
Yang terpenting adalah dukungan yang sangat besar:
Yang perlu Anda lakukan adalah:
Saya menulis 2 proksi HTTP berbeda di .NET dengan persyaratan berbeda dan saya dapat memberi tahu Anda bahwa ini adalah cara terbaik untuk melakukannya.
Mentalis melakukan ini, tetapi kode mereka adalah "delegate spaghetti", lebih buruk daripada GoTo :)
sumber
Saya baru-baru ini menulis proksi ringan di c # .net menggunakan TcpListener dan TcpClient .
https://github.com/titanium007/Titanium-Web-Proxy
Ini mendukung HTTP aman dengan cara yang benar, mesin klien perlu memercayai sertifikat root yang digunakan oleh proxy. Juga mendukung relai WebSockets. Semua fitur HTTP 1.1 didukung kecuali pipelining. Pipelining tidak digunakan oleh sebagian besar browser modern. Juga mendukung otentikasi windows (polos, intisari).
Anda dapat menghubungkan aplikasi Anda dengan merujuk proyek dan kemudian melihat dan memodifikasi semua lalu lintas. (Permintaan dan tanggapan).
Sejauh kinerja, saya telah mengujinya di komputer saya dan bekerja tanpa penundaan yang nyata.
sumber
Proxy dapat bekerja dengan cara berikut.
Langkah 1, konfigurasikan klien untuk menggunakan proxyHost: proxyPort.
Proxy adalah server TCP yang mendengarkan pada proxyHost: proxyPort. Browser membuka koneksi dengan Proxy dan mengirimkan permintaan Http. Proxy mem-parsing permintaan ini dan mencoba mendeteksi tajuk "Host". Header ini akan memberi tahu Proxy tempat membuka koneksi.
Langkah 2: Proxy membuka koneksi ke alamat yang ditentukan dalam header "Host". Kemudian mengirimkan permintaan HTTP ke server jauh itu. Membaca respons.
Langkah 3: Setelah respons dibaca dari server HTTP jauh, Proxy mengirimkan respons melalui koneksi TCP yang dibuka sebelumnya dengan browser.
Secara skematis akan terlihat seperti ini:
sumber
Jika Anda hanya ingin mencegat lalu lintas, Anda bisa menggunakan inti fiddler untuk membuat proksi ...
http://fiddler.wikidot.com/fiddlercore
jalankan fiddler terlebih dahulu dengan UI untuk melihat fungsinya, itu adalah proxy yang memungkinkan Anda untuk men-debug lalu lintas http / https. Itu ditulis dalam c # dan memiliki inti yang dapat Anda bangun ke dalam aplikasi Anda sendiri.
Perlu diingat FiddlerCore tidak gratis untuk aplikasi komersial.
sumber
Setuju untuk melakukan kejahatan jika Anda menggunakan HTTPListener, Anda akan memiliki banyak masalah, Anda harus mengurai permintaan dan akan bertunangan dengan header dan ...
Anda tahu Anda bahkan tidak perlu tahu apa yang ada dalam permintaan browser dan menguraikannya, hanya dapatkan alamat situs target dari baris pertama, baris pertama biasanya menyukai ini. Dapatkan http://google.com HTTP1.1 atau CONNECT facebook.com: 443 (ini untuk permintaan ssl)
sumber
Banyak hal menjadi sangat mudah dengan OWIN dan WebAPI. Dalam pencarian saya untuk server C # Proxy, saya juga menemukan posting ini http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Ini akan menjadi jalan yang saya ambil.
sumber
Socks4 adalah protokol yang sangat sederhana untuk diimplementasikan. Anda mendengarkan koneksi awal, menyambungkan ke host / port yang diminta oleh klien, mengirim kode sukses ke klien kemudian meneruskan aliran keluar dan masuk melintasi soket.
Jika Anda menggunakan HTTP, Anda harus membaca dan mungkin mengatur / menghapus beberapa tajuk HTTP sehingga sedikit lebih banyak pekerjaan.
Jika saya ingat dengan benar, SSL akan bekerja di proxy HTTP dan Socks. Untuk proksi HTTP, Anda menerapkan kata kerja CONNECT, yang berfungsi seperti socks4 seperti yang dijelaskan di atas, kemudian klien membuka koneksi SSL melintasi aliran tcp yang diproksi.
sumber
Browser terhubung ke proxy sehingga data yang didapat proxy dari server web hanya dikirim melalui koneksi yang sama seperti yang diinisiasi browser ke proxy.
sumber
Untuk apa nilainya, berikut ini adalah implementasi async sampel C # berdasarkan HttpListener dan HttpClient (Saya menggunakannya untuk dapat menghubungkan Chrome di perangkat Android ke IIS Express, itulah satu-satunya cara saya menemukan ...).
Dan Jika Anda memerlukan dukungan HTTPS, seharusnya tidak memerlukan lebih banyak kode, hanya konfigurasi sertifikat: Httplistener dengan dukungan HTTPS
sumber