418:我是茶壶


68

众所周知,HTTP状态码为418:我是茶壶

您的任务(如果您选择接受它)是使用creativitea并编写最小的服务器,该服务器以上述状态代码响应向其发出的所有HTTP请求。

适用标准漏洞,包括

从外部来源获取所需的输出

这包括执行HTTP请求以获取带有问题的页面,并从该页面提取解决方案。早在2011年,这种情况就很有趣了,但现在却是衍生且无趣的。

这意味着您不能简单地将请求重定向到另一台服务器以使其返回响应。


解决有关服务器功能的一些困惑:
只要发出HTTP请求后,服务器便会以正确的响应进行回复,那么您的服务器就可以执行任何操作(或不执行任何操作),而不会向其发出HTTP请求。


15
每个HTTP请求?当然可以喝杯咖啡:URI?
戴夫

3
我们可以假设我们已经具有root特权吗?(例如,将bind()绑定到端口80即可)
Digital Trauma 2014年

2
@DigitalTrauma是的,您可以为服务器承担升级的特权。
Nit 2014年

4
@Knerd我总是站在一边,您不是在编写程序,只是在配置一个程序。
Nit 2014年

2
我的天啊。随着物联网的到来,该状态码可能有实际的存在原因!
发光的

Answers:


39

GNU Awk:69个字符

服务器本身(一次无休止地处理一个请求),不使用任何库。

向连接的每个人发送418(82 69个字符):

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

发送418给发送邮件的所有人(93个 80个字符):

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

将418发送给发送有效HTTP GET请求的所有人(122 109个字符):

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

但是..如何连接?;)
Optimizer

5
连接到任何Web服务器的方式相同。浏览器netcattelnetwgetcurl,其他GNU awk脚本,...理论上是localhost:80,但是对于1)无网络服务器,Skype公司或其他程序应使用80端口; 2)您必须是超级用户才能打开1024以下的端口。因此,为了进行测试,更容易在脚本中将端口号编辑为8080(s="/inet/tcp/8080/0/0"),然后连接到该端口号。pastebin.com/zauP7LMA
manatwork

2
我懂了。凉。Awk noob在这里:)
Optimizer

1
您可以使用较小的端口(如未分配的端口)来保存一个字节,例如8。
汉尼斯·卡皮拉

@HannesKarppila,没错。但是,鉴于所有其他明确指定端口的解决方案(Haskell答案的端口8888除外)都使用端口80,因此我最好像这样保持它的可比性。
manatwork 2013年

32

重击(33)

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

3
这两个换行符是否必要?似乎只适合我一个工作。另外,根据我的计算,以上是34个字节-我猜您的编辑器正在向\0文件的末尾添加不必要的换行符-您可以truncate这样做,但仍然可以使用。 s='echo HTTP/1.1 418|nc -lp80 -q1;$0' ; echo ${#s}给我33点
数字创伤2014年

@DigitalTrauma:您是对的-最后的换行符会自动添加到here字符串中:为什么bash here-string会添加尾随的换行符char?------但是我看到两个可能的问题:1.该脚本期望将其存储在$PATH目录之一中,或者使用路径(由递归$0)调用。----- 2. HTTP要求行\r\n不仅以终止\n。此处的字符串应为$"HTTP/1.1 418\r\n\r"(可读性更好的形式)。------最后:脚本可能更短:该-q1参数不是必需的。
pabouk

2
@ DigitalTrauma,@ pabouk:输出需要以两个换行符结尾。因此,不需要换行符之一(因为在这里是字符串),但是该echo变体不起作用(至少Firefox无法将其识别为418)。但是,\r不需要。规范说应该这样\r\n\r\n,但是至少Firefox和Chrome会接受\n\n,因此似乎本着打高尔夫的精神,不包含它们。该-q1参数在我的系统上是必需的,因为浏览器不会自行关闭连接。$0如果脚本可以执行并以这种方式调用,则可以正常工作。
marinus 2014年

@marinus有趣-我正在测试,wget只需一条换行符就可以了
Digital Trauma

1
@pabouk-此处有趣的摘录w3.org/Protocols/HTTP/OldServers.html:“应该将行视为由换行符终止,并且忽略前面的回车符”
Digital Trauma

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
+1为用户友情/ I'm a teapot:-)
Levit,

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 2014年

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
}

我假设具有root特权-运行如下:

sudo bash ./418.sh

3
@ ub3rst4r正确-这就是为什么我说了“ BSD通用命令”,从shell脚本的角度来看,可以将其视为“库”。从OP:“欢迎所有图书馆”
Digital Trauma 2014年

