418: Tôi là một ấm trà


68

Như tất cả chúng ta nên biết, có một mã trạng thái HTTP 418: Tôi là một ấm trà .

Nhiệm vụ của bạn, nếu bạn chọn chấp nhận nó, là sử dụng creativitea của bạn và viết máy chủ nhỏ nhất có thể đáp ứng với mã trạng thái trên cho bất kỳ và mọi yêu cầu HTTP được thực hiện cho nó.

Áp dụng sơ hở tiêu chuẩn , bao gồm

Tìm nạp đầu ra mong muốn từ nguồn bên ngoài

Điều này bao gồm thực hiện một yêu cầu HTTP để tìm nạp trang với câu hỏi và trích xuất một giải pháp từ trang đó. Điều này đã gây cười một cách nhẹ nhàng vào năm 2011, nhưng bây giờ là phái sinh và không thú vị.

Có nghĩa là bạn không thể đơn giản chuyển hướng yêu cầu đến một máy chủ khác để yêu cầu trả về.


Giải quyết một số nhầm lẫn về chức năng máy chủ:
Máy chủ của bạn có thể làm bất cứ điều gì (hoặc không có gì) trong khi không có yêu cầu HTTP nào được thực hiện miễn là nó trả lời đúng với phản hồi sau khi yêu cầu HTTP được thực hiện.


15
cho mỗi và mọi yêu cầu http? Chắc chắn chỉ là những người cho một cà phê: URI?
dave

3
Chúng tôi có thể cho rằng chúng tôi đã có quyền root? (ví dụ: liên kết () với cổng 80 là ok)
Chấn thương kỹ thuật số

2
@DigitalTrauma Có, bạn có thể giả sử các đặc quyền leo thang cho máy chủ của mình.
Nit

4
@Knerd Tôi nghiêng về phía không, bạn không viết chương trình, bạn chỉ đơn giản là cấu hình một chương trình.
Nit

2
Chúa ơi. Với IOT xuất hiện, mã trạng thái này có thể có lý do thực sự tồn tại!
Sáng

Câu trả lời:


39

GNU Awk: 69 ký tự

Bản thân một máy chủ (phục vụ vô tận một yêu cầu tại một thời điểm), không có thư viện nào được sử dụng.

Gửi 418 cho mọi người kết nối ( 82 69 ký tự):

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

Gửi 418 cho mọi người gửi một cái gì đó ( 93 80 ký tự):

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

Gửi 418 cho mọi người gửi yêu cầu HTTP GET hợp lệ ( 122 109 ký tự):

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

Nhưng .. làm thế nào để kết nối? ;)
Trình tối ưu hóa

5
Giống như cách bạn kết nối với bất kỳ máy chủ web. Browser, netcat, telnet, wget, curl, một GNU awkkịch bản, ... Về mặt lý thuyết nó lắng nghe trên localhost: 80, nhưng cho rằng 1) không có máy chủ web, Skype hoặc chương trình khác nên sử dụng cổng 80; 2) bạn phải là siêu người dùng để mở các cổng dưới 1024. Vì vậy, để kiểm tra dễ dàng hơn, chỉnh sửa số cổng trong tập lệnh thành một cái gì đó như 8080 ( s="/inet/tcp/8080/0/0") sau đó kết nối với đó. pastebin.com/zauP7LMA
manatwork

2
Tôi hiểu rồi. Mát mẻ. Awk noob tại đây :)
Trình tối ưu hóa

1
Bạn có thể có thể lưu một byte bằng cách sử dụng cổng nhỏ hơn như 8, không được gán.
Hannes Karppila

@HannesKarppila, đúng rồi. Nhưng do tất cả các giải pháp khác chỉ định rõ ràng một cổng (ngoại trừ cổng 8888 của câu trả lời Haskell) đều sử dụng cổng 80, tốt hơn tôi nên giữ nó như thế này để so sánh.
manatwork

32

Bash (33)

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

