418: Saya teko

68

Seperti yang kita semua harus tahu, ada kode status HTTP 418: Saya teko .

Misi Anda, jika Anda memilih untuk menerimanya, adalah menggunakan creativitea Anda dan menulis server sekecil mungkin yang merespons dengan kode status di atas untuk setiap dan setiap permintaan HTTP yang dibuat untuknya.

Celah standar berlaku, termasuk

Mengambil output yang diinginkan dari sumber eksternal

Ini termasuk melakukan permintaan HTTP untuk mengambil halaman dengan pertanyaan dan mengekstraksi solusi dari halaman itu. Ini sedikit menghibur kembali pada tahun 2011, tetapi sekarang adalah turunan dan tidak menarik.

Berarti Anda tidak bisa langsung mengalihkan permintaan ke server lain untuk mengembalikannya.


Mengatasi kebingungan tentang fungsionalitas server:
Server Anda dapat melakukan apa saja (atau tidak sama sekali) sementara tidak ada permintaan HTTP yang dibuat selama itu menjawab dengan respons yang benar begitu permintaan HTTP dibuat.

Nit
sumber
15
untuk setiap dan setiap permintaan http? Tentunya hanya kopi saja: URI?
dave
3
Bolehkah kita berasumsi bahwa kita sudah memiliki hak akses root? (mis. ikat () ke port 80 ok)
Digital Trauma
2
@DigitalTrauma Ya, Anda dapat mengasumsikan hak istimewa yang ditingkatkan untuk server Anda.
Nit
4
@Knerd Saya bersandar pada sisi tidak, Anda tidak menulis sebuah program, Anda hanya mengkonfigurasi satu.
Nit
2
ya Tuhan. Dengan IOT muncul, kode status ini mungkin memiliki alasan aktual untuk ada!
Luminous

Jawaban:

39

GNU Awk: 69 karakter

Server itu sendiri (tanpa henti melayani satu permintaan pada satu waktu), tidak ada perpustakaan yang digunakan.

Kirim 418 ke semua orang yang terhubung ( 82 69 karakter):

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

Kirim 418 ke semua orang yang mengirim sesuatu ( 93 80 karakter):

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

Kirim 418 ke semua orang yang mengirim permintaan HTTP GET yang valid ( 122 109 karakter):

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)}}
manatwork
sumber
Tapi .. bagaimana cara terkoneksi? ;)
Pengoptimal
5
Cara yang sama Anda terhubung ke server web apa pun. Browser, netcat, telnet, wget, curl, GNU lain awkskrip, ... Secara teoritis itu mendengarkan pada localhost: 80, tapi untuk itu 1) tidak ada web server, Skype atau program lainnya harus menggunakan port 80; 2) Anda harus menjadi pengguna super untuk membuka port di bawah 1024. Jadi untuk pengujian lebih mudah untuk mengedit nomor port dalam skrip ke sesuatu seperti 8080 ( s="/inet/tcp/8080/0/0") kemudian hubungkan ke itu. pastebin.com/zauP7LMA
manatwork
2
Saya melihat. Keren. Awk noob here :)
Optimizer
1
Anda mungkin dapat menyimpan byte dengan menggunakan port yang lebih kecil seperti 8, yang tidak ditetapkan.
Hannes Karppila
@ HannesKarppila, itu benar. Tetapi mengingat bahwa semua solusi lain yang secara eksplisit menentukan port (kecuali port jawaban Haskell 8888) menggunakan port 80, saya lebih baik menyimpannya seperti ini untuk perbandingan.
manatwork
32

Bash (33)

