httpstatusコマンドで、HTTPのステータスコード(

一般的なWeb Programmerならば、HTTP Status codeはすべて暗記していると聞きました。

しかし、僕は初心者なので、なかなか覚えきれていないので、HTTPのステータスコードをさがすのに便利なツールを用意しました。httpstatus.erlです。インストール方法は:

$ wget https://gist.github.com/takkkun/5002968/raw/569c3e3ea98d1cd8c17a9529c12ac8a88c97350a/httpstatus.erl
$ chmod +x httpstatus.erl

です。escript用に書いてあるのでコンパイルとか必要ありません。

$ ./httpstatus.erl 4
400: Bad Request
401: Unauthorized
402: Payment Required
403: Forbidden
404: Not Found
405: Method Not Allowed
406: Not Acceptable
407: Proxy Authentication Required
408: Request Timeout
409: Conflict
410: Gone
411: Length Required
412: Precondition Failed
413: Request Entity Too Large
414: Request-URI Too Large
415: Unsupported Media Type
416: Request Range Not Satisfiable
417: Expectation Failed
418: I'm a teapot
422: Unprocessable Entity
423: Locked
424: Failed Dependency
425: No code
426: Upgrade Required
428: Precondition Required
429: Too Many Requests
431: Request Header Fields Too Large
$ ./httpstatus.erl 40
400: Bad Request
401: Unauthorized
402: Payment Required
403: Forbidden
404: Not Found
405: Method Not Allowed
406: Not Acceptable
407: Proxy Authentication Required
408: Request Timeout
409: Conflict
$ ./httpstatus.erl 400
400: Bad Request
$ ./httpstatus.erl Not
304: Not Modified
404: Not Found
405: Method Not Allowed
406: Not Acceptable
416: Request Range Not Satisfiable
501: Not Implemented
505: HTTP Version Not Supported
510: Not Extended

以下コード。

#!/usr/bin/env escript
 
main([Query|_]) ->
    case matcher(Query) of
        {ok, Matcher} ->
            print(lists:filter(Matcher, http_statuses()));
        {error, {Message, Position}} ->
            io:format("Error: ~s at ~p character~n", [Message, Position])
    end;
 
main([]) ->
    print(http_statuses()).
 
matcher([C|_] = Query) when $0 =< C andalso C =< $9 ->
    case re:compile("^" ++ Query) of
        {ok, Regexp} ->
            {ok, fun({Code, _}) ->
                     re:run(Code, Regexp, [{capture, none}]) =:= match
                 end};
        {error, ErrorSpec} ->
            {error, ErrorSpec}
    end;
 
matcher(Query) ->
    {ok, fun({_, Message}) -> string:str(Message, Query) > 0 end}.
 
print(HttpStatuses) ->
    lists:foreach(fun({Code, Message}) ->
                      io:format("~s: ~s~n", [Code, Message])
                  end, HttpStatuses).
 
http_statuses() ->
    [
     {"100", "Continue"},
     {"101", "Switching Protocols"},
     {"102", "Processing"},
     {"200", "OK"},
     {"201", "Created"},
     {"202", "Accepted"},
     {"203", "Non-Authoritative Information"},
     {"204", "No Content"},
     {"205", "Reset Content"},
     {"206", "Partial Content"},
     {"207", "Multi-Status"},
     {"208", "Already Reported"},
     {"300", "Multiple Choices"},
     {"301", "Moved Permanently"},
     {"302", "Found"},
     {"303", "See Other"},
     {"304", "Not Modified"},
     {"305", "Use Proxy"},
     {"307", "Temporary Redirect"},
     {"400", "Bad Request"},
     {"401", "Unauthorized"},
     {"402", "Payment Required"},
     {"403", "Forbidden"},
     {"404", "Not Found"},
     {"405", "Method Not Allowed"},
     {"406", "Not Acceptable"},
     {"407", "Proxy Authentication Required"},
     {"408", "Request Timeout"},
     {"409", "Conflict"},
     {"410", "Gone"},
     {"411", "Length Required"},
     {"412", "Precondition Failed"},
     {"413", "Request Entity Too Large"},
     {"414", "Request-URI Too Large"},
     {"415", "Unsupported Media Type"},
     {"416", "Request Range Not Satisfiable"},
     {"417", "Expectation Failed"},
     {"418", "I'm a teapot"},
     {"422", "Unprocessable Entity"},
     {"423", "Locked"},
     {"424", "Failed Dependency"},
     {"425", "No code"},
     {"426", "Upgrade Required"},
     {"428", "Precondition Required"},
     {"429", "Too Many Requests"},
     {"431", "Request Header Fields Too Large"},
     {"449", "Retry with"},
     {"500", "Internal Server Error"},
     {"501", "Not Implemented"},
     {"502", "Bad Gateway"},
     {"503", "Service Unavailable"},
     {"504", "Gateway Timeout"},
     {"505", "HTTP Version Not Supported"},
     {"506", "Variant Also Negotiates"},
     {"507", "Insufficient Storage"},
     {"509", "Bandwidth Limit Exceeded"},
     {"510", "Not Extended"},
     {"511", "Network Authentication Required"}
    ].