Dalam fungsi `handle_connection`, kita memproses request yang masuk dari browser. Berikut adalah penjelasan metode yang digunakan:
1.**`BufReader::new(&mut stream)`**: Kita membungkus `TcpStream` menggunakan `BufReader`. Ini bertujuan untuk menambahkan *buffering*, sehingga pembacaan data menjadi lebih efisien karena kita bisa memanggil fungsi seperti `.lines()` untuk membaca data baris per baris secara langsung, daripada membaca byte demi byte secara manual.
2.**`.lines()`**: Mengubah `BufReader` menjadi iterator yang mengembalikan setiap baris teks dari *stream*.
3.**`.map(|result| result.unwrap())`**: Karena setiap baris yang dibaca mengembalikan tipe `Result` (bisa sukses atau error), kita menggunakan `.map()` dan `.unwrap()` untuk mengekstrak nilai `String` dari `Result::Ok` secara langsung (mengasumsikan tidak ada error saat pembacaan demi kesederhanaan).
4.**`.take_while(|line| !line.is_empty())`**: HTTP request header selalu diakhiri dengan dua buah *newline* (baris kosong). Fungsi ini akan terus membaca baris dari stream *sampai* menemukan baris kosong tersebut, lalu berhenti. Ini mencegah program *hang* karena menunggu data yang tidak akan dikirim lagi oleh browser.
5.**`.collect()`**: Mengumpulkan semua baris teks yang sudah diproses di atas ke dalam sebuah koleksi vektor (`Vec<_>`), yang kemudian kita simpan ke variabel `http_request` untuk di-print.