418:私は急須です


68

知っておくべきこととして、HTTPステータスコード418があります:私はティーポットです。

あなたの使命は、あなたがそれを受け入れることを選択した場合、あなたの創造物を使用し、それに対して行われたあらゆるHTTPリクエストに上記のステータスコードで応答する最小のサーバーを書くことです。

以下を含む標準の抜け穴が適用されます

外部ソースから目的の出力を取得する

これには、HTTPリクエストを実行して質問のあるページを取得し、そのページからソリューションを抽出することが含まれます。これは2011年には少しおもしろかったですが、現在は派生的で面白くありません。

つまり、単にリクエストを別のサーバーにリダイレクトして、レスポンスを返すようにすることはできません。


サーバー機能に関するいくつかの混乱に対処する:
HTTP要求が行われると、正しい応答で応答する限り、サーバーは何も(または何も)できませんが、HTTP要求は行われません。


15
すべてのHTTPリクエストに?確かにコーヒーはURIだけですか?
デイブ14年

3
すでにルート権限を持っていると仮定できますか?(たとえば、ポート80へのbind()は問題ありません)
デジタル外傷14年

2
@DigitalTraumaはい、サーバーの昇格された権限を引き受けることができます。
Nit 14年

4
@Knerd私は反対側に傾いています、あなたはプログラムを書いているのではなく、あなたは単にそれを設定しているだけです。
Nit 14年

2
ああ、神様。IOTが登場すると、このステータスコードには実際に存在する理由があるかもしれません!
発光14年

回答:


39

GNU Awk:69文字

サーバー自体(一度に1つのリクエストを無限に処理します)。ライブラリは使用されません。

接続するすべての人に418を送信します(82 69文字):

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

何か(93 80文字)を送信するすべての人に418を送信します。

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

有効なHTTP GETリクエスト(122 109文字)を送信する全員に418を送信します。

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

しかし..接続方法は?;)
オプティマイザー14年

5
Webサーバーに接続するのと同じ方法。ブラウザ、netcattelnetwgetcurl、他のGNUのawkスクリプトは、...理論的には、ローカルホスト上でリッスン:80、しかしその1)なしのWebサーバー用に、Skypeや他のプログラムがポート80を使用する必要があります。2)1024未満のポートを開くにはスーパーユーザーである必要があります。したがって、テストでは、スクリプトのポート番号を8080(s="/inet/tcp/8080/0/0")のように編集してから接続する方が簡単です。pastebin.com/zauP7LMA
manatwork

2
そうですか。クール。ここにawk noob :)
オプティマイザー

1
割り当てられていない8などの小さいポートを使用して、バイトを節約できる可能性があります。
ハンネスカルピーラ

@HannesKarppila、それは正しい。しかし、ポートを明示的に指定する他のすべてのソリューション(Haskellアンサーのポート8888を除く)がポート80を使用することを考えると、比較可能性のためにこのようにした方がよいでしょう。
マナトワーク

32

バッシュ(33)

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

