Witam
Piszę serwer www w środowisku programowania opartym na C (https://github.com/overcq/oux, a serwer to https://github.com/overcq/oux/tree/master/program/web-srv). Jednak mam pewien problem.
Uruchamiam serwer na localhost, ustawiony do katalogu, gdzie jest zainstalowany Wordpress, i patrzę do logu serwera na bieżące nadchodzące i obsługiwane połączenia. Okazuje się, że przychodzi co najwyżej jedno, a rzadko kiedy drugie połączenie, ale po każdej transmisji jednego żądania HTTP serwer czeka na wysłanie kolejnego żądania przez klienta, lecz upływa limit czasu (5 sekund) i serwer rozłącza się, a wtedy następuje kolejne połączenie od klienta.
Z tego powodu też na stronie diagnostycznej Wordpress wypisuje błędy krytyczne, że upłynął limit czasu 10001 milisekund na żądanie REST API. Nie wspominając nawet o tym, że strony wczytuje długo.
Jak można zobaczyć w logu, klient żąda HTTP/1.1 i serwer odpowiada tym samym, a ponadto na wszelki wypadek też jest wysyłane Connection: keep-alive. Jednak nadal przeglądarka www trzyma połączenie, a nie wysyła żądania. Testowałem na Firefox i Chromium.
Kolejny warunek: Content-Length. Jest ono wysyłane dla statycznych plików, a dla skryptów, dla których serwer uruchamia PHP przez CGI, jest używany Transfer-Encoding: chunked. I w tym ostatnim przypadku klient czasem wysyła drugie żądanie na tym samym połączeniu.
Jakie muszą być spełnione warunki, by persistent connections były przez przeglądarkę www obsługiwane? A może gdzieś popełniam błąd przy wysyłaniu odpowiedzi?
I drugie pytanie. Po których statusach odpowiedzi (np. HTTP/1.1 500, HTTP/1.1 400) z serwera musi następować rozłączenie? A może nie ma takiej specyfikacji i wszystko zależy od klienta i serwera?
Odpowiedź:
Błąd polegał na tym, że przeglądarka www chciała nawiązać kolejne połączenia, a serwer ich nie odbierał, i na tym się blokowała.
Z treści RFC 2616 wynika, że po dowolnych statusach HTTP może być zachowane persistent connection.