418: Ich bin eine Teekanne


68

Wie wir alle wissen sollten, gibt es einen HTTP-Statuscode 418: Ich bin eine Teekanne .

Wenn Sie dies akzeptieren, besteht Ihre Aufgabe darin, Ihre Kreativität zu nutzen und den kleinstmöglichen Server zu schreiben, der auf jede an ihn gerichtete HTTP-Anfrage mit dem oben angegebenen Statuscode antwortet.

Es gelten Standardlücken , einschließlich

Abrufen der gewünschten Ausgabe von einer externen Quelle

Dies umfasst das Ausführen einer HTTP-Anforderung zum Abrufen der Seite mit der Frage und das Extrahieren einer Lösung von dieser Seite. Das war schon 2011 ein wenig amüsant, ist jetzt aber ableitend und uninteressant.

Das heißt, Sie können die Anforderung nicht einfach an einen anderen Server umleiten, damit dieser die Antwort zurückgibt.


Behebung von Unklarheiten in Bezug auf die Serverfunktionalität:
Ihr Server kann alles (oder nichts) tun, während keine HTTP-Anfrage an ihn gerichtet wird, solange er mit der richtigen Antwort antwortet, sobald eine HTTP-Anfrage gestellt wird.


15
zu jeder http-Anfrage? Sicher nur eins zu einem Kaffee: URI?
Dave

3
Dürfen wir davon ausgehen, dass wir bereits Root-Rechte haben? (zB bind () an Port 80 ist in Ordnung)
Digital Trauma

2
@DigitalTrauma Ja, Sie können erweiterte Berechtigungen für Ihren Server übernehmen.
Nit

4
@Knerd Ich lehne mich zurück, du schreibst kein Programm, du konfigurierst einfach eines.
Nit

2
Oh mein Gott. Mit dem Erscheinen des IOT kann dieser Statuscode einen tatsächlichen Grund haben, zu existieren!
Leuchtende

Antworten:


39

GNU Awk: 69 Zeichen

Ein Server selbst (dient endlos einer Anfrage auf einmal), keine Bibliothek verwendet.

Senden Sie 418 an alle, die eine Verbindung herstellen ( 82 bis 69 Zeichen):

BEGIN{while(s="/inet/tcp/80/0/0"){print"HTTP/1.1 418\n"|&s
close(s)}}

Sende 418 an alle, die etwas senden ( 93 80 Zeichen):

BEGIN{while(s="/inet/tcp/80/0/0"){s|&getline
print"HTTP/1.1 418\n"|&s
close(s)}}

Senden Sie 418 an alle, die eine gültige HTTP-GET-Anfrage senden ( 122 109 Zeichen):

BEGIN{while(s="/inet/tcp/80/0/0"){s|&getline
if(/^GET \S+ HTTP\/1\.[01]$/)print"HTTP/1.1 418\n"|&s
close(s)}}

Aber wie verbindet man sich? ;)
Optimierer

5
Auf dieselbe Weise stellen Sie eine Verbindung zu einem beliebigen Webserver her. Browser, netcat, telnet, wget, curl, eine andere GNU - awkSkript, ... Theoretisch hört es auf localhost: 80, aber für diesen 1) ohne Web - Server, Skype oder ein anderes Programm sollte 80 Port verwenden; 2) Sie müssen Superuser sein, um Ports unter 1024 zu öffnen. Zum Testen ist es also einfacher, die Portnummer im Skript auf etwa 8080 ( s="/inet/tcp/8080/0/0") zu ändern und dann eine Verbindung damit herzustellen. pastebin.com/zauP7LMA
Manatwork

2
Aha. Cool. Awk noob hier :)
Optimierer

1
Sie könnten möglicherweise ein Byte speichern, indem Sie einen kleineren Port wie 8 verwenden, der nicht zugewiesen ist.
Hannes Karppila

