Ihre Herausforderung besteht darin, einen Code-Golf-HTTP-Server zu schreiben, der GET-Anforderungen akzeptiert. Es muss natürlich nicht voll funktionsfähig sein, aber es muss Dateien aus einem Verzeichnis bereitstellen.
Regeln:
- Der HTTP-Server muss den TCP-Port 36895 (0x901F) überwachen
- Es muss Dateien von einem
/var/www
* NIX-System (z. B. Linux) oderC:\hgolf
unter Windows bereitstellen . - Sie können alle eingehenden HTTP-Header außer dem
GET
selbst ignorieren . - Wenn die HTTP-Methode nicht GET ist, müssen Sie den Statuscode "405 Not Supported" und den Body "405 Not Supported" zurücksenden.
- Wenn die Datei nicht vorhanden ist, müssen Sie den Statuscode "404-Datei nicht gefunden" und den Text "404-Datei nicht gefunden" zurücksenden.
- Wenn die Datei existiert, aber aus irgendeinem Grund nicht gelesen werden konnte, müssen Sie den Statuscode "500 Server Error" und den Body "500 Server Error" zurücksenden.
- Wenn der Benutzer eine Anforderung
/
oder ein anderes vorhandenes Stammverzeichnis (z. B./foo/
wo ein Verzeichnisfoo
vorhanden ist/var/www/
) stellt, antworten Sie mit einer leeren Seite. - Ihre Antwort muss mindestens die Mindestanzahl an Headern enthalten, damit der Inhalt in Firefox 8.0 und Internet Explorer 8.0 angezeigt werden kann
- Sie müssen mit dem
Content-Type
Header-Set antworten , müssen aber nur die Erweiterungenhtml => text/html
und unterstützentxt => text/plain
. Für jede andere Dateierweiterung senden Sieapplication/octet-stream
als Inhaltstyp. - Ihr Code muss sowohl ASCII- als auch Binärdaten übertragen können, obwohl Sie nicht explizit zwischen beiden unterscheiden müssen.
- Sie dürfen keine Bibliotheken von Drittanbietern verwenden.
- Sie dürfen keine eingebauten Klassen oder Features zum Verarbeiten von HTTP-Anforderungen verwenden (z. B.
HttpListener
in C #). - Wenn Ihr Code aufgrund der von Ihnen verwendeten Socket-APIs nur auf einem bestimmten Betriebssystem funktioniert, geben Sie dies bitte an.
Die Lösungen müssen ein Bild enthalten, das zeigt, wie eine HTML-Seite an einen Browser gesendet wird.
Wenn Sie Fragen haben, können Sie diese gerne stellen! :)
..
den Pfad erlauben würden, um aus dem definierten Dokumentenstamm auszubrechen).http
Modul in Node.js in Ordnung?Antworten:
Ruby, 383 Zeichen
Die Umstrukturierung des Codes, um die wesentliche Logik in eine Zeile zu packen, wodurch der Code kürzer wird. Trotzdem hoffe ich, dass diese Version ein bisschen weiter entwickelt werden kann.
Hinweis: Ich habe den "500 Server Error" noch nicht implementiert, weil ich keine geeignete Struktur gefunden habe (möglicherweise wurde alles in begin / rescue / end gepackt, aber das Lesen der Datei erfolgt, nachdem der Header gesendet wurde).
quelle
500 Server Error
es passt nicht Anforderungen, so sollte es nicht akzeptiert werden.Bash + Netcat: 354 Zeichen
webserver.sh (33 Zeichen):
w (321 Zeichen):
Probelauf:
Beispielbesuch (Firefox 19.0):
quelle
nc
wird mir mitgeteilt, dass die Option -e nicht unterstützt wird. Irgendwelche Ideen?nc
von BusyBox. Ich benutze GNUnetcat
.text/plain
?netcat
.)Haskell, 636
Dateien werden träge gestreamt, so dass das Servieren großer Dateien nicht viel Speicherplatz beansprucht. Dies bedeutet jedoch auch, dass nur Fehler beim Start der Übertragung (z. B. Berechtigungsfehler) zu einem Fehler führen
500 Server Error
.Getestet unter Ubuntu 10.10. Kann durch Ändern von
/var/www
inC:/hgolf
und Ändernmain=
von in Windows portiert werdenmain=withSocketsDo$
, da die Sockets-Bibliothek unter Windows eine explizite Initialisierung erfordert.Ungolfed-Version:
quelle
Python 2,
525 510493 (Biegen der Regeln 483) ZeichenIch gab an, dass ich nur 483 Zeichen benötige, wenn ich die Regeln verbiege, weil das letzte
;c.close()
weggelassen werden könnte. Dies liegt daran, dass der Socket in dem Moment, in dem der nächste Client akzeptiert wird, sowieso geschlossen wird. Dies wird natürlich die Wartezeit etwas verlängern (Firefox zeigt die Seite nur an, wenn der nächste Client eine Verbindung herstellt, Chrome zeigt sie vorher an, lädt sie jedoch weiter), aber nach den Regeln muss ich nicht sofort auf die Anfrage antworten, sondern nur auf tun Sie dies irgendwann .Ich bin nicht sicher, ob dies unter Unixes funktioniert, da ich send anstelle von sendall verwendet habe und send nicht garantiert, dass tatsächlich alles gesendet wird, was gespeist wird. Es funktioniert unter Windows.
quelle
Groovy,
507500489485Der Bild-Download wurde hinzugefügt, um zu zeigen, dass Binärdateien ordnungsgemäß funktionieren. Zunächst gab es einige Probleme mit ihnen.
Kann jemand einen kürzeren Weg vorschlagen, um die Eingabe zu lesen?
quelle
Erlang (escript) 575
Sehr schmutziges Erlang-Eskript. Am Anfang der Datei muss eine Leerzeile stehen, damit sie richtig funktioniert:
Wie läuft man?
Bearbeiten:
Ich habe 20 Zeichen ausgepresst.
case
ist überraschend kürzer als function mit nur einem Argument und drei Sätzen.quelle
VB.NET, 7203
Sie können jeden Port und jedes Basisverzeichnis mit
--port
und definieren--base
.Nein, das ist keine wirkliche Golflösung. Aber VB.NET zu sein, macht sowieso keinen Sinn. Auf der positiven Seite hat dieser viel mehr Funktionen.
Ich habe sogar beschlossen, es auf GitHub zu stellen :) https://github.com/minitech/DevServ
quelle
For i As Integer = 0 To args.Length - 2
. Wenn SieStep 2
das Ende dieser Zeile ergänzen , erhöhen Sie den Zähler um zwei statt um 1.C # (869)
Ungolfed
quelle
Node.js - 636
Nur unter Linux getestet, funktioniert nicht unter Windows.
quelle
Scala, 653 Zeichen
Ein Screenshot davon läuft auf meinem MacBook:
Nicht großartig, aber ich werde versuchen, es ein bisschen zu zerdrücken, wenn ich etwas später Zeit habe.
quelle
Python 3 - 655
quelle
VB.Net (3504 Zeichen):
Aus der Antwort von @ minitech.
quelle
Lua 5.1 in
435434 Bytes... und der Beweis ...
quelle