3
2つの改行が必要ですか?私にとってはたった1つで問題なく動作するようです。また、私のカウントでは、上記は34バイトです-エディターが不必要な改行または\0ファイルの最後に追加していると推測しています- truncateこれを行うことができ、それでも動作します。 s='echo HTTP/1.1 418|nc -lp80 -q1;$0' ; echo ${#s}私に33を与える
デジタル外傷14年

@DigitalTrauma:あなたは正しいです-最終的な改行はここの文字列に自動的に追加されます:bash here-stringが末尾の改行文字を追加するのはなぜですか?------しかし、次の2つの問題が発生する可能性があります。1 .スクリプトは、$PATHディレクトリの1つに格納されているか、パス(による再帰$0)で呼び出されることを想定しています。----- 2. HTTPでは、\r\nだけでなく行を終了する必要があります\n。ここで、文字列は$"HTTP/1.1 418\r\n\r"(より読みやすい形式)である必要があります。------そして最後に:スクリプトを短くすることができます:-q1パラメーターは必要ありません。
pabouk 14年

2
@ DigitalTrauma、@ pabouk:出力は2つの改行で終わる必要があります。そのため、改行の1つは(ヒアストリングのため)不要でしたが、echoバリアントは機能しません(少なくともFirefoxは418として認識しません)。ただし、\rsは必要ありません。仕様ではそうすべきだと書かれています\r\n\r\nが、少なくともFirefoxとChromeは受け入れます\n\nので、それらを含めないことはゴルフの精神のようです。-q1ブラウザは、それ自体で、接続を閉じませんので、パラメータは、私のシステム上の必要がありました。$0スクリプトが実行可能になり、その方法で呼び出された場合は正常に動作します。
マリヌス14年

@marinus興味深い-私がテストしていたwgetただ一つの改行と罰金であるように思われた
デジタルトラウマ

1
@pabouk-興味深いスニペットはこちらw3.org/Protocols/HTTP/OldServers.html:「ラインはラインフィードによって終了していると見なされるべきであり、先行するキャリッジリターンキャラクターは無視されます」
デジタルトラウマ14年

30

PHP-85バイト

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

Windowsスタイル(CR-LF)の行末で保存され、php_sockets有効にする必要があります。

これを実際にハードコードゴルフのエラーコードとして使用しました。チャットルームチャレンジを作成しましたが、誰も気付きませんでした。


ブラウザに優しいバージョン

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

CLIでスクリプトを開始し、ブラウザでをポイントしますhttp://localhost


1
ユーザーfirendlyness /ための1 I'm a teapot:-)
レヴィット

20

Node.js(LiveScript)

http モジュール-66

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

Qwertiyの回答に触発されました

net モジュール-76

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

2
世話を断念した人はその理由を説明できますか?
nyuszika7h 14年

20

Ruby + Rack、19バイト

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

として保存config.ruし、rackupコマンドで実行する必要があります。

または、「純粋な」Rubyを好む場合:

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

42バイト+ -rrackフラグ= 48バイト


12

Bash + BSD一般コマンド、29

他の回答から少し借りて:

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

で私のために働くwget

使用する最初の回答nc、38

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

私はルート権限を想定しています-次のように実行します:

sudo bash ./418.sh

3
@ ub3rst4r正しい-それが、シェルスクリプトの観点から「ライブラリ」と見なされる「BSD一般コマンド」を述べた理由です。OPから:「すべてのライブラリを歓迎します」
デジタルトラウマ14年

2
応答は改行で終わる必要があります。w3.org/ Protocols / HTTP / Response.html
Nit

2
@Nit-はい-bashの「here文字列」に自動的に改行が追加されます
Digital Trauma 14年

1
どうですかnc -l 80 <<<HTTP/1.1\ 418;$0
core1024 14年

1
2つのスペースが混同してすみません。-pスイッチを使用しなかったことに気付きませんでした:) Firefoxでコードをテストしましたが、改行が2つない場合、ステータスコードは認識されません。
pabouk 14年

9

Ruby(ncシステムコマンド)-35

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

DigitalTraumaはを使用するというアイデアを称賛すべきですが、ncRubyはBashより少ない文字数で無限ループを作成できます:)

ルビー(TCPServer)-75

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

その改行は意図的なものです。実際の改行文字は「\ n」よりも1文字短いです。

Ruby(WEBrick HTTPServer)-87

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

応答は改行で終わる必要があります。w3.org/ Protocols / HTTP / Response.html
Nit

1
、私は@DigitalTraumaそれを使用しようとしてますが、それは:)とにかく同じ文字数であったであろうように、バックスラッシュは、別のバックスラッシュでエスケープする必要が実現した
トレイ・トーマス

@TreyThomasなるほど-ルビーはここで余分なレベルのエスケープが必要です
デジタルトラウマ14年

8

Node.js、80

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

応答は

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
ノードがそのエラーコードをネイティブにサポートしているのは素晴らしいと思います^^
レビット

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
Pythonでのゴルフのヒントhallvaboコメントに基づくと、短いです。from socket import*;s=socket(AF_INET,SOCK_STREAM)
マナトワーク14年

@manatworkありがとう、無限ループへのより短い方法はありますか?私は...ヒントにものを見つけられませんでした
のTuomas Laakkonen

