418: Ben bir demlikim


68

Hepimizin bilmesi gerektiği gibi, 418 HTTP durum kodu var : Ben bir demayım .

Göreviniz, kabul etmeyi seçmeniz durumunda, yaratıcılığınızı kullanmak ve yukarıdaki durum koduyla yanıt veren mümkün olan en küçük sunucuyu, kendisine yapılan her HTTP isteğine yazmaktır.

Standart boşluklar dahil

İstenilen çıktıyı harici bir kaynaktan alma

Bu, soruyu içeren sayfayı almak için bir HTTP isteği yapmayı ve bu sayfadan bir çözüm çıkarmayı içerir. Bu, 2011'de hafifçe eğlendirici geçti, ama şimdi türev ve ilgi çekici.

Yani, isteği yanıtlaması için isteği başka bir sunucuya yönlendiremezsiniz.


Sunucu işlevselliği ile ilgili bazı karışıklıkların ele alınması:
Sunucunuz, bir HTTP isteği yapıldığında doğru yanıtla yanıt verdiği sürece hiçbir HTTP isteği yapmazken herhangi bir şey yapabilir (veya hiçbir şey yapamaz).


15
Her http isteğine? Elbette bir kahve içenler: URI?
dave

3
Kök ayrıcalıklarımız olduğunu varsayabilir miyiz? (örneğin, bağlama () bağlantı noktası 80 tamam)
Digital Trauma

2
@DigitalTrauma Evet, sunucunuz için artırılmış ayrıcalıkları kabul edebilirsiniz.
Nit

4
@Knerd Ben hiç bir tarafa yaslanmıyorum, bir program yazmıyorsunuz, sadece birini yapılandırıyorsunuz.
Nit

2
Aman Tanrım. IOT geldiğinde, bu durum kodunun mevcut bir nedeni olabilir!
Aydınlık

Yanıtlar:


39

GNU Awk: 69 karakter

Bir sunucunun kendisi (sonsuz bir anda bir istek yerine getirir), kütüphane kullanılmaz.

Bağlanan herkese 418 gönder ( 82 69 karakter):

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

Bir şeyler gönderen herkese 418 gönder ( 93 80 karakter):

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

Geçerli bir HTTP GET isteği gönderen herkese 418 gönder ( 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)}}

Ama .. nasıl bağlanılır? ;)
Doktoru

5
Herhangi bir web sunucusuna bağlandığınız gibi. Tarayıcı, netcat, telnet, wget, curl, başka GNU awkkomut, ... Teorik olarak localhost dinler: 80, ama bu 1) hiçbir web sunucusu için Skype veya 80 numaralı bağlantı noktasını kullanması gereken diğer program; 2) 1024'ün altındaki bağlantı noktalarını açmak için süper kullanıcı olmanız gerekir. Bu nedenle test etmek için komut dosyasındaki bağlantı noktası numarasını 8080 ( s="/inet/tcp/8080/0/0") gibi bir şeye göre düzenlemek ve sonra buna bağlanmak daha kolaydır . pastebin.com/zauP7LMA
insan yapımı

2
Anlıyorum. Güzel. Burada Nok Awk :)
Doktor

1
Atanmamış olan 8 gibi daha küçük bağlantı noktasını kullanarak bir bayttan tasarruf edebilirsiniz.
Hannes Karppila

@HannesKarppila, bu doğru. Ancak, açıkça bir bağlantı noktası belirten diğer tüm çözümlerin (Haskell ve 8888 numaralı bağlantı noktası hariç) 80 numaralı bağlantı noktasını kullanması koşuluyla, karşılaştırılabilirlik için böyle devam etmem daha iyi.
Manat çalışması

32

Bash (33)

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

