418 : 나는 주전자 야


68

우리 모두가 알고 있듯이 HTTP 상태 코드 418이 있습니다 : I 'm a teapot .

당신의 임무는 당신이 그것을 수락하기로 결정한 경우, creativitea를 사용하고 모든 상태의 HTTP 요청에 대해 위의 상태 코드로 응답하는 가장 작은 서버를 작성하는 것입니다.

다음을 포함한 표준 허점이 적용됩니다

외부 소스에서 원하는 출력을 가져 오는 중

여기에는 질문이있는 페이지를 가져 오기 위해 HTTP 요청을 수행하고 해당 페이지에서 솔루션을 추출하는 것이 포함됩니다. 이것은 2011 년에 약간 재미 있었지만 이제는 파생적이고 흥미롭지 않습니다.

즉, 요청을 다른 서버로 리디렉션하여 응답을 반환 할 수는 없습니다.


서버 기능에 대한 혼동 해결 :
HTTP 요청이 작성되면 서버가 올바른 응답으로 응답하는 한 HTTP 요청이없는 동안 서버는 무엇이든 할 수 있습니다.


15
각각의 모든 HTTP 요청에 대해 분명히 커피에 대한 것 : URI?
dave

3
루트 권한이 있다고 가정해도됩니까? (예 : 포트 80에 bind ()가 정상 임)
Digital Trauma

2
@DigitalTrauma 예, 서버에 대해 에스컬레이션 된 권한을 취할 수 있습니다.
Nit

4
@ Knerd 나는 편견에 기대지 않는다. 당신은 프로그램을 작성하는 것이 아니라 단순히 구성하는 것이다.
Nit

2
omg. IOT가 등장하면서이 상태 코드가 실제로 존재하는 이유가있을 수 있습니다!
Luminous

답변:


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

유효한 HTTP GET 요청 (전송 모두에게 418 보내기 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)}}

그러나 .. 연결하는 방법? ;)
옵티 마이저

5
웹 서버에 연결하는 것과 같은 방법입니다. 브라우저, netcat, telnet, wget, curl, 다른 GNU의 awk스크립트 ... 이론적으로는 로컬 호스트에서 수신 대기 : 80,하지만 1) 어떤 웹 서버, 스카이프 또는 포트 80을 사용합니다 다른 프로그램; 2) 1024 미만의 포트를 열려면 수퍼 유저 여야합니다. 따라서 테스트를 위해 스크립트의 포트 번호를 8080 ( s="/inet/tcp/8080/0/0") 과 같은 것으로 편집 한 다음 연결하는 것이 더 쉽습니다 . pastebin.com/zauP7LMA
manatwork

2
내가 참조. 시원한. Awk noob here :)
Optimizer

1
할당되지 않은 8과 같은 작은 포트를 사용하여 바이트를 저장할 수 있습니다.
Hannes Karppila

@HannesKarppila, 맞습니다. 그러나 포트를 명시 적으로 지정하는 다른 모든 솔루션 (Haskell 답변의 포트 8888 제외)이 포트 80을 사용한다는 점을 감안할 때 비교를 위해 이와 같이 유지하는 것이 좋습니다.
manatwork

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을 준다
Digital Trauma

@DigitalTrauma : 맞습니다-마지막 줄 바꿈이 여기 문자열에 자동으로 추가됩니다 : 왜 여기 bash 문자열이 줄 바꿈 문자를 추가합니까? ------ 그러나 두 가지 가능한 문제가 있습니다. 1. 스크립트는 $PATH디렉토리 중 하나에 저장 되었거나 경로 (로 재귀 $0) 로 호출 될 것으로 예상합니다 . ----- 2. HTTP를 사용하려면 행이 끝나지 \r\n않아야합니다 \n. 여기서 문자열은 $"HTTP/1.1 418\r\n\r"더 길어야 합니다 (더 읽기 쉬운 형식). ------ 그리고 마지막으로 : 스크립트가 더 짧을 수 있습니다. -q1매개 변수가 필요하지 않습니다.
pabouk