3
Là hai dòng mới cần thiết? Có vẻ như làm việc tốt với chỉ một cho tôi. Ngoài ra, theo tính toán của tôi, ở trên là 34 byte - Tôi đoán trình soạn thảo của bạn đang thêm một dòng mới không cần thiết hoặc \0vào cuối tệp của bạn - bạn có thể làm truncateđiều này và nó vẫn hoạt động. s='echo HTTP/1.1 418|nc -lp80 -q1;$0' ; echo ${#s}tặng 33 cho tôi
Chấn thương kỹ thuật số

@DigitalTrauma: Bạn đã đúng - dòng mới cuối cùng được thêm tự động vào chuỗi ở đây: Tại sao chuỗi bash ở đây lại thêm chuỗi ký tự mới? ------ Nhưng tôi thấy hai vấn đề có thể xảy ra: 1. Kịch bản lệnh rằng nó được lưu trữ trong một trong các $PATHthư mục hoặc nó được gọi bằng một đường dẫn (đệ quy theo $0). ----- 2. HTTP yêu cầu các dòng bị chấm dứt bởi \r\nkhông chỉ \n. Ở đây chuỗi nên $"HTTP/1.1 418\r\n\r"(dạng dài hơn có thể đọc được). ------ Và cuối cùng: Kịch bản có thể ngắn hơn: -q1Tham số không cần thiết.
pabouk

2
@DigitalTrauma, @pabouk: Đầu ra cần kết thúc với hai dòng mới. Vì vậy, một trong những dòng mới là không cần thiết (vì chuỗi ở đây), nhưng echobiến thể không hoạt động (ít nhất Firefox sẽ không nhận ra nó là một chiếc 418). Tuy nhiên, \rkhông cần thiết. Thông số kỹ thuật nói rằng nó nên như vậy \r\n\r\n, nhưng ít nhất Firefox và Chrome sẽ chấp nhận \n\n, vì vậy dường như trong tinh thần chơi golf không bao gồm chúng. Các -q1tham số là cần thiết trên hệ thống của tôi, bởi vì trình duyệt sẽ không đóng kết nối của chính nó. $0hoạt động tốt nếu tập lệnh được thực thi và được gọi theo cách đó.
bến tàu

@marinus Thú vị - Tôi đã thử nghiệm với wgetnó dường như vẫn ổn chỉ với một dòng mới
Chấn thương kỹ thuật số

1
@pabouk - Đoạn trích thú vị ở đây w3.org/Prot Protocol / HTTP / OldServers.html : "Các dòng nên được coi là bị chấm dứt bởi Line Feed và ký tự Trả về vận chuyển trước bị bỏ qua"
Chấn thương kỹ thuật số

30

PHP - 85 byte

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

Được lưu với các kết thúc dòng Windows-Style (CR-LF), yêu cầu phải php_socketsbật.

Tôi thực sự đã sử dụng nó làm mã lỗi của mình cho Hard Code Golf: Tạo một thử thách Chatroom , nhưng không ai nhận thấy.


Phiên bản thân thiện với trình duyệt

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

Bắt đầu tập lệnh trong CLI và trỏ trình duyệt của bạn vào http://localhost.


1
+1 cho người dùng firendlyness / I'm a teapot:-)
Levit

20

Node.js (LiveScript)

http mô-đun - 66

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

Lấy cảm hứng từ câu trả lời của Qwertiy .

net mô-đun - 76

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

2
Người có thể đánh giá thấp sự quan tâm để giải thích tại sao?
nyuszika7h

20

Ruby + Rack, 19 byte

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

Phải được lưu dưới dạng config.ruvà chạy với rackuplệnh.

Hoặc nếu bạn thích Ruby "nguyên chất":

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

42 byte + -rrackcờ = 48 byte


12

Các lệnh chung của Bash + BSD, 29

Mượn lại một chút từ các câu trả lời khác:

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

Làm việc cho tôi với wget.

Câu trả lời đầu tiên để sử dụng nc, 38

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

Tôi đang giả sử quyền root - chạy như sau:

sudo bash ./418.sh

3
@ ub3rst4r Đúng - Đó là lý do tại sao tôi đã nêu "các lệnh chung BSD", có thể được coi là "thư viện" theo quan điểm của kịch bản lệnh shell. Từ OP: "Tất cả các thư viện đều được chào đón"
Chấn thương kỹ thuật số

2
Một câu trả lời phải kết thúc bằng một dòng mới, xem w3.org/Prot Protocol / AFTP / Revonse.html
Nit

2
@Nit - Có - bash "chuỗi ở đây" sẽ tự động được thêm vào một dòng mới
Chấn thương kỹ thuật số

1
Làm thế nào vềnc -l 80 <<<HTTP/1.1\ 418;$0
core1024

1
Xin lỗi vì sự nhầm lẫn với hai không gian. Tôi không nhận thấy rằng bạn không sử dụng công -ptắc :) Tôi đã kiểm tra mã với Firefox và không có hai dòng mới, mã trạng thái không được nhận dạng.
pabouk

9

Ruby (lệnh hệ thống nc) - 35

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

DigitalTrauma sẽ nhận được tín dụng cho ý tưởng sử dụng nc, tuy nhiên Ruby có thể tạo một vòng lặp vô hạn với ít ký tự hơn Bash :)

Ruby (Máy chủ TCPS) - 75

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

Dòng mới đó là có chủ ý - ký tự dòng mới thực tế ngắn hơn một ký tự so với "\ n".

Ruby (Máy chủ WEBrick HTTPS) - 87

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

Một câu trả lời phải kết thúc bằng một dòng mới, xem w3.org/Prot Protocol / AFTP / Revonse.html
Nit

