#!/bin/sh
# 例えば何かの感想とかプロフィール欄とか
# 自由に入力される文字列を正しく扱えるかテストするテンプレ
#
# 「正しく」は
# http://itpro.nikkeibp.co.jp/article/COLUMN/20090525/330611/
# 見た感じ、普通制御文字と、エンコーディング違い を
# 扱えればいいみたいなので、とりあえずそれをテスト
# あと、エンコーディングによってあったり、
# なかったりする文字のテストもした方がいいいと思う
#
# とりあえずこのくらいなら、大体の開発環境で動く気がする。
# 以下で使っている get_it は zsh だとダメで bash なら動いた
# zsh が制御文字を扱おうとするのかもしれない
# 多分、shell を経由しないで書いた方が面倒な事がないと思う
# utils
get_it(){
curl https://httpbin.org/response-headers?$1=$2
}
# 普通 application/x-www-form-urlencoded 送ると思うけど、まぁいいやぁ
# その場合は get_it と同じ感じで
# https://tools.ietf.org/html/rfc3986#section-2.1
#
# JSON の中の文字列なら、\uxxxx になっていれば
# エンコーディングの問題はない気がする
# でも制御文字に関しては同じだと思う
post_it(){
curl https://httpbin.org/post -X POST -H 'Content-Type: text/plain; charset=UTF-8' -d @-
}
# POST(request body)
## controle charcters
ruby -e 'print (((0..0x20).to_a + [0x7f]).map(&:chr) - ["\n","\r","\t"]).join' | post_it
## Japanese characters in various encodings
ruby -e 'print "あ".encode(Encoding::CP932, Encoding::UTF_8)' | post_it
ruby -e 'print "あ".encode(Encoding::SJIS, Encoding::UTF_8)' | post_it
ruby -e 'print "あ".encode(Encoding::EUC_JP, Encoding::UTF_8)' | post_it
ruby -e 'print "あ".encode(Encoding::ISO_2022_JP, Encoding::UTF_8)' | post_it
### in hex style
ruby -e 'print "\xe3\x81\x82".encode(Encoding::CP932, Encoding::UTF_8)' | post_it
# GET(query string)
## controle charcters
get_it foo `ruby -r uri -e 'print URI.escape((((0..0x20).to_a + [0x7f]).map(&:chr) - ["\n","\r","\t"]).join)'`
## Japanese characters in various encodings
get_it foo `ruby -r uri -e 'print URI.escape("あ".encode(Encoding::CP932, Encoding::UTF_8))'`
get_it foo `ruby -r uri -e 'print URI.escape("あ".encode(Encoding::SJIS, Encoding::UTF_8))'`
get_it foo `ruby -r uri -e 'print URI.escape("あ".encode(Encoding::EUC_JP, Encoding::UTF_8))'`
# get_it foo `ruby -r uri -e 'print URI.escape("あ".encode(Encoding::ISO_2022_JP, Encoding::UTF_8))'`
# see also
# - valid encodings: https://docs.ruby-lang.org/ja/latest/class/Encoding.html
# - https://httpbin.org/
# 検証する側のプログラムは
# /\A[\n\r\t\P{Cc}]{0,100}\z/
# みたいなので、期待した文字の範囲と長さを調べる
#
# "a\nb\r\tc" =~ /\A[\n\r\t\P{Cc}]{0,100}\z/ # => 0
# 0.chr =~ /\A[\n\r\t\P{Cc}]{0,100}\z/ # => nil