2
@DigitalTrauma, @pabouk : 출력은 두 줄 바꿈으로 끝나야합니다. 따라서 개행 중 하나는 불필요하지만 (여기서는 문자열이기 때문에) echo변형이 작동하지 않습니다 (적어도 Firefox는이를 418로 인식하지 못합니다). 그러나 \rs는 필요하지 않습니다. 사양은 그것이 있어야 \r\n\r\n하지만 적어도 Firefox와 Chrome은 받아 들일 것이라고 \n\n말했기 때문에 골프를 포함하지 않는 골프 정신으로 보입니다. -q1브라우저 자체 연결을 종료하지 않기 때문에 매개 변수는 내 시스템에 필요했다. $0스크립트를 실행 가능하게 만들고 해당 방식으로 호출하면 제대로 작동합니다.
marinus

@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활성화 해야합니다 .

실제로 이것을 하드 코드 골프 의 오류 코드로 사용 했습니다 . Chatroom 챌린지 만들기 , 그러나 아무도 눈치 채지 못했습니다.


브라우저 친화적 인 버전

<?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:-)
Levit


20

루비 + 랙, 19 바이트

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

로 저장 config.ru하고 rackup명령으로 실행 해야합니다 .

또는 "순수한"루비를 선호하는 경우 :

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에서 : "모든 도서관을 환영합니다"
Digital Trauma

2
응답은 개행 문자로 끝나야합니다. w3.org/Protocols/HTTP/Response.html
Nit

2
@Nit-예-bash "여기에서 문자열"은 줄 바꾸기가 자동으로 추가됩니다
Digital Trauma

1
어떻습니까nc -l 80 <<<HTTP/1.1\ 418;$0
core1024

1
두 공간과 혼동해서 죄송합니다. -p스위치를 사용하지 않았다는 것을 알지 못했습니다. :) Firefox에서 코드를 테스트했으며 두 줄 바꿈이 없으면 상태 코드가 인식되지 않습니다.
pabouk

9

루비 (nc 시스템 명령)-35

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

DigitalTrauma는을 사용한다는 아이디어를 인정해야 nc하지만 Ruby는 Bash보다 적은 문자로 무한 루프를 만들 수 있습니다. :)

루비 (TCP 서버)-75

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

줄 바꿈은 의도적 인 것입니다. 실제 줄 바꿈 문자는 "\ n"보다 한 문자 짧습니다.

루비 (WEBrick HTTPServer)-87

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


1
@DigitalTrauma, 나는 그것을 사용하려고하지만, 다음 백 슬래시는 다른 백 슬래시로 이스케이프 할 필요가 실현, 그래서 :) 어쨌든 같은 수의 문자했을했다
트레이 토마스

@TreyThomas 아, 아시다시피-루비는 여기서 더 많은 탈출구가 필요합니다
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

8

파이썬 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
를 기반으로 hallvabo의견파이썬에서 골프 팁 , from socket import*;s=socket(AF_INET,SOCK_STREAM)짧습니다.
manatwork

@manatwork 감사합니다. 무한 루프에 더 짧은 방법이 있습니까? 나는 팁에서 하나를 찾지 못했습니다 ...
Tuomas Laakkonen

3
while 1:s.accept()[0].sendall(bytes('HTTP/1.1 418\n','UTF8'))– 내가 놓친 것이 아니라면. (그런 식으로, 언어가 허용하는대로 개행 문자를 하나의 문자로 자유롭게 계산하십시오. 그렇게하면 명령을 개행 문자 대신에 개행 문자로 분리하여 아무것도 풀어 놓을 수 없습니다 ;.)
manatwork

질문 소유자의 의견 에 따라 포트 80에 액세스 할 수 있다고 가정하면 2자를자를 수 있습니다 . 이식성을 깨뜨릴 수도 있지만 여기서는 받아 들일 수있는 추악한 것 : 상수 값을 직접 사용하십시오 s=socket(2,1)(적어도 Linux에서는 값입니다).
manatwork

설명서에는 listen()'최대 값은 시스템에 따라 다릅니다 (일반적으로 5)'라는 매개 변수에 대해 설명되어 있습니다. 따라서 10 대신 9는 충분하고 1 자 더 짧습니다. 그리고 bytes('HTTP/1.1 418\n','UTF8')리터럴 대신 b'HTTP/1.1 418\n'충분합니다. 또는 코드를 Python 2로 b만들면 더 이상 bytesprefix가 필요하지 않습니다. 그리고 짧아도 send()충분합니다.
manatwork