2
的响应必须以换行符结尾,看到w3.org/Protocols/HTTP/Response.html
尼特

2
@Nit-是的-bash“此处字符串”将自动添加换行符
Digital Trauma

1
怎么样nc -l 80 <<<HTTP/1.1\ 418;$0
core1024 2014年

1
对不起,您对这两个空格感到困惑。我没有注意到您没有使用该-p开关:)我在Firefox上测试了代码,没有两个换行符,则无法识别状态代码。
pabouk

9

Ruby(数控系统命令)-35

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

DigitalTrauma应该会因为使用的想法而获得赞誉nc,但是Ruby可以使无限循环的字符数少于Bash :)

Ruby(TCPServer)-75

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

该换行符是有意的-实际的换行符比“ \ n”短一个字符。

Ruby(WEBrick HTTPServer)-87

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

的响应必须以换行符结尾,看到w3.org/Protocols/HTTP/Response.html
尼特

1
@DigitalTrauma,我要使用它,但是后来意识到反斜杠需要用另一个反斜杠进行转义,因此无论如何它都是相同数量的字符:)
Trey Thomas

@TreyThomas哦,我明白了-因此Ruby需要在这里进行更多的逃生
Digital Trauma

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
我发现节点本机支持该错误代码真是太棒了^^
Levit 2015年

8

Python 3106

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

1
基于hallvabo评论提示高尔夫Python中from socket import*;s=socket(AF_INET,SOCK_STREAM)较短。
manatwork 2014年

@manatwork谢谢,有没有更短的方法来进行无限循环?我没在提示中找到一个...
Tuomas Laakkonen 2014年

3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))–除非我错过了什么。(顺便说一句,在语言允许的情况下,请随时将换行符计算为一个字符。这样,您可以通过用换行符而不是;。来分隔命令,从而不会丢失任何内容。)
manatwork 2014年

根据问题所有者的评论,可以通过假定端口80可访问来切断2个字符。一件丑陋的事情可能会破坏可移植性,但在这里可能是可以接受的:直接使用常量的值s=socket(2,1)(至少这些是我的Linux上的值)。
manatwork 2014年

文档对listen()的参数说“最大值取决于系统(通常为5)”。因此,用9代替10足够多了,而短了1个字符。而不是bytes('HTTP/1.1 418\n','UTF8')文字b'HTTP/1.1 418\n'就足够了。或者,如果您将代码编写为Python 2,则b不再需要bytesprefix。而且较短的send()似乎也足够了。
manatwork 2014年


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
Digital Trauma

5

朱莉娅:86 73个字符

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

")
close(c)
end

我认为您不需要实际的“我是茶壶”部分-响应代码就足够了。
Desty

是的,我注意到了。但这对Julia的得分无济于事,所以我保持了完整。但是可能最好删除它以利于语言比较。
manatwork 2014年

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我们可以在这里跳过它;第二个参数是没有默认端口的端口,然后,如果server指定的参数只是连接到现有TRUE端口,则创建套接字FALSET默认情况下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 2014年

2
这是一个生成器函数,是ECMAScript 6 Harmony建议的一部分。
cPu1 2014年


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 2014年

@ nyuszika7h实际上,它依赖于安装了PHP作为模块的Apache。您的论点既有效又无效。Apache仅将访问重定向到PHP文件,PHP文件负责代码。
Ismael Miguel 2014年

@ nyuszika7h如果我们进入该层,那么您甚至无法使用控制台来运行您的PHP代码。Apache是​​起步者。发射子弹的扳机。从控制台运行PHP文件,将使控制台成为触发器。
Ismael Miguel 2014年

您依靠的是已经运行Apache,并且我认为在不更改默认配置的情况下也无法运行。我不在乎你在说什么,我无法认为这是有效的。但是您应该问@Nit,因为这是他们的问题。
nyuszika7h 2014年

@ nyuszika7h如果无效,则OP可能已经说过。
Ismael Miguel 2014年

2

使用CoffeeScript的node.js(76)

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

只需将其编译为JavaScript,然后就需要运行npm install connect。在那之后开始node server.js



2

Perl,78岁

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

运行为plackup whatever.pl


如果您想要一个plack应用程序,那么就sub{[418,[],[]]}足够了。(16个字符。)
tobyink

你当然是对的!好像我没有使用任何框架,为什么要加载它?:)
hobbs

@tobyink随时提交它作为自己虽然:)
霍布斯

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(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.