3
İki yeni hat gerekli mi? Tamam, benim için sadece biriyle çalışmak gibi görünüyor. Ayrıca benim sayıma göre yukarıdakiler 34 bayttır - Sanırım editörünüze gereksiz bir yeni satır ekliyor ya da \0dosyanızın sonuna geliyor - bunu yapabilirsiniz truncateve hala çalışıyor. s='echo HTTP/1.1 418|nc -lp80 -q1;$0' ; echo ${#s}benim için 33 verir
Digital Trauma

@DigitalTrauma: Haklısın - son satır buraya otomatik olarak eklenir: Burada bir bash neden yeni bir satır ekler? ------ Fakat iki olası problem görüyorum: 1. Senaryo $PATHdizinin birinde saklanmasını veya bir yol ile çağrıldığını (özyinelemeyle $0) bekler . ----- 2. HTTP, satırların \r\nyalnızca sonlandırılmasını gerektirmez \n. Burada dize olmalı $"HTTP/1.1 418\r\n\r"(daha uzun okunabilir formda). ------ Ve sonunda: Betik daha kısa olabilir: -q1Parametre gerekli değildir.
pabouk

2
@DigitalTrauma, @pabouk: Çıktının iki yeni satırla bitmesi gerekiyor. Bu yüzden yeni satırlardan biri gereksizdi (burada dize nedeniyle), ancak echodeğişken çalışmıyor (en azından Firefox bunu 418 olarak tanımıyor). Ancak, \rs gerekli değildir. Teknik \r\n\r\nözellik olması gerektiğini söylüyor , ama en azından Firefox ve Chrome kabul edecek \n\n, bu yüzden onları dahil etmemek için golf ruhu içinde görünüyor. -q1Tarayıcı kendiliğinden bağlantıyı kapatmak olmaz çünkü parametre, sistemimde gerekliydi. $0komut dosyası çalıştırılabilir hale getirilir ve bu şekilde çağrılırsa düzgün çalışır.
marinus

@ marinus İlginç - wgetSadece bir yeni hat ile iyi gibi görünen testler yapıyordum
Digital Trauma

1
@pabouk - Burada ilginç snippet w3.org/Protocols/HTTP/OldServers.html : "Satırlar Satır Beslemesi tarafından sonlandırılmış olarak kabul edilmeli ve önceki Satır Başlığı karakteri dikkate alınmamalı"
Dijital Travma

30

PHP - 85 bayt

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

Windows Stili (CR-LF) satır sonları ile kaydedilmiş, php_socketsetkin olmasını gerektirir .

Aslında bunu Hard Code Golf için hata kodum olarak kullandım : Sohbet odası mücadelesi oluştur , ancak kimse fark etmedi.


Tarayıcı Dostu sürüm

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

Komut dosyasını CLI'de başlatın ve tarayıcınızı konumuna getirin http://localhost.


1
Firendlyness / I'm a teapot:-) için +1
Levit

20

Node.js (LiveScript)

http modül - 66

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

Qwertiy'in cevabından ilham alındı .

net modül - 76

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

2
Oy kullanmayan kişi nedenini açıklamaya özen gösterebilir mi?
nyuszika7h

20

Ruby + Rack, 19 bayt

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

Olarak kaydedilmeli config.ruve rackupkomutla çalıştırılmalıdır .

Veya "saf" Ruby'yi tercih ederseniz:

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

42 bayt + -rrackbayrak = 48 bayt


12

Bash + BSD genel komutları, 29

Diğer cevaplardan biraz ödünç almak:

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

Benim için çalışıyor wget.

Kullanılacak ilk cevap nc, 38

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

Kök ayrıcalıkları kabul ediyorum - aşağıdaki gibi çalıştırın:

sudo bash ./418.sh

3
@ ub3rst4r Doğru - Bu yüzden kabuk komut dosyası bakış açısıyla "BSD genel komutları" olarak nitelendirilebilecek "BSD genel komutları" yazdım. OP’den: "Tüm kütüphaneler kabul edilir"
Digital Trauma

2
Bir yanıt yeni bir satırla bitmeli, bkz. W3.org/Protocols/HTTP/Response.html
Nit

2
@Nit - Evet - bash "burada dizeleri" otomatik olarak yeni bir satır eklenir
Digital Trauma

1
Peki yanc -l 80 <<<HTTP/1.1\ 418;$0
core1024 20:14

1
İki boşlukla karıştığım için üzgünüm. -pAnahtarı kullanmadığınızı fark etmedim :) Kodu Firefox ile test ettim ve iki yeni satır olmadan durum kodu tanınmadı.
pabouk

9

Yakut (nc sistem komutu) - 35

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

DigitalTrauma kullanma fikri için kredi kazanmalıdır nc, ancak Ruby Bash'den daha az karakterle sonsuz bir döngü yapabilir :)

Yakut (TCPServer) - 75

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

Bu newline kasıtlı - gerçek newline karakteri "\ n" den daha kısa bir karakter.