nc -lp80 -q1<<<"HTTP/1.1 418
";$0
marinus
sumber
3
Apakah dua baris baru itu perlu? Tampaknya bekerja dengan baik dengan hanya satu untuk saya. Juga menurut perhitungan saya di atas adalah 34 byte - Saya kira editor Anda menambahkan baris baru yang tidak perlu atau \0ke akhir file Anda - Anda dapat truncateini dan masih berfungsi. s='echo HTTP/1.1 418|nc -lp80 -q1;$0' ; echo ${#s}memberi 33 untuk saya
Digital Trauma
@ DigitalTrauma: Anda benar - baris baru terakhir ditambahkan secara otomatis di sini: String: Mengapa bash di sini-string menambahkan char baris baru? ------ Tapi saya melihat dua masalah yang mungkin terjadi: 1. Skrip mengharapkan bahwa ia disimpan di salah satu $PATHdirektori atau disebut dengan path (rekursi oleh $0). ----- 2. HTTP mensyaratkan bahwa jalur \r\ntidak hanya dihentikan \n. Di sini string harus $"HTTP/1.1 418\r\n\r"(bentuk yang bisa dibaca lagi). ------ Dan akhirnya: Script bisa lebih pendek: -q1Parameter tidak perlu.
pabouk
2
@DigitalTrauma, @pabouk: Output perlu diakhiri dengan dua baris baru. Jadi salah satu baris baru tidak perlu (karena string di sini), tetapi echovarian tidak berfungsi (setidaknya Firefox tidak akan mengenalinya sebagai 418). Namun, \rs tidak diperlukan. Spesifikasinya mengatakan itu harus \r\n\r\n, tetapi setidaknya Firefox dan Chrome akan menerimanya \n\n, jadi sepertinya ada semangat golf untuk tidak memasukkan mereka. The -q1parameter yang diperlukan pada sistem saya, karena browser tidak akan menutup koneksi dengan sendirinya. $0berfungsi dengan baik jika skrip dibuat dapat dieksekusi dan dipanggil dengan cara itu.
marinus
@marinus Menarik - Saya sedang menguji dengan wgetyang tampaknya baik-baik saja dengan hanya satu baris baru
Digital Trauma
1
@pabouk - Cuplikan menarik di sini w3.org/Protocols/HTTP/OldServers.html : "Garis harus dianggap diakhiri oleh Line Line, dan karakter Pengembalian Kereta yang sebelumnya diabaikan"
Digital Trauma
30

PHP - 85 byte

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

Disimpan dengan ujung jalur Windows-Style (CR-LF), harus php_socketsdiaktifkan.

Saya benar-benar menggunakan ini sebagai kode kesalahan saya untuk Hard Code Golf: Buat tantangan Chatroom , tetapi tidak ada yang menyadarinya.


Versi Browser-Friendly

<?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);

Mulai skrip di CLI, dan arahkan browser Anda di http://localhost.

primo
sumber
1
+1 untuk pengguna firendlyness / I'm a teapot:-)
Levit
20

Node.js (LiveScript)

http modul - 66

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

Terinspirasi oleh jawaban Qwertiy .

net modul - 76

require(\net)createServer (->it.write 'HTTP/1.1 418\r\n';it.end!) .listen 80
nyuszika7h
sumber
2
Mungkinkah orang yang turun memilih untuk menjelaskan alasannya?
nyuszika7h
20

Ruby + Rack, 19 byte

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

Harus disimpan sebagai config.ru, dan jalankan dengan rackupperintah.

Atau jika Anda lebih suka Ruby "murni":

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

42 byte + -rrackflag = 48 byte

Agustus
sumber
12

Perintah umum Bash + BSD, 29

Meminjam sedikit dari jawaban lain:

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

Bekerja untuk saya wget.

Jawaban pertama yang digunakan nc, 38

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

Saya mengasumsikan hak root - jalankan sebagai berikut:

sudo bash ./418.sh
Trauma Digital
sumber
3
@ ub3rst4r Benar - Itulah sebabnya saya menyatakan "perintah umum BSD", yang dapat dianggap sebagai "perpustakaan" dari sudut pandang skrip shell. Dari OP: "Semua perpustakaan dipersilakan"
Digital Trauma
2
Respons harus diakhiri dengan baris baru, lihat w3.org/Protocols/HTTP/Response.html
Nit
2
@Nit - Ya - bash "here strings" akan secara otomatis ditambahkan dengan baris baru
Digital Trauma
1
Bagaimana dengannc -l 80 <<<HTTP/1.1\ 418;$0
core1024
1
Maaf atas kebingungan dengan dua spasi. Saya tidak melihat bahwa Anda tidak menggunakan -psaklar :) Saya menguji kode dengan Firefox dan tanpa dua baris baru kode status tidak dikenali.
pabouk
9

Ruby (perintah sistem nc) - 35

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

DigitalTrauma harus mendapatkan pujian atas ide penggunaannya nc, namun Ruby dapat membuat perulangan tanpa batas dengan karakter lebih sedikit daripada Bash :)

Ruby (TCPServer) - 75

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

Baris baru itu disengaja - karakter baris sebenarnya adalah satu karakter lebih pendek dari "\ n".

Ruby (WEBrick HTTPServer) - 87

require'webrick'
(s=WEBrick::HTTPServer.new).mount_proc(?/){|_,r|r.status=418}
s.start
Trey Thomas
sumber
Respons harus diakhiri dengan baris baru, lihat w3.org/Protocols/HTTP/Response.html
Nit
1
@DigitalTrauma, saya akan menggunakan itu, tetapi kemudian menyadari backslash perlu diloloskan dengan backslash lain, jadi toh itu akan menjadi jumlah karakter yang sama pula :)
Trey Thomas
@TreyThomas Oh saya mengerti - jadi Ruby perlu tingkat pelarian tambahan di sini
Digital Trauma
8

