@@ -7,3 +7,15 @@ Dalam fungsi `handle_connection`, kita memproses request yang masuk dari browser
...
@@ -7,3 +7,15 @@ Dalam fungsi `handle_connection`, kita memproses request yang masuk dari browser
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).
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.
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.
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.
Pada code yang baru ditambahkan di `handle_connection`, server sekarang mengirimkan response yang valid sesuai HTTP Protocol. Berikut hal baru yang dipelajari:
1.**`fs::read_to_string("hello.html")`**: Digunakan untuk membaca seluruh isi file HTML dan mengubahnya menjadi tipe data `String` di Rust agar bisa dikirimkan sebagai *body* dari HTTP response.
2.**`HTTP/1.1 200 OK`**: Ini adalah *status line* standar dari HTTP yang memberitahu browser bahwa *request* berhasil diproses.
3.**`Content-Length`**: Header HTTP yang wajib disertakan agar browser tahu seberapa besar ukuran data (dalam byte) yang akan diterima. Kita menghitungnya menggunakan `contents.len()`.
4.**Format Response (`\r\n\r\n`)**: Protokol HTTP mensyaratkan penggunaan CRLF (`\r\n`) untuk memisahkan setiap baris header. Selain itu, harus ada dua buah CRLF (`\r\n\r\n`) yang berfungsi sebagai pemisah mutlak antara bagian *Headers* dan bagian *Body* (isi konten HTML).
5.**`stream.write_all`**: Mengirimkan seluruh *string* balasan yang sudah diformat tadi (diubah menjadi *bytes*) kembali melalui TCP stream ke browser.