Python posiada wbudowany serwer www, który można uruchomić za pomocą polecenia
python -m SimpleHTTPServer 8000
, który serwuje pliki z aktualnego katalogu.
W tym artykule natomiast, przedstawię jak napisać prosty serwer HTTP za pomocą gniazd
(ang. sockets).
Pierwszą rzeczą, jest zaimportowanie potrzebnych modułów:
Nasz główny program powinien otworzyć gniazdo, i nasłuchiwać na wybranym porcie, następnie powinien utworzyć wątek dla każdego połączenia, który obsłuży tego klienta.
Jeśli z jakiegoś powodu nie zamkniecie połączenia i zabijecie proces Pythona, bind
wyrzuci wyjątek socket.error
, aby temu zaradzić będziecie musieli „odzyskać” gniazdo,
za pomocą tej linijki:
Ale powyższy skrypt obsługuje zabicie procesu za pomocą CTRL+C
dlatego nie powinno się
to wydarzyć, chyba że wasz kod wyrzuci wyjątek.
Następnym krokiem, jest napisanie głównej funkcji, która jest przekazywana jako parametr
target
do konstruktora threading.Thread
. Funkcja handler
wygląda tak:
W powyższej funkcji, użyto zmiennej header_re
, która zawiera wyrażenie regularne, które
pozwala na wyłuskanie metody HTTP oraz ścieżki do pliku:
W funkcji handler
użyto kilku funkcji pomocniczych:
get_request_data
, która czyta wszystkie dane z gniazda i zwraca listę. W naszym programie używamy tylko pierwszego elementu czyli nagłówków protokołu HTTP. Drugim elementem byłyby dane wysłane za pomocą metody POST.
- funkcja
status
, która zwraca status HTTP wraz z kodem, tylko dwa rodzaje 404 oraz 200 zostały użyte.
response
- funkcja, która zwraca odpowiedź HTTP jako ciąg znaków:
mime
jest ostatnią użytą funkcją, która zwraca MIME czyli typ, który jest rozpoznawany przez przeglądarkę, np.text/html
. Typ MIME informuje przeglądarkę, jak wyświetlić odpowiedź z serwera. Nic nie stoi na przeszkodzie aby np. wyświetlić stronę z rozszerzeniem html jako obrazek. (jeśli nie jest to obrazek, to wyświetli się ikonka niepoprawnego obrazka)
Zamiast funkcji, można by też użyć słownika, którego kluczami byłyby rozszerzenia, natomiast wartościami typy MIME.
Jest to przykład prostego serwera, który może być przydatny w debugowaniu, można go rozszerzyć np. o skrypty CGI albo o obsługę plików PHP (aby dodać pliki PHP należałoby skorzystać z polecenia PHP, ale przed wywołaniem należałoby przypisać odpowiednie zmienne środowiskowe, dodam że nie testowałem).
Cały skrypt można znaleźć na githubie.
Więcej informacji o protokole HTTP, możesz znaleźć w Wikipedii, natomiast pełny opis protokołu, można znaleźć w dokumentach RFC (ang. Request for Comments).
Komentarze
Hasło, które podasz umożliwi ponowne zalogowanie się i np. usunięcie komentarza, jest dobrowolne. Email jest szyfrowany i używany do wysyłania powiadomień o odpowiedziach do komentarzy oraz do pobierania awatara dzięki usłudze Gravatar.com.