1
@DigitalTrauma, tôi sẽ sử dụng nó, nhưng sau đó nhận ra dấu gạch chéo ngược cần được thoát bằng một dấu gạch chéo ngược khác, vì vậy dù sao nó cũng sẽ có cùng số ký tự :)
Trey Thomas

@TreyThomas Tôi hiểu rồi - vì vậy Ruby cần thêm một lối thoát ở đây
Chấn thương kỹ thuật số

8

Node.js, 80

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

Câu trả lời là

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
Tôi thấy thật tuyệt vời khi nút hỗ trợ mã lỗi đó một cách tự nhiên ^^
Levit

8

Con trăn 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
Dựa trên nhận xét của hallvabo trong Mẹo chơi gôn trong Python , ngắn hơn. from socket import*;s=socket(AF_INET,SOCK_STREAM)
manatwork

@manatwork Cảm ơn, có cách nào ngắn hơn để vòng lặp vô hạn không? Tôi đã không tìm thấy một trong những lời khuyên ...
Tuomas Laakkonen

3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))- trừ khi tôi bỏ lỡ điều gì đó. (Nhân tiện, hãy thoải mái đếm các dòng mới một ký tự, vì ngôn ngữ cho phép chúng. Bằng cách đó, bạn không mất gì khi tách các lệnh bằng dòng mới thay vì ;.)
manatwork 19/11/14

Bạn có thể cắt 2 ký tự bằng cách giả sử cổng 80 có thể truy cập được, theo nhận xét của chủ sở hữu câu hỏi . Một điều xấu xí có thể phá vỡ tính di động, nhưng có thể được chấp nhận ở đây: sử dụng trực tiếp các giá trị của hằng số s=socket(2,1)(ít nhất đó là các giá trị của chúng trên Linux của tôi).
manatwork

Tài liệu nói về listen()tham số của mà giá trị tối đa là phụ thuộc vào hệ thống (thường là 5). Vì vậy, thay vì 10, 9 là quá đủ và ngắn hơn 1 ký tự. Và thay vì bytes('HTTP/1.1 418\n','UTF8')một nghĩa đen b'HTTP/1.1 418\n'là đủ. Hoặc nếu bạn tạo mã Python 2, thì bbytesprefix không còn cần thiết nữa. Và ngắn hơn send()dường như là đủ.
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}

5

Tcl (> = 8,5), 78 byte

Chỉnh sửa - được thêm vào một dòng mới bổ sung (tổng cộng 2 dòng mới) vì mục đích tuân thủ.

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

Một câu trả lời phải kết thúc bằng một dòng mới, xem w3.org/Prot Protocol / HTTP / Revonse.html
Nit

3
@Nit - Có, Tcl đặt sẽ tự động nối thêm một dòng mới, trừ khi tùy chọn -nonewline được đưa ra. tcl.tk/man/tcl/TclCmd/puts.htm
Chấn thương kỹ thuật số

5

Julia: 86 73 ký tự

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

")
close(c)
end

Tôi không nghĩ bạn cần phần "Tôi là ấm trà" thực tế - mã phản hồi là đủ.
Desty

Vâng, tôi nhận thấy nó. Nhưng vì điều đó sẽ không giúp ích nhiều cho điểm số của Julia, tôi đã hoàn thành nó. Nhưng có lẽ sẽ tốt hơn nếu loại bỏ nó để tạo điều kiện so sánh các ngôn ngữ.
manatwork

5

Quyền hạn, 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 ký tự

Chưa bao giờ lập trình socket với R trước đây, nhưng tôi sẽ thử:

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

Ở đây socketConnectionmở một socket: đối số đầu tiên phải là máy chủ lưu trữ, mặc định localhostchúng ta có thể bỏ qua nó ở đây; đối số thứ hai là cổng không có mặc định, sau đó đối số serverkhi được chỉ định TRUEsẽ tạo ổ cắm, nếu FALSEnó chỉ kết nối với cổng hiện có. Ttheo mặc định là bằng TRUE, trong R.

Chỉnh sửa: Như được đề xuất trong một chỉnh sửa được đề xuất bởi @AlexBrown, điều này có thể được rút ngắn thành 69 ký tự :

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

4

Node.js koa , 61 byte

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

Phản ứng:

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

Yêu cầu nút v0.11.12 +

Chạy như:

node --harmony app.js

Có gì function*?
nyuszika7h

2
Đó là chức năng của trình tạo , một phần của đề xuất ECMAScript 6, Harmony.
cPu1

4

Vỏ + 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\rngắn hơn
jimmy23013

Điều \\ Tthậm chí không cần thiết.
nyuszika7h

3

MATLAB, 97 86 byte

