Proyek ini diselesaikan sebagai bagian dari 42 kurikulum inti. itu dilakukan dengan alouane04
Tujuan dari proyek ini adalah untuk membangun server web HTTP C ++ 98 yang kompatibel dari awal. Server Web dapat menangani permintaan HTTP Get, Head, Post, Plt, dan Hapus, dan dapat melayani file statis dari direktori root yang ditentukan atau konten dinamis menggunakan CGI. Ini juga dapat menangani beberapa koneksi klien secara bersamaan dengan bantuan Select ().
Penggunaan
Perkenalan
Bagian dari server web
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP (Hypertext Transfer Protocol) adalah protokol untuk mengirim dan menerima informasi melalui Internet. Ini adalah fondasi World Wide Web dan digunakan oleh browser web dan server web untuk berkomunikasi satu sama lain.
Server Web HTTP adalah aplikasi perangkat lunak yang mendengarkan dan menanggapi permintaan HTTP dari klien (seperti browser web). Tujuan utama server web adalah untuk meng -host konten web dan membuatnya tersedia untuk pengguna melalui internet.
HTTP terdiri dari permintaan dan tanggapan. Ketika klien (seperti browser web) ingin mengambil halaman web dari server, ia mengirimkan permintaan HTTP ke server. Server kemudian memproses permintaan dan mengirimkan kembali respons HTTP.
Format pesan http
start-line CRLF
Headers CRLF
CRLF(end of headers)
[message-body]
CRLF are Carriage Return and Line Feed (rn), which is just a new line.
Pesan HTTP dapat berupa permintaan atau tanggapan.
Permintaan HTTP
Permintaan HTTP terdiri dari jalur permintaan, header, dan badan pesan opsional. Berikut adalah contoh permintaan HTTP:
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Baris permintaan terdiri dari tiga bagian: metode, jalur, dan versi http. Metode ini menentukan tindakan yang ingin dilakukan klien, seperti Get (untuk mengambil sumber daya) atau memposting (untuk mengirimkan data ke server). Path atau URI menentukan lokasi sumber daya di server. Versi HTTP menunjukkan versi protokol HTTP yang digunakan.
Header berisi informasi tambahan tentang permintaan, seperti nama host server, dan jenis browser yang digunakan.
Dalam contoh di atas tidak ada badan pesan karena metode mendapatkan biasanya tidak termasuk tubuh apa pun.
Respons http
Respons HTTP juga terdiri dari garis status, header, dan badan pesan opsional. Berikut adalah contoh respons HTTP:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
Baris status terdiri dari tiga bagian: versi http, kode status, dan frasa alasan. Kode status menunjukkan hasil permintaan, seperti 200 OK (berhasil) atau 404 tidak ditemukan (sumber daya tidak ditemukan). Frasa alasan adalah deskripsi singkat dari kode status. Berikut ini adalah ringkasan yang sangat singkat tentang apa yang ditunjukkan oleh kode status:
1xx hanya menunjukkan pesan informasi
2xx menunjukkan semacam keberhasilan
3xx mengarahkan kembali klien ke URL lain
4xx menunjukkan kesalahan pada bagian klien
5xx menunjukkan kesalahan pada bagian server
Header berisi informasi tambahan tentang respons, seperti jenis dan ukuran konten yang dikembalikan. Badan pesan berisi konten aktual dari respons, seperti kode HTML untuk halaman web.
Metode HTTP
| Metode | Keterangan | Kemungkinan tubuh |
|---|---|---|
GET | Ambil sumber daya tertentu atau kumpulan sumber daya, tidak boleh mempengaruhi data/sumber daya | TIDAK |
POST | Lakukan pemrosesan spesifik sumber daya pada konten permintaan | Ya |
DELETE | Menghapus sumber daya target yang diberikan oleh URI | Ya |
PUT | Membuat sumber daya baru dengan data dari badan pesan, jika sumber daya sudah ada, perbarui dengan data dalam tubuh | Ya |
HEAD | Sama seperti Get, tetapi jangan mentransfer konten respons | TIDAK |
MENDAPATKAN
HTTP GET Metode digunakan untuk membaca (atau mengambil) representasi sumber daya. Dalam kasus keberhasilan (atau bukan kesalahan), dapatkan pengembalian representasi sumber daya dalam badan respons dan kode status respons HTTP 200 (OK). Dalam kasus kesalahan, paling sering mengembalikan 404 (tidak ditemukan) atau 400 (permintaan buruk).
POS
Metode HTTP Post paling sering digunakan untuk membuat sumber daya baru. Pada pembuatan yang berhasil, HTTP Response Code 201 (dibuat) dikembalikan.
MENGHAPUS
HTTP Delete adalah Stright Forward. Itu menghapus sumber daya yang ditentukan dalam URI. Pada penghapusan yang berhasil, ia mengembalikan kode status respons HTTP 204 (tidak ada konten).
Baca lebih lanjut tentang metode HTTP RFC9110#9.1
Server web HTTP dasar terdiri dari beberapa komponen yang bekerja bersama untuk menerima dan memproses permintaan HTTP dari klien dan mengirim kembali tanggapan. Di bawah ini adalah bagian utama dari server web kami.
Bagian jaringan dari server web yang menangani koneksi TCP dan melakukan tugas seperti mendengarkan permintaan yang masuk dan mengirimkan tanggapan kembali. Ini bertanggung jawab untuk tugas jaringan tingkat rendah dari server web, seperti membuat dan mengelola soket, menangani aliran input dan output, dan mengelola aliran data antara server dan klien.
Sebelum menulis server web Anda, saya akan merekomendasikan membaca panduan luar biasa ini tentang membangun klien/server TCP sederhana di C karena akan membantu Anda mendapatkan pemahaman yang baik tentang bagaimana TCP bekerja di C/C ++. Anda juga perlu memahami multiplixing I/O, video ini akan membantu Anda memahami ide utama Select ().
Proses multiplexing I/O di server web kami dirangkum dalam diagram alur di bawah ini. (CGI tidak termasuk dalam diagram alur tetapi dapat ditambahkan di masa depan)
Bagian parsing dari server web mengacu pada proses yang bertanggung jawab untuk menafsirkan dan mengekstraksi informasi dari permintaan HTTP. Di server web ini, penguraian permintaan dilakukan oleh kelas HTTPREQUEST. Objek HTTPRequest menerima permintaan yang masuk, menguraikannya, dan mengekstraksi informasi yang relevan seperti metode, jalur, header, dan badan pesan (jika ada). Jika ada kesalahan sintaks yang ditemukan dalam permintaan selama penguraian, bendera kesalahan diatur dan pemberhentian parsing. Permintaan dapat diumpankan ke objek melalui umpan metode () baik sepenuhnya atau sebagian, ini dimungkinkan karena parser memindai byte permintaan pada suatu waktu dan memperbarui keadaan parsing kapan pun diperlukan. Cara penguraian yang sama digunakan oleh Nginx dan NodeJS meminta parser.
Di bawah ini adalah gambaran tentang cara kerja parser.
Pembuat respons bertanggung jawab untuk membangun dan memformat respons HTTP yang dikirim kembali ke klien sebagai tanggapan atas permintaan mereka. Di server web ini, kelas respons bertanggung jawab untuk membangun dan menyimpan respons HTTP, termasuk garis status, header, dan badan pesan. Pembuat respons juga dapat melakukan tugas -tugas seperti mengatur kode status yang sesuai dan frasa alasan berdasarkan hasil dari permintaan, menambahkan header ke respons untuk memberikan informasi tambahan tentang konten atau server, dan memformat badan pesan sesuai dengan jenis konten dan pengkodean respons. Misalnya, jika server menerima permintaan halaman web dari klien, server akan menguraikan permintaan dan meneruskannya ke objek respons yang akan mengambil konten halaman web dan membangun respons HTTP dengan konten HTML di badan pesan dan header yang sesuai, seperti header tipe konten dan konten-panjang.
File konfigurasi adalah file teks yang berisi berbagai pengaturan dan arahan yang menentukan bagaimana server web harus beroperasi. Pengaturan ini dapat mencakup hal -hal seperti nomor port yang harus didengarkan server web, lokasi direktori root server web, dan banyak pengaturan lainnya.
Berikut adalah contoh FIE yang menunjukkan format file konfigurasi dan arahan yang didukung.
server {
listen 8001 ; # listening port, mandatory parameter
host 127.0.0.1; # host or 127.0.0.1 by default
server_name test; # specify server_name, need to be added into /etc/hosts to work
error_page 404 /error/404.html; # default error page
client_max_body_size 1024 ; # max request body size in bytes
root docs/fusion_web/; # root folder of site directory, full or relative path, mandatory parameter
index index.html; # default page when requesting a directory, index.html by default
location /tours {
root docs/fusion_web; # root folder of the location, if not specified, taken from the server.
# EX: - URI /tours --> docs/fusion_web/tours
# - URI /tours/page.html --> docs/fusion_web/tours/page.html
autoindex on ; # turn on/off directory listing
allow_methods POST GET; # allowed methods in location, GET only by default
index index.html; # default page when requesting a directory, copies root index by default
return abc/index1.html; # redirection
alias docs/fusion_web; # replaces location part of URI.
# EX: - URI /tours --> docs/fusion_web
# - URI /tours/page.html --> docs/fusion_web/page.html
}
location cgi-bin {
root ./; # cgi-bin location, mandatory parameter
cgi_path /usr/bin/python3 /bin/bash; # location of interpreters installed on the current system, mandatory parameter
cgi_ext .py .sh; # extensions for executable files, mandatory parameter
}
}CGI adalah standar untuk menjalankan program eksternal dari server web. Ketika pengguna meminta halaman web yang harus ditangani oleh program CGI, server web menjalankan program dan mengembalikan output ke browser web pengguna.
Program CGI hanyalah skrip yang dapat ditulis dalam bahasa pemrograman apa pun, seperti Perl, Python, atau Bash, dan biasanya digunakan untuk memproses data yang dikirimkan oleh pengguna melalui browser web, atau untuk menghasilkan konten dinamis pada halaman web.