3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))–何かを見逃さない限り。(ちなみに、言語で許可されているように、改行を1文字として数えてください。そのようにすると、コマンドを改行ではなく改行で区切ることで何も;
失う

質問の所有者のコメントによると、ポート80がアクセス可能であると想定することにより、2文字をカットできます。移植性を損なうかもしれないが、ここで受け入れられるかもしれないOneいこと:定数の値を直接使用してくださいs=socket(2,1)(少なくともこれらはLinuxの値です)。
マナトワーク

ドキュメントには、listen()「最大値はシステムに依存する(通常5)」というパラメータが記載されています。したがって、10の代わりに9で十分であり、1文字短くなります。そしてbytes('HTTP/1.1 418\n','UTF8')、リテラルの代わりにb'HTTP/1.1 418\n'十分です。または、コードをPython 2にする場合、bbytesprefixはもう必要ありません。また、短い方でsend()も十分なようです。
マナトワーク14年


5

Tcl(> = 8.5)、78バイト

編集-コンプライアンスのために、余分な改行(合計2つの改行)を追加しました。

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

応答は改行で終わる必要があります。w3.org/ Protocols / HTTP / Response.html
Nit

3
@Nit-はい、-nonewlineオプションが指定されない限り、Tcl putsは自動的に改行を追加します。tcl.tk/man/tcl/TclCmd/puts.htm
デジタルトラウマ

5

ジュリア:86 73文字

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

")
close(c)
end

実際の「私はティーポットです」の部分は必要ないと思います。応答コードで十分です。
Desty 14年

はい、気づきました。しかし、それはジュリアのスコアではあまり役に立たないので、私はそれを完全に保ちました。しかし、おそらく言語の比較を容易にするためにそれを削除する方が良いでしょう。
マナトワーク14年

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文字

Rでソケットプログラミングをしたことはありませんでしたが、試してみます。

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

ここsocketConnectionでソケットを開きます。最初の引数はホストである必要があり、デフォルトでlocalhostはここでスキップできます。2番目の引数はデフォルトを持たないポートでserver、指定された引数は既存TRUEのソケットにFALSE接続するだけであれば、ソケットを作成します。TデフォルトではTRUE、Rのに等しい

編集: @AlexBrownによる編集案で示唆されているように、これは69文字に短縮できます。

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

4

Node.js koa、61バイト

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

応答:

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が必要+

として実行:

node --harmony app.js

なにfunction*
nyuszika7h 14年

2
これはジェネレーター関数であり、ECMAScript 6、Harmony提案の一部です。
cPu1 14


3

MATLAB、97 86バイト

絶対バイト数という点ではそれほど深刻な競争相手ではありませんが、数学ツールを使用して完全に機能するWebサーバーを作成することは不可能だと考えたため、投稿したいと思います。プロパティ短縮の使用に注意してください:'Ne','s'内部的にに拡張され'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

.htaccessファイルとphp を使用して最小限の労力でこれを行うことができます。

サーバーへのすべてのアクセスは、ステータス418を返します。

コードは次のとおりです。

.htaccess(28バイト)

RewriteRule .* index.php [L]

PHP(38 19バイト)

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

たくさんのバイトを節約してくれた@primoに感謝します!


私はこれをテストし、それが望ましい結果を返すことを確認しました!

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

ちなみに、「Pedido」は「リクエスト」を意味し、「Resposta」は「応答」を意味します。


-1、これは完全なプログラムではありません。外部Webサーバーに依存します。
nyuszika7h 14年

@ nyuszika7h実際には、PHPがモジュールとしてインストールされたApacheに依存しています。引数は有効でも無効でもあります。ApacheはPHPファイルへのアクセスのみをリダイレクトし、PHPファイルがコードを処理します。
イスマエルミゲル14年

@ nyuszika7hそのレイヤーに進むと、コンソールを使用してPHPコードを実行することさえできません。Apacheはスターターです。弾丸を発射するトリガー。コンソールからPHPファイルを実行すると、コンソールがトリガーになります。
イスマエルミゲル14年

Apacheがすでに実行されていることに依存しているため、デフォルトの構成を変更しなくても機能するとは思わない。私はあなたの言うことを気にしません、これが有効であると見る方法はありません。しかし、彼らの質問なので、@ Nitに尋ねるべきです。
nyuszika7h 14年

@ nyuszika7h無効な場合、OPはすでに言っていたでしょう。
イスマエルミゲル14年

2

node.jsとCoffeeScript(76)

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

JavaScriptにコンパイルするだけで、を実行する必要がありますnpm install connect。その後で開始node server.js


2

nginx-35

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

nginx.confでそれを投げ、nginxを起動します。

これが「組み込み関数を使用して作業を行う」または「チャレンジを文字通りに解釈する」という標準的な抜け穴を使用しているかどうかはわかりません。OPさんはこの回答が気に入らないようです。


あなたがドロップした場合でも動作します;か?
シリル14年

+ 4 / -4:論争でよくやった:D
cat

2

Perl、78

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

として実行しplackup whatever.plます。


Plackアプリケーションが必要な場合は、それでsub{[418,[],[]]}十分です。(16文字)
tobyink 14年

もちろんあなたは正しいです!フレームワークを使用しているわけではありません。なぜロードするのですか?:)
ホッブズ14年

@tobyinkでも自由に投稿してください:)
hobbs

2

Python 2.7 / Django、94バイト

(デフォルトのボイラープレートから追加 django-admin.py startproject)urls.py:

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

1

C#+ OWIN 251 240

私はそれがもっと短くなることを本当に望んでいましたが、長い名前空間はその計画を台無しにしました。Microsoft.Owin.SelfHostNuGetで利用可能なパッケージが必要です。

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

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

npm install connect最初に実行する必要があります。その後で開始node server.js


1

Go、162バイト

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

1

係数、101 141バイト

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

接続する全員に418を返します。


1

Java 7、208バイト

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

この質問にはJavaの回答が必要でした。

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

ステータスメッセージはどこにありますか?
Qwertiy

@Qwertiyこの質問は、私が整数として解釈するステータスコードを要求するだけだと思う​​ので、ステータスメッセージ/理由は厳密には必要ありません。
ポケ

私が決定するわけではありませんが、ステータステキストを含めるべきだと思います。
Qwertiy

3
すでにJava 8を入手> _>
Pavel

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.