Không thực sự là một ứng cử viên nghiêm trọng về số lượng byte tuyệt đối, nhưng tôi muốn đăng nó vì tôi không nghĩ có thể viết một máy chủ web đầy đủ chức năng bằng một công cụ toán học. Lưu ý việc sử dụng rút ngắn tài sản : 'Ne','s'nội bộ mở rộng đến '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

Bạn có thể làm điều này với nỗ lực tối thiểu bằng cách sử dụng một .htaccess tệp và php.

Tất cả các truy cập vào máy chủ của bạn sẽ trả về trạng thái 418.

Dưới đây là mã:

.htaccess (28 byte)

RewriteRule .* index.php [L]

PHP ( 38 19 byte)

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

Cảm ơn @primo vì đã tiết kiệm cho tôi một loạt byte!


Tôi đã thử nghiệm điều này và xác nhận nó trả về kết quả mong muốn!

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

Nhân tiện, "Pedido" có nghĩa là "Yêu cầu" và "Phản hồi" có nghĩa là "Trả lời".


-1, đây không phải là một chương trình hoàn chỉnh. Nó dựa vào một máy chủ web bên ngoài.
nyuszika7h

@ nyuszika7h Thật ra, nó dựa vào Apache với PHP được cài đặt dưới dạng một mô-đun. Đối số của bạn là hợp lệ và không hợp lệ. Apache chỉ chuyển hướng truy cập vào tệp PHP, tệp PHP đảm nhiệm mã.
Ismael Miguel

@ nyuszika7h Nếu chúng tôi đi xuống lớp đó, thì bạn thậm chí không thể sử dụng bàn điều khiển để chạy mã PHP của mình. Apache là người khởi đầu. Bộ kích hoạt bắn viên đạn. Chạy tệp PHP từ bàn điều khiển, sẽ làm cho bàn điều khiển kích hoạt.
Ismael Miguel

Bạn đang dựa vào việc Apache đã chạy và tôi không nghĩ nó sẽ hoạt động mà không thay đổi cấu hình mặc định. Tôi không quan tâm những gì bạn nói, không có cách nào tôi có thể thấy điều này là hợp lệ. Nhưng bạn nên hỏi @Nit, vì đó là câu hỏi của họ.
nyuszika7h

@ nyuszika7h Nếu không hợp lệ, OP đã nói rồi.
Ismael Miguel

2

node.js với CoffeeScript (76)

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

Chỉ cần biên dịch nó thành JavaScript, sau đó bạn cần chạy npm install connect. Sau đó bắt đầu vớinode server.js


2

nginx - 35

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

Ném nó trong nginx.conf, bắt đầu nginx.

Không chắc chắn nếu điều này sử dụng sơ hở tiêu chuẩn "Sử dụng các chức năng tích hợp để thực hiện công việc" hoặc "Diễn giải thách thức quá theo nghĩa đen." Rất tiếc, có vẻ như OP sẽ không thích câu trả lời này.


Nó sẽ vẫn hoạt động nếu bạn đánh rơi ;?
Cyril

+ 4 / -4: hoàn thành tốt cuộc tranh cãi: D
cat

2

Perl, 78

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

chạy như plackup whatever.pl.


Nếu bạn muốn có một ứng dụng plack, thì chỉ sub{[418,[],[]]}cần là đủ. (16 ký tự.)
tobyink

Tất nhiên là bạn đúng! Nó không giống như tôi đang sử dụng bất kỳ khuôn khổ nào, tại sao tải nó? :)
hobbs

@tobyink cứ thoải mái gửi nó như của riêng bạn :)
hobbs

2

Python 2.7 / Django, 94 byte

(được thêm từ bản tóm tắt mặc định từ django-admin.py startproject) Trong urls.py:

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

1

C # + RIÊNG 251 240

Tôi thực sự hy vọng nó sẽ ngắn hơn, nhưng không gian tên dài đã phá hỏng kế hoạch đó. Yêu cầu Microsoft.Owin.SelfHostgói có sẵn trên 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);});}}

1

node.js với kết nối (78)

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

Bạn cần chạy npm install connecttrước. Sau đó bắt đầu vớinode server.js


1

Đi, 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)
}

1

Yếu tố, 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 ]

Trả lại 418 cho tất cả những người kết nối.


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

Câu hỏi này cần một câu trả lời java.

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

Thông điệp trạng thái ở đâu?
Qwertiy

@Qwertiy Tôi nghĩ rằng câu hỏi này chỉ yêu cầu mã trạng thái mà tôi hiểu là số nguyên, do đó, thông báo / lý do không được yêu cầu nghiêm ngặt.
Chọc

Không phải tôi tuyệt vọng, nhưng tôi nghĩ nó nên với văn bản trạng thái.
Qwertiy

3
Nhận Java 8 rồi> _>
Pavel

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.