@HannesKarppila, das stimmt. Da jedoch alle anderen Lösungen, die explizit einen Port angeben (mit Ausnahme des Ports 8888 der Haskell-Antwort), Port 80 verwenden, sollte dies zur Vergleichbarkeit beibehalten werden.
Manatwork

32

Bash (33)

nc -lp80 -q1<<<"HTTP/1.1 418
";$0

3
Sind die beiden Zeilenumbrüche notwendig? Scheint mit nur einem für mich OK zu arbeiten. Auch nach meiner Zählung sind das 34 Bytes - ich vermute, Ihr Editor fügt eine unnötige neue Zeile oder \0das Ende Ihrer Datei hinzu - Sie können truncatedies und es funktioniert immer noch. s='echo HTTP/1.1 418|nc -lp80 -q1;$0' ; echo ${#s}gibt 33 für mich
Digitales Trauma

@DigitalTrauma: Sie haben Recht - die letzte Zeile wird automatisch in die Zeichenfolgen eingefügt: Warum fügt eine Bash Here-Zeichenfolge ein abschließendes Zeilenumbruchzeichen hinzu ? ------ Aber ich sehe zwei mögliche Probleme: 1. Das Skript erwartet, dass es in einem der $PATHVerzeichnisse gespeichert ist oder dass es mit einem Pfad aufgerufen wird (Rekursion von $0). ----- 2. HTTP erfordert, dass Zeilen \r\nnicht nur von terminiert werden \n. Hier sollte die Zeichenfolge $"HTTP/1.1 418\r\n\r"(länger lesbare Form) sein. ------ Und zum Schluss: Das Skript könnte kürzer sein: Der -q1Parameter ist nicht erforderlich.
Pabouk

2
@DigitalTrauma, @pabouk: Die Ausgabe muss mit zwei Zeilenumbrüchen enden. Eine der Zeilenumbrüche war also unnötig (wegen des Here-Strings), aber die echoVariante funktioniert nicht (zumindest erkennt Firefox sie nicht als 418). Die \rs werden jedoch nicht benötigt. Die Spezifikation sagt es sollte sein \r\n\r\n, aber zumindest Firefox und Chrome werden es akzeptieren \n\n, so scheint es im Geiste des Golfsports zu sein, sie nicht einzuschließen. Der -q1Parameter war auf meinem System notwendig, da der Browser die Verbindung nicht von selbst schließt. $0funktioniert einwandfrei, wenn das Skript ausführbar gemacht und auf diese Weise aufgerufen wird.
Marinus

@marinus Interessant - ich habe getestet, wgetwas mit nur einer neuen Zeile in Ordnung zu sein scheint
Digital Trauma

1
@pabouk - Interessantes Snippet hier w3.org/Protocols/HTTP/OldServers.html : "Zeilen sollten als durch den Zeilenvorschub terminiert angesehen und das vorangegangene Carriage Return-Zeichen ignoriert werden"
Digitales Trauma

30

PHP - 85 Bytes

<?for($s=socket_create_listen(80);socket_write(socket_accept($s),"HTTP/1.1 418
"););

Wird mit Zeilenenden im Windows-Stil (CR-LF) gespeichert, muss php_socketsaktiviert sein.

Ich habe dies tatsächlich als meinen Fehlercode für den Hard Code Golf verwendet: Erstelle eine Chatroom- Herausforderung, aber niemand hat es bemerkt.


Browserfreundliche Version

<?for(socket_getsockname($s=socket_create_listen(80),$n);$t="I'm a teapot";socket_write($c=socket_accept($s),"HTTP/1.0 418 $t
Content-Length: $l

<title>418 $t</title><h1>$t</h1>The requested resource is not suitable for brewing coffee.<hr><i>$n:80</i>"))$l=124+strlen($n);

Starten Sie das Skript in der CLI und richten Sie Ihren Browser auf http://localhost.


1
+1 für Benutzer firendlyness / I'm a teapot:-)
Levit

20

Node.js (LiveScript)

http Modul - 66

require(\http)createServer (->&1.writeHead 418;&1.end!) .listen 80

Inspiriert von Qwertiys Antwort .

net Modul - 76

require(\net)createServer (->it.write 'HTTP/1.1 418\r\n';it.end!) .listen 80

2
Könnte die Person, die das Abstimmen abgelehnt hat, erklären, warum?
nyuszika7h

20

Ruby + Rack, 19 Bytes

run->e{[418,{},[]]}

Muss gespeichert config.ruund mit dem rackupBefehl ausgeführt werden.

Oder wenn Sie "reinen" Rubin bevorzugen:

Rack::Handler::WEBrick.run->e{[418,{},[]]}

42 Bytes + -rrackFlag = 48 Bytes


12

Allgemeine Bash + BSD-Befehle, 29

Ein bisschen von anderen Antworten zurückborgen:

nc -lp80<<<"HTTP/1.1 418
";$0

Funktioniert bei mir mit wget.

Erste Antwort zu verwenden nc, 38

for((;;)){
nc -l 80 <<<HTTP/1.1\ 418
}

Ich gehe von root-Rechten aus - gehe wie folgt vor:

sudo bash ./418.sh

3
@ ub3rst4r Richtig - Aus diesem Grund habe ich "Allgemeine BSD-Befehle" angegeben, die aus Sicht des Shell-Skripts als "Bibliothek" betrachtet werden können. Aus dem OP: "Alle Bibliotheken sind willkommen"
Digitales Trauma

2
Eine Antwort muss mit einer neuen Zeile enden (siehe w3.org/Protocols/HTTP/Response.html
Nit

2
@Nit - Ja - bash „hier Strings“ wird automatisch mit einem Newline angehängt werden
Digitale Trauma

1
Wie wäre esnc -l 80 <<<HTTP/1.1\ 418;$0
Core1024

1
Entschuldigen Sie die Verwechslung mit den beiden Leerzeichen. Ich habe nicht bemerkt, dass Sie den -pSchalter nicht benutzt haben :) Ich habe den Code mit Firefox getestet und ohne zwei Zeilenumbrüche wird der Statuscode nicht erkannt.
Pabouk

9

Ruby (nc system command) - 35

loop{`nc -l 80 <<<"HTTP/1.1 418"`}

DigitalTrauma sollte den Verdienst für die Idee der Verwendung bekommen nc, aber Ruby kann eine Endlosschleife mit weniger Zeichen als Bash machen :)

Ruby (TCPServer) - 75

require'socket'
s=TCPServer.new 80
loop{(s.accept<<'HTTP/1.1 418
').close}

Diese Zeilenumbruch ist beabsichtigt - das tatsächliche Zeilenumbruchzeichen ist ein Zeichen kürzer als "\ n".

Ruby (WEBrick HTTPServer) - 87

require'webrick'
(s=WEBrick::HTTPServer.new).mount_proc(?/){|_,r|r.status=418}
s.start

Eine Antwort muss mit einer neuen Zeile
Nit

1
@DigitalTrauma, ich wollte das benutzen, aber dann wurde mir klar, dass der Backslash mit einem anderen Backslash maskiert werden muss, sodass es sowieso die gleiche Anzahl von Zeichen gewesen wäre :)
Trey Thomas

@TreyThomas Oh, ich verstehe - Ruby braucht hier eine zusätzliche Ebene der Flucht
Digitales Trauma

8

Node.js, 80

require('http').createServer(function(q,s){s.writeHead(418);s.end()}).listen(80)

Die Antwort ist

HTTP/1.1 418 I'm a teapot
Date: Wed, 19 Nov 2014 21:08:27 GMT
Connection: keep-alive
Transfer-Encoding: chunked

0

2
Ich finde es einfach genial, dass Node diesen Fehlercode nativ unterstützt ^^
Levit

8

Python 3 106

s=__import__('socket').socket(2,1) 
s.bind(('',80))
s.listen(9)
while 1:s.accept()[0].send('HTTP/1.1 418\n')

1
Basierend auf hallvabo ‚s Kommentar in Tipps für den Golfsport in Python , from socket import*;s=socket(AF_INET,SOCK_STREAM)ist kürzer.
manatwork

@manatwork Danke, gibt es einen kürzeren Weg zur Endlosschleife? Ich habe keinen in den Tipps gefunden ...
Tuomas Laakkonen

3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))- es sei denn, ich habe etwas verpasst. (Übrigens, zähle die Zeilenumbrüche nach Belieben. Auf diese Weise verlierst du nichts, indem du die Befehle statt durch Zeilenumbrüche trennst ;.)
manatwork

Sie können 2 Zeichen abschneiden, indem Sie davon ausgehen, dass Port 80 zugänglich ist, wie der Kommentar des Fragenbesitzers besagt . Eine hässliche Sache, die die Portabilität beeinträchtigen kann, aber hier akzeptabel sein kann: Verwenden Sie die Werte der Konstanten direkt s=socket(2,1)(zumindest sind dies ihre Werte auf meinem Linux).
Handarbeit

In der Dokumentation zu listen()'s Parameter steht, dass "der Maximalwert systemabhängig ist (normalerweise 5)". Anstelle von 10 ist 9 also mehr als genug und 1 Zeichen kürzer. Und statt bytes('HTTP/1.1 418\n','UTF8')eines Buchstabens b'HTTP/1.1 418\n'ist genug. Oder wenn Sie den Code Python 2 machen, dann wird das bbytesprefix nicht mehr benötigt. Und die kürzere send()scheint auch zu reichen.
Handarbeit

7

Haskell - 142 Bytes

import Network
import System.IO
main=listenOn(PortNumber 8888)>>=f
f s=do{(h,_,_)<-accept s;hPutStr h"HTTP/1.1 418\r\n";hFlush h;hClose h;f s}

5

Tcl (> = 8,5), 78 Bytes

Bearbeiten - Zur Einhaltung der Richtlinien wurde eine zusätzliche Zeile (insgesamt 2 Zeilen) hinzugefügt.

socket -server {apply {{c - -} {puts $c "HTTP/1.1 418
";close $c}}} 80
vwait f

Eine Antwort muss mit einem Newline Ende finden w3.org/Protocols/HTTP/Response.html
Nit

3
@Nit - Ja, Tcl Puts fügt automatisch eine neue Zeile hinzu, es sei denn, die Option -nonewline ist angegeben. tcl.tk/man/tcl/TclCmd/puts.htm
Digitales Trauma

5

Julia: 86 73 Zeichen

s=listen(80)
while 1<2
c=accept(s)
write(c,"HTTP/1.1 418

")
close(c)
end

Ich glaube nicht, dass Sie den eigentlichen Teil "Ich bin eine Teekanne" brauchen - der Antwortcode sollte ausreichen.
Desty

Ja, ich habe es bemerkt. Aber da das für Julia nicht viel hilft, habe ich es komplett gehalten. Aber wahrscheinlich wäre es besser, es zu entfernen, um den Vergleich der Sprachen zu erleichtern.
Handarbeit

5

Powershell, 398

$Listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Parse("10.10.10.10"), 80)
$Listener.Start()
while($true)
{
    $RemoteClient = $Listener.AcceptTcpClient()
    $Stream = $RemoteClient.GetStream()
    $Writer = New-Object System.IO.StreamWriter $Stream
    $Writer.Write("HTTP/1.1 418 I'm a Teapot`nConnection: Close`n`n")
    $Writer.Flush()
    $RemoteClient.Close()
}

258

$l=New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Parse("10.10.10.10"),80);$l.Start();while($true){$r = $l.AcceptTcpClient();$s = $r.GetStream();$w = New-Object System.IO.StreamWriter $s;$w.Write("HTTP/1.1 418`n`n");$w.Flush();$r.Close()}

5

R, 80 Zeichen

Nie zuvor Socket-Programmierung mit R, aber ich werde es versuchen:

repeat{s=socketConnection(,80,T,open="r+");cat("HTTP/1.1 418\n",file=s);close(s)}

Hier socketConnectionöffnet sich ein Socket: Das erste Argument sollte der Host sein, standardmäßig localhostkönnen wir es hier überspringen; Das zweite Argument ist der Port, für den es keinen Standard servergibt. Das angegebene Argument TRUEerstellt den Socket, wenn FALSEnur eine Verbindung zu einem vorhandenen hergestellt wird. Tist standardmäßig gleich TRUE, in R.

Bearbeiten: Wie in einem Änderungsvorschlag von @AlexBrown vorgeschlagen, kann dies auf 69 Zeichen verkürzt werden :

repeat cat("HTTP/1.1 418\n",file=s<-socketConnection(,80,T))+close(s)

4

Node.js koa , 61 Bytes

require('koa')().use(function*(){this.status=418}).listen(80)

Antwort:

HTTP/1.1 418 I'm a teapot
X-Powered-By: koa
Content-Type: text/plain; charset=utf-8
Content-Length: 12
Date: Thu, 20 Nov 2014 07:20:36 GMT
Connection: close

I'm a teapot

Benötigt Knoten v0.11.12 +

Rennen wie:

node --harmony app.js

Was ist function*?
nyuszika7h

2
Dies ist eine Generatorfunktion , die Teil des ECMAScript 6, Harmony-Vorschlags ist.
cPu1

4

Shell + Socat, 60

socat tcp-l:80,fork exec:'printf HTTP/1.1\\ 418\\ T\r\n\r\n'

echo -e HTTP/1.1 418 T\r\n\rist kürzer.
Jimmy23013

Das \\ Twird nicht mal gebraucht.
nyuszika7h

3

MATLAB, 97 86 Bytes

In Bezug auf die absolute Byteanzahl kein ernstzunehmender Konkurrent, aber ich würde es gerne posten, weil ich nicht dachte, dass es möglich wäre, einen voll funktionsfähigen Webserver mit einem mathematischen Tool zu schreiben. Beachten Sie die Verwendung der Eigenschaftskürzung : 'Ne','s'Wird intern auf erweitert 'NetworkRole', 'server'.

t=tcpip('0.0.0.0','Ne','s');while 1
fopen(t)
fprintf(t,'HTTP/1.1 418\n')
fclose(t)
end

3

Sie können dies mit minimalem Aufwand mit einer .htaccessDatei und PHP tun .

Alle Zugriffe auf Ihren Server geben den Status 418 zurück.

Unten ist der Code:

.htaccess (28 Bytes)

RewriteRule .* index.php [L]

PHP ( 38 19 Bytes)

<<?header(TE,1,418);

Vielen Dank an @primo , dass du mir ein paar Bytes gespart hast!


Ich habe dies getestet und bestätige, dass es das gewünschte Ergebnis liefert!

http://i.stack.imgur.com/wLb9p.png

"Pedido" bedeutet übrigens "Request" und "Resposta" bedeutet "Answer".


-1, dies ist kein vollständiges Programm. Es basiert auf einem externen Webserver.
nyuszika7h

@ nyuszika7h Tatsächlich basiert es auf Apache, auf dem PHP als Modul installiert ist. Ihr Argument ist gültig und ungültig. Apache leitet nur die Zugriffe auf die PHP-Datei um, die PHP-Datei kümmert sich um den Code.
Ismael Miguel

@ nyuszika7h Wenn wir uns auf diese Ebene beschränken, können Sie nicht einmal die Konsole verwenden, um Ihren PHP-Code auszuführen. Apache ist der Starter. Der Auslöser, der die Kugel abfeuert. Wenn Sie die PHP-Datei von der Konsole aus ausführen, wird die Konsole zum Auslöser.
Ismael Miguel

Sie verlassen sich darauf, dass Apache bereits ausgeführt wird, und ich glaube nicht, dass dies funktioniert, ohne die Standardkonfiguration zu ändern. Es ist mir egal, was du sagst, ich kann das auf keinen Fall als gültig ansehen. Aber Sie sollten @Nit fragen, wie es ihre Frage ist.
nyuszika7h

@ nyuszika7h Wenn es ungültig wäre, hätte das OP schon gesagt.
Ismael Miguel

2

node.js mit CoffeeScript (76)

require("connect")().use((q,s,n)->s.writeHead 418;s.end();return;).listen 80

Kompiliere es einfach in JavaScript, dann musst du es ausführen npm install connect. Beginnen Sie danach mitnode server.js


2

Nginx - 35

events{}http{server{return 418;}}

Wirf das in die nginx.conf, starte nginx.

Ich bin mir nicht sicher, ob dabei Standardlücken verwendet werden: "Eingebaute Funktionen für die Arbeit verwenden" oder "Die Herausforderung zu wörtlich interpretieren". Hoppla, es sieht so aus, als würde OP diese Antwort nicht mögen.


Würde es immer noch funktionieren, wenn Sie das fallen lassen ;?
Cyril

+ 4 / -4: gut gemacht in der kontroverse: D
cat

2

Perl, 78

use Web::Simple;sub dispatch_request{sub{[418,[],[]]}}__PACKAGE__->to_psgi_app

laufen als plackup whatever.pl.


Wenn Sie eine plack Anwendung wünschen, dann sub{[418,[],[]]}sollte gerade ausreichen. (16 Zeichen.)
Bis

Natürlich hast du recht! Es ist nicht wie ich mit einem Rahmen, warum es laden? :)
Hobbs

@ Tobyink fühlen sich frei, es als Ihre eigenen einzureichen, obwohl :)
Hobbs

2

Python 2.7 / Django, 94 Bytes

(hinzugefügt von Default Boilerplate von django-admin.py startproject) In urls.py:

import django.http.HttpResponse as r;urlpatterns=patterns(url(r'^*$',lambda q:r(status=418)))

1

C # + OWIN 251 240

Ich hatte wirklich gehofft, dass es kürzer wird, aber die langen Namespaces haben diesen Plan ruiniert. Benötigt das Microsoft.Owin.SelfHostauf NuGet verfügbare Paket.

using Owin;class P{static void Main(){Microsoft.Owin.Hosting.WebApp.Start<P>("http://localhost");while(0<1);}public void Configuration(IAppBuilder a){a.Run(c=>{c.Response.StatusCode=418;return System.Threading.Tasks.Task.FromResult(0);});}}

1

node.js mit connect (78)

require('connect')().use(function(q,s,n){s.writeHead(418);s.end()}).listen(80)

Sie müssen npm install connectzuerst laufen . Dann starte es mitnode server.js


1

Los, 162 Bytes

package main
import "net/http"
func main(){http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request){w.WriteHeader(418)})
http.ListenAndServe(":80", nil)
}

1

Faktor 101 141 Bytes

[ utf8 <threaded-server> readln 10 base> >>insecure [ "HTTP/1.1 418\r" print flush ] >>handler [ start-server ] in-thread start-server drop ]

Geben Sie 418 an alle zurück, die eine Verbindung herstellen.


1

Java 7, 208 Bytes

import java.net.*;class R{public static void main(String[]a)throws Exception{for(ServerSocket s=new ServerSocket(80);;){Socket p=s.accept();p.getOutputStream().write("HTTP/1.0 418\n".getBytes());p.close();}}}

Diese Frage brauchte eine Java-Antwort.

poke@server ~
$ curl -i localhost:80
HTTP/1.0 418

Wo ist die Statusmeldung?
Qwertiy

@Qwertiy Ich denke, diese Frage fragt nur nach dem Statuscode, den ich als Ganzzahl interpretiere. Daraus folgt, dass die Statusmeldung / der Grund nicht unbedingt erforderlich ist.
Poke

Nicht ich, um zu entscheiden, aber ich denke, es sollte mit Status-Text sein.
Qwertiy

3
Holen Sie sich bereits Java 8> _>
Pavel

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.