Node.js, 80

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

Responsnya adalah

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

0
Qwertiy
sumber
2
Saya merasa luar biasa bahwa simpul mendukung kode kesalahan itu secara asli ^^
Imamat
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')
Tuomas Laakkonen
sumber
1
Berdasarkan hallvabo 's komentar di Tips untuk golf di Python , from socket import*;s=socket(AF_INET,SOCK_STREAM)yang lebih pendek.
manatwork
@manatwork Terima kasih, apakah ada cara yang lebih pendek untuk infinite loop? Saya tidak menemukan satu di ujung ...
Tuomas Laakkonen
3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))- kecuali saya melewatkan sesuatu. (Omong-omong, jangan ragu untuk menghitung baris baru satu karakter, karena bahasa memungkinkan mereka. Dengan begitu Anda tidak kehilangan apa pun dengan memisahkan perintah dengan baris baru, bukan ;.)
manatwork
Anda dapat memotong 2 karakter dengan menganggap port 80 dapat diakses, sesuai dengan komentar pemilik pertanyaan . Satu hal buruk yang dapat merusak portabilitas, tetapi mungkin dapat diterima di sini: gunakan nilai konstanta secara langsung s=socket(2,1)(setidaknya itu adalah nilainya di Linux saya).
manatwork
Dokumentasi mengatakan untuk listen()parameter bahwa "nilai maksimum tergantung pada sistem (biasanya 5)". Jadi alih-alih 10, 9 lebih dari cukup dan 1 karakter lebih pendek. Dan bukannya bytes('HTTP/1.1 418\n','UTF8')literal b'HTTP/1.1 418\n'sudah cukup. Atau jika Anda membuat kode Python 2, maka bbytesprefix tidak diperlukan lagi. Dan yang lebih pendek send()juga tampaknya sudah cukup.
manatwork
7

Haskell - 142 byte

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}
Taylor Fausak
sumber
5

Tcl (> = 8.5), 78 byte

Sunting - ditambahkan dalam baris baru tambahan (total 2 baris baru) demi kepatuhan.

