AB test to send HTTP POST/PUT with multipart data and headers

最近要拿 ab test 來做 http service 測試

怎麼做 HTTP POST/PUT

一般情況下做 ab test 是

ab -n COUNT -c CONCURRENT URL

要做 POST/PUT 就要改成

#POST
ab -n COUNT -c CONCURRENT -p POSTDATA URL
#PUT
ab -n COUNT -c CONCURRENT -u POSTDATA URL

POSTDATA怎麼產生

一般狀況下 POSTDATA 用文字編輯器就可以編輯,像是這樣

your_name=Peter&fruit=Apple

可是如果是要將檔案資料 POST/PUT 的話,要產生 multipart/form-data 的資料,比方說要將 apple.jpg 這張照片以參數 fruit_pic 上傳到 web server。

--1234567890
Content-Disposition: form-data; name="your_name"

Peter
--1234567890
Content-Disposition: form-data; name="fruit"

Apple
--1234567890
Content-Disposition: form-data; name="fruit_pic"; filename="apple.jpg"
Content-Type: image/jpeg

[base64 encoded file content here]
--1234567890--

要注意的是在結尾的boundary(在上面例子中為 1234567890)要多在後面加上–

怎麼產生 base64 encoding 資料?

cat apple.jpg | base64 >> postdata.txt

設定 content type, 指定 boundary, 設定header

ab -n COUNT -c CONCURRENT -p POSTDATA -H HEADER_SETTING -T "multipart/form-data;boundary=1234567890" URL

其中 HEADER_SETTING 的格式為 Header:Header_value。例如:

ab -n 20000 -c 50 -p POSTDATA.txt -H "AuthKey:0123494911" -T "multipart/form-data;boundary=1234567890" http://www.testurl.com/

用 python 跟 c# 的可以參考這篇