This is an old revision of the document!
Scopul acestei teme este realizarea unui server web care trebuie să servească fițiere și să execute scripturi.
Tema se rezolva individual. Orice tentativă de copiere va rezulta în 0p pentru tema respectiva. Vom utiliza și sisteme automate de detectare a copierii. Dacă avem dubii, vă vom adresa întrebări suplimentare legate de temă.
Daca aveți întrebări legate de temă, vă rugăm să scrieți un issue pe repository-ul de github repository cu titlul de forma [server] <titlul intrebarii voastre>. Aveți nevoie de un cont de github pentru a scrie întrebări.
Daca doriti sa primiti un email cand se pun intrebari noi sau cand apar raspunsuri, accesati github repository si faceti click pe Watch.
Serverul va fi implementat în fișierul index.js
și va fi rulat astfel:
node index.js
În rezolvarea temei veți implementa un server HTTP, care poate procesa cereri prin operații asincrone. Serverul va primi pachete HTTP de la clienți, executa diferite operații și va răspunde cu pachete HTTP (un format simplificat al acestora).
La pornite, serverul va citi un fișier de configurare, aflat în același director cu index.js
. Numele fișierului este config.json
și va conține următoarea structură de tip JSON:
{ "scripts" : "scripts_path", "www" : "root_path" }
scripts_path
este o cale abolută către un director în care se găsesc scripturile ce vor fi rulate de server.
root_path
este o cale absolută către directorul rădăcină, relativ la care se vor face toate cererile. De exemplu, dacă o cerere are calea /images/sunny.png
și root_path
are valoarea /home/server/root
, se va returna fișierul având calea absolută /home/server/root/images/sunny.png
.
Mesajele HTTP primite de server vor avea următorul format generic:
<request_type> <path> HTTP/1.1 <header_key>:<header_value> ... <header_key>:<header_value> <message - optional>
Mesajele HTTP trimise de server vor avea următorul format generic:
HTTP/1.0 <status_code status> <header_key>:<header_value> ... Connection: close <message>
Următoarele variabile vor fi înlocuite astfel:
Prima funcționalitate a serverului este de a returna fișierele cerute de clienți. În acest caz, serverul va primi o cerere de tip GET către un fișier și va răspunde cu conținutul fișierului.
root_path
.
În acest caz, cererea primită de server va fi de forma:
GET <file_path_relative_to_root> HTTP/1.1 Host: localhost:8000 <other header lines>
Prima linie din cerere specifică calea către fișierul cerut. Antetul poate conține și alte linii, pe lângă cele specificate mai sus.
Pentru a răspunde cererilor pentru fișiere, serverul va returna un mesaj de forma:
HTTP/1.1 <status_code status> Content-type: <file_type> Connection: close <file_contents>
În funcție de cererea primită și starea fișierului cerut, starea răspunsului poate fi:
A treia linie din cerere specifică tipul de fișier returnat. În funcție de tipul fișierului,file_type
poate avea următoarele valori:
Unele din mesajele primite de la clienți vor cere rularea unor scripturi. Acest tip de cereri se identifică prin calea fișierului, în acest caz calea fiind un fișier din directorul scripts_path
.
În directorul scripts_path
pot exista orice fel de fișiere executabile. Oricare din acele fișiere va fi rulat cu comanda ./script_name
. După rulare, serverul va răspunde cu rezultatul execuției.
În acest caz, cererea primită de server va fi de forma:
<request_type> <file_path_relative_to_root> HTTP/1.1 Host: localhost:8000 <other header lines> <message - optional>
În acest caz, cererile (request_type
) pot să fie de două feluri: GET
și POST
.
Pentru aceste cereri, liniile din header, exceptând primele două, sunt pasate ca variabile de mediu pentru fișierul care va fi executat.
Dacă cererea este de tip POST, va exista și un corp al mesajului. Acesta este pasat ca input pentru scriptul care va fi executat. Se recomandă folosirea unei structuri de tip pipe
pentru implementarea acestei funcționalități.
În acest caz, serverul va returna un mesaj de forma:
HTTP/1.1 <status_code status> <other_headers> <file_contents>
Exceptând primele două linii din antet, scriptul rulat va genera restul mesajului de răspuns.
Statusul din răspuns va avea una din următoarele valori:
Tema va fi implementată în mediul de programare Node.js și veți folsi funcții asincrone pentru a procesa cererile primite de la clienți.
În rezolvarea temei este admisă doar folosirea de biblioteci native Node.js și se recomandă folosirea următoarelor module:
Tema se va incarca pe vmchecker. Logati-va pe site cu utilizatorul de pe moodle, selectati cursul Systemes d'Explotation (FILS) si incarcati arhiva temei.
Fisierul readme are urmatorul format:
Numele vostru intreg Grupa Descrierea rezolvarii temei, de ce ati ales anumite solutii, etc.
Pentru a incarca tema, urmariti pasii:
Dupa ce incarcati arhiva, vmchecker va rula:
unzip archive.zip homework cd homework make -f Makefile.check