Wyzwanie polega na napisaniu serwera HTTP typu golf-golf, który akceptuje żądania GET. Oczywiście nie musi być w pełni funkcjonalny, ale musi obsługiwać pliki z katalogu.
Zasady:
- Serwer HTTP musi nasłuchiwać na porcie TCP 36895 (0x901F)
- Musi obsługiwać pliki z
/var/www
systemów * NIX (np. Linux) lubC:\hgolf
Windows. - Możesz zignorować wszystkie przychodzące nagłówki HTTP oprócz
GET
samego. - Jeśli metoda HTTP nie jest GET, musisz odesłać kod stanu „405 nieobsługiwany” i treść „405 nieobsługiwany”.
- Jeśli plik nie istnieje, musisz odesłać kod stanu „404 File Not Found” i treść „404 File Not Found”.
- Jeśli plik istnieje, ale z jakiegoś powodu nie można go odczytać, należy odesłać kod stanu „Błąd serwera 500” i treść „Błąd serwera 500”.
- Jeśli użytkownik zażąda
/
lub inny istniejący katalog główny (np./foo/
Gdzie katalogfoo
istnieje/var/www/
), odpowiedz pustą stroną. - Twoja odpowiedź musi zawierać co najmniej minimalne nagłówki, aby umożliwić wyświetlanie treści w Firefox 8.0 i Internet Explorer 8.0
- Musisz odpowiedzieć
Content-Type
zestawem nagłówków, ale musisz obsługiwać tylko rozszerzeniahtml => text/html
itxt => text/plain
. W przypadku każdego innego rozszerzenia pliku wyślijapplication/octet-stream
jako typ zawartości. - Twój kod musi być w stanie przesyłać zarówno ASCII, jak i dane binarne, chociaż nie musisz jawnie rozróżniać między nimi.
- Nie możesz używać bibliotek stron trzecich.
- Nie można używać wbudowanych klas ani funkcji zaprojektowanych do przetwarzania żądań HTTP (np.
HttpListener
W języku C #) - Jeśli Twój kod będzie działał tylko w określonym systemie operacyjnym z powodu używanych interfejsów API gniazd, podaj to.
Rozwiązania muszą zawierać obraz pokazujący, jak wyświetla stronę HTML w przeglądarce.
Jeśli masz jakieś pytania, możesz je zadać! :)
..
na ścieżkę jako sposób na wyrwanie się ze zdefiniowanego katalogu głównego dokumentu).http
moduł w Node.js jest w porządku?Odpowiedzi:
Ruby, 383 znaków
Restrukturyzacja kodu w celu spakowania niezbędnej logiki w jednym wierszu, co powoduje, że kod jest krótszy. Niemniej jednak mam nadzieję, że ta wersja może być nieco bardziej rozbudowana.
Uwaga: Nie wdrożyłem jeszcze „500 Server Error”, ponieważ nie mogłem znaleźć odpowiedniej struktury (być może pakowanie wszystkiego do początku / ratowania / zakończenia, ale odczyt pliku jest wykonywany po wysłaniu nagłówka).
źródło
500 Server Error
tego nie spełnia wymagań, więc nie należy go akceptować.Bash + netcat: 354 znaków
webserver.sh (33 znaki):
w (321 znaków):
Przykładowy przebieg:
Przykładowa wizyta (Firefox 19.0):
źródło
nc
powie mi, że opcja -e nie jest obsługiwana. Jakieś pomysły?nc
z BusyBox. Używam GNUnetcat
.text/plain
?netcat
.)Haskell, 636
Pliki są przesyłane strumieniowo leniwie, więc obsługa dużych plików nie zajmuje dużo pamięci, ale oznacza to również, że tylko błędy na początku transmisji (np. Błędy uprawnień) powodują
500 Server Error
.Testowane na Ubuntu 10.10. Mogą być przeniesione do systemu Windows zmieniając
/var/www
sięC:/hgolf
i zmieniamain=
sięmain=withSocketsDo$
, ponieważ biblioteka gniazd na Windows wymaga wyraźnej inicjalizacji.Wersja bez golfa:
źródło
Python 2,
525 510493 (zginanie reguł 483) znakówStwierdziłem, że potrzebuję tylko 483 znaków, jeśli naginę reguły, ponieważ ostatni
;c.close()
można pominąć. Dzieje się tak, ponieważ z chwilą przyjęcia kolejnego klienta gniazdo i tak zostaje zamknięte. Ta wola wzrost Oczywiście czas oczekiwania nieco (Firefox będzie wyświetlać tylko strony, gdy kolejny łączy klienta, Chrome będzie go wyświetlić poprzednio, ale nadal będzie obciążeniem), ale przepisy nie wymagają mnie do odpowiedzi na wniosek natychmiast , tylko zrób to w pewnym momencie .Nie jestem pewien, czy to zadziała na Uniksach, ponieważ użyłem send zamiast sendall, a send nie gwarantuje wysłania wszystkiego, co jest karmione. Działa w systemie Windows.
źródło
Groovy,
507500489485Dodano pobieranie obrazu, aby pokazać, że pliki binarne działają poprawnie - na początku miałem z nimi kilka problemów.
Czy ktoś może zasugerować krótszy sposób na odczytanie danych wejściowych?
źródło
Erlang (escript) 575
Bardzo brudny napis Erlanga. Na początku pliku musi znajdować się jeden pusty wiersz, aby działał poprawnie:
Jak biegać
Edytować:
Wycisnąłem 20 znaków.
case
jest zaskakująco krótszy niż funkcja z nawet jednym argumentem i trzema klauzulami.źródło
VB.NET, 7203
Można zdefiniować dowolny port i baza użyciu dowolnego katalogu
--port
i--base
odpowiednio.Nie, to nie jest tak naprawdę rozwiązanie w golfa. Ale będąc VB.NET, i tak naprawdę nie ma sensu. Na plus ten ma o wiele więcej funkcji.
Postanowiłem nawet umieścić go na GitHub :) https://github.com/minitech/DevServ
źródło
For i As Integer = 0 To args.Length - 2
. Jeśli dodaszStep 2
na końcu tego wiersza, zwiększysz licznik o dwa zamiast 1.C # (869)
Bez golfa
źródło
Node.js - 636
Testowany tylko w systemie Linux, nie działa w systemie Windows.
źródło
Scala, 653 znaków
Zrzut ekranu przedstawiający go na moim MacBooku:
Nie wspaniale, ale spróbuję trochę zgnieść, kiedy będę miał trochę czasu.
źródło
Python 3 - 655
źródło
VB.Net (3504 znaków):
Grał w golfa od odpowiedzi @ minitech.
źródło
Lua 5.1 w
435434 bajtach... i dowód ...
źródło