socket -server {apply {{c - -} {puts $c "HTTP/1.1 418
";close $c}}} 80
vwait f
Trauma Digital
sumber
Respons harus diakhiri dengan baris baru, lihat w3.org/Protocols/HTTP/Response.html
Nit
3
@Nit - Ya, Tcl put akan secara otomatis menambahkan baris baru, kecuali opsi -nonewline diberikan. tcl.tk/man/tcl/TclCmd/puts.htm
Digital Trauma
5

Julia: 86 73 karakter

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

")
close(c)
end
manatwork
sumber
Saya tidak berpikir Anda perlu bagian "Saya teko" yang sebenarnya - kode respons harus cukup.
Desty
Ya, saya perhatikan. Tetapi karena itu tidak akan banyak membantu pada skor Julia, saya membuatnya lengkap. Tetapi mungkin akan lebih baik untuk menghapusnya untuk memfasilitasi perbandingan bahasa.
manatwork
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()}
pengguna2320464
sumber
5

R, 80 karakter

Tidak pernah melakukan pemrograman socket dengan R sebelumnya, tetapi saya akan mencobanya:

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

Di sini socketConnectionmembuka soket: argumen pertama harus menjadi tuan rumah, defaultnya localhostkita bisa lewati di sini; argumen kedua adalah port yang tidak memiliki default, kemudian argumen serverketika ditentukan TRUEmembuat soket, jika FALSEhanya terhubung ke yang sudah ada. Tsecara default sama dengan TRUE, dalam R.

Sunting: Seperti yang disarankan dalam sunting yang disarankan oleh @AlexBrown, ini bisa disingkat menjadi 69 karakter :

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

Node.js koa , 61 Bytes

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

Tanggapan:

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

Membutuhkan simpul v0.11.12 +

Jalankan sebagai:

node --harmony app.js
cPu1
sumber
Apa function*?
nyuszika7h
2
Itu fungsi generator , bagian dari proposal Harmony 6 ECMAScript.
cPu1
4

Shell + socat, 60

socat tcp-l:80,fork exec:'printf HTTP/1.1\\ 418\\ T\r\n\r\n'
Vi.
sumber
echo -e HTTP/1.1 418 T\r\n\rlebih pendek.
jimmy23013
The \\ Tbahkan tidak diperlukan.
nyuszika7h
3

MATLAB, 97 86 byte

Tidak benar-benar pesaing serius dalam hal byte-count absolut, tetapi saya ingin mempostingnya karena saya pikir tidak mungkin untuk menulis server web yang berfungsi penuh menggunakan alat matematika. Perhatikan penggunaan pemendekan properti : 'Ne','s'internal diperluas ke 'NetworkRole', 'server'.

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

Anda dapat melakukan ini dengan upaya minimal menggunakan .htaccessfile dan php.

Semua akses ke server Anda akan mengembalikan status 418.

Di bawah ini adalah kode:

.htaccess (28 byte)

RewriteRule .* index.php [L]

PHP ( 38 19 byte)

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

Terima kasih kepada @primo karena telah menyelamatkan saya banyak byte!


Saya telah menguji ini dan mengonfirmasinya mengembalikan hasil yang diinginkan!

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

Omong-omong, "Pedido" berarti "Permintaan" dan "Resposta" berarti "Jawab".

Ismael Miguel
sumber
-1, ini bukan program yang lengkap. Itu bergantung pada server web eksternal.
nyuszika7h
@ nyuszika7h Sebenarnya, ini bergantung pada Apache dengan PHP diinstal sebagai modul. Argumen Anda valid dan tidak valid. Apache hanya mengalihkan akses ke file PHP, file PHP mengurus kode.
Ismael Miguel
@ nyuszika7h Jika kita turun di lapisan itu, maka Anda bahkan tidak dapat menggunakan konsol untuk menjalankan kode PHP Anda. Apache adalah starter. Pemicu yang menembakkan peluru. Menjalankan file PHP dari konsol, akan menjadikan konsol pemicu.
Ismael Miguel
Anda mengandalkan Apache yang sudah berjalan, dan saya pikir itu tidak akan berfungsi tanpa mengubah konfigurasi default. Saya tidak peduli apa yang Anda katakan, tidak mungkin saya melihat ini valid. Tetapi Anda harus bertanya pada @Nit, karena ini adalah pertanyaan mereka.
nyuszika7h
@ nyuszika7h Jika tidak valid, OP akan mengatakan sudah.
Ismael Miguel
2

node.js dengan CoffeeScript (76)

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

Hanya kompilasi ke JavaScript, maka Anda harus menjalankannya npm install connect. Setelah itu mulailah dengannode server.js

Knerd
sumber
2

nginx - 35

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

Lempar ke dalam nginx.conf, mulai nginx.

Tidak yakin apakah ini menggunakan celah standar "Menggunakan fungsi bawaan untuk melakukan pekerjaan" atau "Menafsirkan tantangan terlalu harfiah." Ups, sepertinya OP tidak akan menyukai jawaban ini.

kacang zam
sumber
Apakah masih berfungsi jika Anda menjatuhkannya ;?
Cyril
+ 4 / -4: dilakukan dengan baik pada kontroversi: D
cat
2

Perl, 78

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

jalankan sebagai plackup whatever.pl.

hobbs
sumber
Jika Anda menginginkan aplikasi plack, maka sub{[418,[],[]]}itu sudah cukup. (16 karakter.)
tobyink
Tentu saja kamu benar! Ini tidak seperti saya menggunakan salah satu kerangka kerja, mengapa memuatnya? :)
hobbs
@tobyink merasa bebas untuk mengirimkannya sebagai milik Anda sendiri :)
hobbs
2

Python 2.7 / Django, 94 byte

(ditambahkan dari standar boilerplate dari django-admin.py startproject) Di urls.py:

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

C # + OWIN 251 240

Aku benar-benar berharap itu akan lebih pendek, tetapi ruang nama yang panjang merusak rencana itu. Membutuhkan Microsoft.Owin.SelfHostpaket yang tersedia di NuGet.

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);});}}
Bob
sumber
1

node.js dengan connect (78)

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

Anda harus lari npm install connectdulu. Kemudian mulailah dengannode server.js

Knerd
sumber
1

Pergi, 162 byte

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

Factor, 101 141 byte

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

Kembalikan 418 ke semua orang yang terhubung.

kucing
sumber
1

Java 7, 208 byte

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();}}}

Pertanyaan ini membutuhkan jawaban java.

poke@server ~
$ curl -i localhost:80
HTTP/1.0 418
Menyodok
sumber
Di mana pesan status?
Qwertiy
@ Qwertiy Saya pikir pertanyaan ini hanya menanyakan kode status yang saya tafsirkan sebagai bilangan bulat, jadi ini berarti bahwa pesan status / alasannya tidak sepenuhnya diperlukan.
Poke
Bukan saya yang memutuskan, tapi saya pikir seharusnya dengan status text.
Qwertiy
3
Dapatkan Java 8 sudah> _>
Pavel