Yakut (WEBrick HTTPServer) - 87

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

Bir yanıt yeni bir satırla bitmeli
Nit

1
@DigitalTrauma, bunu kullanacaktım, ama sonra ters eğik çizginin başka bir ters eğik çizgiyle kaçması gerektiğinin farkına vardım, bu yüzden yine de aynı sayıda karakter olurdu :)
Trey Thomas

@TreyThomas Oh Anladım - bu yüzden Ruby'nin burada fazladan bir kaçış seviyesine ihtiyacı var
Digital Trauma

8

Node.js, 80

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

Cevap

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
Düğümün yerel olarak bu hata kodunu desteklediğini görmek harika oldu ^^ ^^
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
Dayanarak hallvabo 'ın yorumun içinde Python golf için İpuçları , from socket import*;s=socket(AF_INET,SOCK_STREAM)kısadır.
14'de

@ manatwork Teşekkürler, sonsuz döngüye daha kısa bir yolu var mı?
Püf

3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))- bir şeyi özlemediğim sürece. (. Dil onları izin verdiği arada, bu şekilde satırbaşıyla tek karakterleri saymak için çekinmeyin Eğer yerine satırbaşıyla komutları ayırarak gevşek bir şey ;.)
manatwork

Sorunun sahibinin yorumuna göre 80 numaralı bağlantı noktasının erişilebilir olduğunu varsayarak 2 karakteri kesebilirsiniz . Taşınabilirliği bozabilecek ancak burada kabul edilebilir olan çirkin bir şey: sabitlerin değerlerini doğrudan kullanın s=socket(2,1)(en azından bunlar benim Linux'umdaki değerleridir).
Manatwork

Belgeler listen(), “maksimum değerin sisteme bağımlı (genellikle 5)” olduğunu belirten parametresine göre. Yani 10 yerine 9, bu kadar yeter ve 1 karakter daha kısadır. Ve bytes('HTTP/1.1 418\n','UTF8')bir edebi yerine b'HTTP/1.1 418\n'yeterli. Veya Python 2 kodunu byaparsanız, bytesprefix artık gerekli değildir. Ve daha kısa send()da yeterli gibi görünüyor.
Manatwork

7

Haskell - 142 bayt

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 bayt

Düzenleme - uyum uğruna ekstra bir yeni satırda (toplam 2 satır) eklenir.

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

Bir yanıt yeni bir satırla bitmelidir, bkz. W3.org/Protocols/HTTP/Response.html
Nit

3
@Nit - Evet, -clewonline seçeneği belirtilmediği sürece, Tcl otomatik olarak yeni bir satır ekler. tcl.tk/man/tcl/TclCmd/puts.htm
Dijital Travma

5

Julia: 86 73 karakter

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

")
close(c)
end

Asıl "Ben bir çaydanlıkyım" bölümüne ihtiyacınız olduğunu sanmıyorum - cevap kodu yeterli olmalı.
21:14

Evet farkettim. Ancak bu Julia'nın puanına pek yardımcı olamayacağından bunu tamamladım. Ancak dillerin karşılaştırılmasını kolaylaştırmak için muhtemelen kaldırılması daha iyi olacaktır.
Manat işi

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 karakter

Daha önce R ile soket programlama yapmamıştım, ama deneyeceğim:

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

İşte socketConnectionbir soket açar: ilk argüman ana bilgisayar olmalı, varsayılanı localhostburada atlayabilmemiz; İkinci argüman varsayılan olmayan bağlantı noktasıdır, daha sonra serverbelirtilmişse argüman sadece mevcut olanla bağlantı kurarsa TRUEsoketi oluşturur FALSE. T, varsayılan olarak, TRUER'ye eşittir.

Düzenleme: @AlexBrown tarafından önerilen bir düzenlemede önerildiği gibi, bu 69 karakterle kısaltılabilir :

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

4

Node.js koa , 61 Bayt

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

Tepki:

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

V0.11.12 + düğümü gerektirir

Olarak çalıştırmak:

node --harmony app.js

Nedir function*?
nyuszika7h

2
Bu, bir ECMAScript 6, Harmony önerisinin bir parçası olan bir jeneratör işlevidir .
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\rdaha kısa.
jimmy23013

Bu \\ Tgerekli bile değil.
nyuszika7h

3

MATLAB, 97 86 bayt

Mutlak bayt sayımı açısından ciddi bir rakip değil, ancak matematiksel bir araç kullanarak tamamen işlevsel bir web sunucusu yazmanın mümkün olacağını düşünmediğim için göndermeyi çok isterdim. Özellik kısaltmasının kullanıldığını unutmayın : 'Ne','s'dahili olarak genişler '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

Bunu kullanarak en az çabayla yapabilirsiniz. .htaccess dosya ve php .

Sunucunuza tüm erişimler 418 durumunu döndürür.

Kod aşağıdadır:

.htaccess (28 bayt)

RewriteRule .* index.php [L]

PHP ( 38 19 bayt)

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

Bana bir sürü baytı kurtardığın için teşekkürler .


Bunu test ettim ve istenen sonucu verdiğini onayladım!

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

Bu arada, "Pedido", "İstek" ve "Resposta", "Cevap" anlamına gelir.


-1, bu tam bir program değil. Harici bir web sunucusuna dayanır.
nyuszika7h

@ nyuszika7h Aslında, bir modül olarak kurulu PHP ile Apache'ye dayanıyor. Argümanınız hem geçerli hem de geçersiz. Apache sadece PHP dosyalarına girişleri yönlendirir, PHP dosyalarında kod işlenir.
Ismael Miguel

@ nyuszika7h Bu katman üzerinde aşağı gidersek, PHP kodunuzu çalıştırmak için konsolu bile kullanamazsınız. Apache başlangıçtır. Mermiyi ateşleyen tetik. PHP dosyasını konsoldan çalıştırmak, konsolu tetikler.
Ismael Miguel

Apache'nin zaten çalışıyor olmasına güveniyorsunuz ve varsayılan yapılandırmayı değiştirmeden çalışacağını da sanmıyorum. Ne dediğin umrumda değil, bunu geçerli olarak görmeme imkân yok. Fakat @Nit'e sormalısınız, onların meselesi bu.
nyuszika7h

@ nyuszika7h Geçersiz olsaydı, OP zaten söylerdi.
Ismael Miguel

2

CoffeeScript ile node.js (76)

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

Sadece JavaScript ile derleyin, sonra çalıştırmanız gerekir npm install connect. Ondan sonra başlanode server.js


2

nginx - 35

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

Bunu nginx.conf dosyasında atın, nginx'i başlatın.

Bunun standart boşluklar kullanıp kullanmadığından emin değilsiniz "İşi yapmak için yerleşik işlevleri kullanma" veya "Zorluğu tam anlamıyla yorumlama". Hata! OP, bu cevabı beğenmeyecek gibi görünüyor.


Eğer düşürürsen hala işe yarar mı ;?
Cyril

+ 4 / -4: tartışmalara çok
cat

2

Perl, 78

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

olarak koşmak plackup whatever.pl.


Bir plack uygulaması istiyorsanız, o sub{[418,[],[]]}zaman yeterli olmalıdır. (16 karakter.)
Kasım'ta

Tabii haklısın! Ben halim yok kullanılarak çerçevenin herhangi niye yüklemek? :)
hobbs

@Tobyink kendi olsa olarak göndermek için çekinmeyin :)
Ocak

2

Python 2.7 / Django, 94 bayt

('den varsayılan kazandan eklendi django-admin.py startproject) urls.py' de:

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

1

C # + OWIN 251 240

Daha kısa olacağını umuyordum, ama uzun isim alanları bu planı mahvetti. Microsoft.Owin.SelfHostNuGet'te mevcut paketi gerektirir .

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 connect ile (78)

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

Sen çalıştırmak için gereken npm install connectilk. O zaman başlanode server.js


1

Git, 162 bayt

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

1

Faktör, 101 141 bayt

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

Bağlanan herkese 418 döndür.


1

Java 7, 208 bayt

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

Bu sorunun bir java cevabına ihtiyacı vardı.

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

Durum mesajı nerede?
Qwertiy

@Qwertiy Bu sorunun sadece tamsayı olarak yorumladığım durum kodunu istediğini düşünüyorum, bu yüzden durum mesajı / nedeni kesinlikle gerekmiyor.
Poke

Benim için değil, ama durum metni ile olması gerektiğini düşünüyorum.
Qwertiy,

3
Java 8'i şimdiden al> _>
Pavel

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.