Autor: Richard Klem
Login: xklemr00
Email: [email protected]
Jazyk: Python
Verze jazyka: 3.6.9
Python 3.6.9
GNU make
make run PORT=XYZ
kde XYZ
značí celé číslo portu, který má skript server.py obsluhovat
implicitní hodnota proměnné PORT je rovna 5353
Část Podporované operace částečně opakuje zadání projektu, avšak
původní text je parafrázován a hojně doplněn o popis mé vlastní implementace
případů, stavů, možností apod., které nebyli v zadání specifikovány.
Je tedy důležité, přečíst si popis mojí implementace, pro správné
pochopení, jak konkrétně moje implementace serveru funguje a jaké jsou
doplňující požadavky, rozšíření a omezení na práci se serverem.
Přeloží právě jeden dotaz, který je specifikován jako parametr URL požadavku,
například:
GET /resolve?name=apple.com&type=A HTTP/1.1
Povinně je nutné dodržet formát po částech následovně:
GET /resolve?name=
, &type=
a HTTP/1.1
Za name=
a type=
může následovat libovolná posloupnost znaků.
parametry jsou povinně právě tyto dva:
name
= doménové jméno anebo IPv4 adresa
type
= typ požadované odpovědi (A nebo PTR)
Odpovědí je právě jeden řádek formátu:
DOTAZ:TYP=ODPOVED
Například:
apple.com:A=17.142.160.59
V případě nalezení odpovědi se vrací status code 200 OK
a přeložená
odpověď.
Není-li odpověď nalezena, vrací se status code 404 Not Found
.
Je-li zadán některý parametr chybně nebo chybí, vrací se status code
400 Bad Request
.
Metoda POST obsahuje v těle požadavku seznam dotazů, každý musí být
na samostatném řádku. Seznam nesmí být proložen žádnými prázdnými řádky
ani jimi nesmí začínat. Na konci seznamu je povoleno jedno odřádkování.
Tedy na konci řádku, na kterém se nachází poslední dotaz je povolen
jeden bílý znak \n
.
Řádek požadavku je povinně:
POST /dns-query HTTP/1.1
Řádek v těle obsahující jeden dotaz má formát:
DOTAZ:TYP
kde:
DOTAZ
- doménové jméno nebo IP adresa
TYP
- typ požadované odpovědi (A nebo PTR)
Například:
www.fit.vutbr.cz:A
apple.com:A
147.229.14.131:PTR
seznam.cz:A
V případě, že pro alespoň jeden požadavek byla nalezena odpověď,
je výsledkem status code 200 OK
a seznam odpovědí.
V případě, že pro konkrétní dotaz nebyla nalezena odpověď, je tento
požadavek ignorován.
V případě, že z celého seznamu dotazů se nepodařilo přeložit ani jeden
dotaz, je navrácen status code 400 Bad Request
pokud alespoň jeden
příkaz implikoval tento status code. V situaci, kdy se nepodařilo
přeložit ani jeden dotaz, ale žádný neskončil se status code
400 Bad Request
, je navrácen status code 404 Not Found
.
V případě, že se prázdný řádek vyskytl na začátku nebo uprostřed
seznamu dotazů nebo za posledním(mimo jeden povolený) dotazem v seznamu
dotazů, je navrácen status code 400 Bad Request
a to bez seznamu
odpovědí!
Skript namapuje server na zadanou nebo implicitní hodnotu portu.
Na tomto portu bude server běžet dokud ho uživatel neukončí pomocí
signálu SIGINT napřílad pomocí "Ctrl + C".
Program sestává z jedné funkce, v které běží v nekonečné smyčce, kde
čeká na příchozí soket, který zpracuje se souladem s popisem v části
Podporované operace a následně je připraven na přijmutí dalšího
soketu.