Odczyt zapytań HTTP
Po przekazaniu do danego wątku polecenia obsługi połączenia z klientem, tworzony jest bufor do odczytu danych od klienta. Następnie w nieskończonej pętli tworzone są kolejne obiekty Request przechowujące informacje o zapytaniu. Każde zapytanie powinno zwrócić odpowiedź (obiekt Response). Odpowiedź jest tworzona w jednej z metod obiektu Request. Następnie utworzona odpowiedź wysyłana jest do klienta. Jeżeli w obiekcie Response znajdzie się informacja o zakończeniu połączenia, przerywana jest pętla odczytu zapytań i wywoływana jest metoda przerywająca połączenie. Po zakończeniu połączenia wątek jest zwracany do puli wątków, lub usuwany.
Podczas tworzenia obiektu zapytania, przekazany jest do niego bufor z danymi wysłanymi przez klienta. Tworzenie zapytania rozpoczyna się od odczytu linii rozpoczynającej z metodą, adresem zasobu i wersją protokołu, następnie odczytywane są nagłówki. Przy odczytywaniu nagłówków do klasy HTTPRequestHeader przekazywane są kolejne linie odczytywane z bufora, gdzie następuje ich przetwarzanie – utworzenie kolejnych wierszy nagłówka, lub dodanie wartości do poprzednio przetwarzanego nagłówka, jeśli w linii znajduje się kontynuacja wcześniejszej wartości. Dodawanie wierszy nagłówka kończy się wraz z pierwszą napotkaną pusta linią.
Po pobraniu całego nagłówka zapytania, nie jest jednak od razu odczytywane ciało zapytania. Wcześniej trzeba na podstawie otrzymanych nagłówków utworzyć obiekt odpowiedzi. Wymagane jest to ze względu, że w nagłówkach zapytania mogła się znaleźć informacja o oczekiwaniu przez klienta na status 100 Continue, zanim zacznie on wysyłać do serwera ciało zapytania. Tworząc w tym momencie odpowiedź można ustalić, czy np. dany zasób do którego klient chce wysłać jakieś ciało istnieje. Jeżeli zasób nie istnieje, lub z jakiegoś innego powodu serwer nie zgadza się na przesłanie dalszej części zapytania, może o tym poinformować klienta (wysyłając status 417 Expectation Failed).
Po utworzeniu obiektu Response można wrócić do odczytu ciała zapytania. Sprawdzane jest teraz w pierwszej kolejności, czy w zapytaniu zostały wysłane jakieś informacje o tym, że do wiadomości dołączony jest jakiś zasób – nagłówek „Content-Length” zapytania. Jeżeli taki nagłówek nie istnieje, bądź jego wartość jest mniejsza niż 1, następuje przerwanie funkcji odczytującej zasób i kolejne dane w buforze klienta będą traktowane jako osobne zapytanie. Jeżeli w nagłówku zapytania znalazła się informacja o jakimś zasobie, sprawdzane jest, czy klient oczekuje statusu 100 Continue i jeżeli tak, sprawdzane jest, czy obiekt odpowiedzi zezwala na ciało w zapytaniu i następuje wysłanie takiej informacji do klienta. Gdy serwer zezwala na pobranie zasobu od klienta, następuje odczytanie z bufora takiej ilości danych, jaką klient zadeklarował w nagłówku „Content-Length”.
Decyzję o tym, czy połączenie zostanie podtrzymane w celu pobrania następnego zapytania, czy przerwane po wysłaniu odpowiedzi podejmuje obiekt Response na podstawie otrzymanych od klienta informacji. Jeżeli po wysłaniu odpowiedzi połączenie nie zostało zerwane następuje utworzenie kolejnego obiektu Request, który w ten sam sposób z bufora pobiera informacje od klienta.
Serwer HTTP 