7

하스켈-142 바이트

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 바이트

수정-규정 준수를 위해 추가 개행 (총 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

실제 "I 'm a teapot"부분이 필요하다고 생각하지 않습니다. 응답 코드는 충분해야합니다.
Desty

그렇습니다. 그러나 그것이 Julia의 점수에 큰 도움이되지 않기 때문에 나는 그것을 완성했습니다. 그러나 언어를 쉽게 비교할 수 있도록 제거하는 것이 좋습니다.
manatwork

5

파워 쉘, 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는 소켓 FALSE을 기존 소켓에 연결 하면 소켓을 만듭니다 . R의 T기본 값은 TRUE입니다.

편집 : @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*?
nyuszika7 시간

2
그것은 ECMAScript 6, Harmony 제안의 일부인 제너레이터 함수 입니다.
cPu1

4

쉘 + 소캣, 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\r더 짧습니다.
jimmy23013

\\ T도 필요하지 않습니다.
nyuszika7 시간

3

MATLAB, 97 86 바이트

절대 바이트 수와 관련하여 실제로 심각한 경쟁자는 아니지만 수학 도구를 사용하여 완전한 기능을 갖춘 웹 서버를 작성할 수는 없다고 생각하여 게시하고 싶습니다. 속성 단축 사용을 참고하십시오 . '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, 이것은 완전한 프로그램이 아닙니다. 외부 웹 서버에 의존합니다.
nyuszika7 시간

@ nyuszika7h 사실, PHP는 모듈로 설치된 아파치에 의존합니다. 귀하의 주장은 유효하고 유효하지 않습니다. Apache는 PHP 파일에 대한 액세스 만 리디렉션하며 PHP 파일은 코드를 처리합니다.
이스마엘 미구엘

@ nyuszika7h 해당 계층으로 내려 가면 콘솔을 사용하여 PHP 코드를 실행할 수도 없습니다. 아파치는 스타터입니다. 총알을 발사하는 방아쇠. 콘솔에서 PHP 파일을 실행하면 콘솔이 트리거됩니다.
Ismael Miguel

아파치가 이미 실행중인 것에 의존하고 있으며 기본 구성을 변경하지 않으면 작동하지 않는다고 생각합니다. 나는 당신이 말하는 것을 신경 쓰지 않습니다. 이것이 유효한 것으로 볼 수있는 방법은 없습니다. 그러나 @Nit에게 질문해야합니다. 질문입니다.
nyuszika7h

@ nyuszika7h 유효하지 않은 경우 OP가 이미 말했을 것입니다.
Ismael Miguel

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

nginx-35

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

nginx.conf에서 nginx를 시작하십시오.

이것이 표준 허점을 사용하는지 "내장 함수를 사용하여 작업 수행"또는 "문제를 문자 그대로 해석"인지 확실하지 않습니다. OP는이 답변을 좋아하지 않는 것 같습니다.


떨어 뜨려도 여전히 작동 ;합니까?
Cyril

+ 4 / -4 : 논란의 여지가 많다 : D
cat

2

펄, 78

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

로 실행하십시오 plackup whatever.pl.


플래 크 응용 프로그램을 원한다면 sub{[418,[],[]]}충분합니다. (16 자)
tobyink

물론 그렇습니다! 프레임 워크를 사용 하는 것과 같지 않습니다 . 왜로드합니까? :
홉스

@tobyink 자유롭게 자신의 것으로 제출하십시오 :)
hobbs

2

파이썬 2.7 / 장고, 94 바이트

django-admin.py startprojecturls.py 에서 (기본 상용구에서 추가됨 ) :

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

1

C # + 오윈 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

connect (78)가있는 node.js

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

npm install connect먼저 실행해야합니다 . 그런 다음 시작하십시오node server.js


1

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

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

이 질문에는 자바 답변이 필요했습니다.

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

상태 메시지는 어디에 있습니까?
Qwertiy

@ Qwertiy 나는이 질문이 정수로 해석되는 상태 코드 만 요구한다고 생각하므로 상태 메시지 / 이유가 엄격하게 요구되지는 않습니다.
Poke

내가 묵상하지는 않지만 상태 텍스트와 함께 있어야한다고 생각합니다.
Qwertiy

3
Java 8 이미 받기> _>
Pavel

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.