curl の multipart/form-data 送信が遅い
個人的メモ
ローカルでサーバを立てて実験中、妙に反応が悪いので何でだろうと思ってた
$ curl -V curl 7.27.0 (i686-pc-cygwin) libcurl/7.27.0 OpenSSL/1.0.1c zlib/1.2.7 libidn/1.25 libssh2/1.4.2 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Features: Debug GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
トレースを取ってみたところ
$ cat <<EOM | curl -X POST -F "file=@-" --trace trace_form.log --trace-time http://localhost:8090/markdown あいうえお ========= * かきくけこ EOM .... $ cat trace_form.log
21:20:09.010241 == Info: About to connect() to localhost port 8090 (#0) 21:20:09.011504 == Info: Trying 127.0.0.1... 21:20:09.012146 == Info: connected 21:20:09.012210 == Info: Connected to localhost (127.0.0.1) port 8090 (#0) 21:20:09.033089 => Send header, 216 bytes (0xd8) 0000: 50 4f 53 54 20 2f 6d 61 72 6b 64 6f 77 6e 20 48 POST /markdown H 0010: 54 54 50 2f 31 2e 31 0d 0a 55 73 65 72 2d 41 67 TTP/1.1..User-Ag 0020: 65 6e 74 3a 20 63 75 72 6c 2f 37 2e 32 37 2e 30 ent: curl/7.27.0 0030: 0d 0a 48 6f 73 74 3a 20 6c 6f 63 61 6c 68 6f 73 ..Host: localhos 0040: 74 3a 38 30 39 30 0d 0a 41 63 63 65 70 74 3a 20 t:8090..Accept: 0050: 2a 2f 2a 0d 0a 43 6f 6e 74 65 6e 74 2d 4c 65 6e */*..Content-Len 0060: 67 74 68 3a 20 32 33 39 0d 0a 45 78 70 65 63 74 gth: 239..Expect 0070: 3a 20 31 30 30 2d 63 6f 6e 74 69 6e 75 65 0d 0a : 100-continue.. 0080: 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 6d 75 Content-Type: mu 0090: 6c 74 69 70 61 72 74 2f 66 6f 72 6d 2d 64 61 74 ltipart/form-dat 00a0: 61 3b 20 62 6f 75 6e 64 61 72 79 3d 2d 2d 2d 2d a; boundary=---- 00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------- 00c0: 2d 2d 2d 2d 2d 2d 2d 2d 63 62 32 32 31 38 37 38 --------cb221878 00d0: 34 32 65 34 0d 0a 0d 0a 42e4.... 21:20:09.034044 == Info: additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0 21:20:10.027525 == Info: additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0 21:20:11.027474 == Info: additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0 21:20:11.027606 == Info: Done waiting for 100-continue 21:20:11.027711 == Info: additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0 21:20:11.027837 => Send data, 239 bytes (0xef) 0000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------- 0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 63 62 --------------cb 0020: 32 32 31 38 37 38 34 32 65 34 0d 0a 43 6f 6e 74 22187842e4..Cont 0030: 65 6e 74 2d 44 69 73 70 6f 73 69 74 69 6f 6e 3a ent-Disposition: 0040: 20 66 6f 72 6d 2d 64 61 74 61 3b 20 6e 61 6d 65 form-data; name 0050: 3d 22 66 69 6c 65 22 3b 20 66 69 6c 65 6e 61 6d ="file"; filenam 0060: 65 3d 22 2d 22 0d 0a 43 6f 6e 74 65 6e 74 2d 54 e="-"..Content-T 0070: 79 70 65 3a 20 61 70 70 6c 69 63 61 74 69 6f 6e ype: application 0080: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 0d 0a 0d /octet-stream... 0090: 0a e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a ................ 00a0: 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 20 2a 20 e3 .=========.. * . 00b0: 81 8b e3 81 8d e3 81 8f e3 81 91 e3 81 93 0a 0d ................ 00c0: 0a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .--------------- 00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 63 ---------------c 00e0: 62 32 32 31 38 37 38 34 32 65 34 2d 2d 0d 0a b22187842e4--.. 21:20:11.028676 == Info: additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0 21:20:11.031669 == Info: HTTP 1.1 or later with persistent connection, pipelining supported 21:20:11.031732 <= Recv header, 17 bytes (0x11) 0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 0010: 0a . 21:20:11.031838 <= Recv header, 25 bytes (0x19) 0000: 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 content-type: te 0010: 78 74 2f 68 74 6d 6c 0d 0a xt/html.. 21:20:11.031959 <= Recv header, 19 bytes (0x13) 0000: 63 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 connection: clos 0010: 65 0d 0a e.. 21:20:11.032065 <= Recv header, 18 bytes (0x12) 0000: 73 65 72 76 65 72 3a 20 68 74 74 70 64 2e 6a 73 server: httpd.js 0010: 0d 0a .. 21:20:11.032166 <= Recv header, 37 bytes (0x25) 0000: 64 61 74 65 3a 20 57 65 64 2c 20 32 38 20 4e 6f date: Wed, 28 No 0010: 76 20 32 30 31 32 20 31 32 3a 32 30 3a 31 31 20 v 2012 12:20:11 0020: 47 4d 54 0d 0a GMT.. 21:20:11.032337 <= Recv header, 21 bytes (0x15) 0000: 63 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 content-length: 0010: 32 30 35 0d 0a 205.. 21:20:11.032452 <= Recv header, 2 bytes (0x2) 0000: 0d 0a .. 21:20:11.032572 <= Recv data, 205 bytes (0xcd) 0000: 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a <!DOCTYPE html>. 0010: 3c 68 74 6d 6c 20 78 6d 6c 6e 73 3d 22 68 74 74 <html xmlns="htt 0020: 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 31 p://www.w3.org/1 0030: 39 39 39 2f 78 68 74 6d 6c 22 3e 0a 3c 68 65 61 999/xhtml">.<hea 0040: 64 3e 3c 6d 65 74 61 20 63 68 61 72 73 65 74 3d d><meta charset= 0050: 22 75 74 66 2d 38 22 2f 3e 3c 74 69 74 6c 65 3e "utf-8"/><title> 0060: 68 74 74 70 64 2e 6a 73 3c 2f 74 69 74 6c 65 3e httpd.js</title> 0070: 3c 2f 68 65 61 64 3e 0a 3c 62 6f 64 79 3e 0a 3c </head>.<body>.< 0080: 68 31 3e e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 h1>............. 0090: 81 8a 3c 2f 68 31 3e 0a 0a 3c 75 6c 3e 0a 3c 6c ..</h1>..<ul>.<l 00a0: 69 3e e3 81 8b e3 81 8d e3 81 8f e3 81 91 e3 81 i>.............. 00b0: 93 3c 2f 6c 69 3e 0a 3c 2f 75 6c 3e 0a 3c 2f 62 .</li>.</ul>.</b 00c0: 6f 64 79 3e 0a 3c 2f 68 74 6d 6c 3e 0a ody>.</html>. 21:20:11.033492 == Info: Closing connection #0
強調部分のエラーっぽいところで2秒近く止まっている雰囲気だった。
ということで、-Fはやめて、--data-urlencode にて送信してみると滞りなく送信できた。
$ cat <<EOM | curl -X POST --data-urlencode "file@-" --trace trace_urlencode.log --trace-time http://localhost:8090/markdown あいうえお ========= * かきくけこ EOM .... $ cat trace_urlencode.log
21:19:46.012279 == Info: About to connect() to localhost port 8090 (#0) 21:19:46.013694 == Info: Trying 127.0.0.1... 21:19:46.014117 == Info: connected 21:19:46.014167 == Info: Connected to localhost (127.0.0.1) port 8090 (#0) 21:19:46.014265 => Send header, 157 bytes (0x9d) 0000: 50 4f 53 54 20 2f 6d 61 72 6b 64 6f 77 6e 20 48 POST /markdown H 0010: 54 54 50 2f 31 2e 31 0d 0a 55 73 65 72 2d 41 67 TTP/1.1..User-Ag 0020: 65 6e 74 3a 20 63 75 72 6c 2f 37 2e 32 37 2e 30 ent: curl/7.27.0 0030: 0d 0a 48 6f 73 74 3a 20 6c 6f 63 61 6c 68 6f 73 ..Host: localhos 0040: 74 3a 38 30 39 30 0d 0a 41 63 63 65 70 74 3a 20 t:8090..Accept: 0050: 2a 2f 2a 0d 0a 43 6f 6e 74 65 6e 74 2d 4c 65 6e */*..Content-Len 0060: 67 74 68 3a 20 31 34 33 0d 0a 43 6f 6e 74 65 6e gth: 143..Conten 0070: 74 2d 54 79 70 65 3a 20 61 70 70 6c 69 63 61 74 t-Type: applicat 0080: 69 6f 6e 2f 78 2d 77 77 77 2d 66 6f 72 6d 2d 75 ion/x-www-form-u 0090: 72 6c 65 6e 63 6f 64 65 64 0d 0a 0d 0a rlencoded.... 21:19:46.014819 => Send data, 143 bytes (0x8f) 0000: 66 69 6c 65 3d 25 45 33 25 38 31 25 38 32 25 45 file=%E3%81%82%E 0010: 33 25 38 31 25 38 34 25 45 33 25 38 31 25 38 36 3%81%84%E3%81%86 0020: 25 45 33 25 38 31 25 38 38 25 45 33 25 38 31 25 %E3%81%88%E3%81% 0030: 38 41 25 30 41 25 33 44 25 33 44 25 33 44 25 33 8A%0A%3D%3D%3D%3 0040: 44 25 33 44 25 33 44 25 33 44 25 33 44 25 33 44 D%3D%3D%3D%3D%3D 0050: 25 30 41 25 30 41 25 32 30 25 32 41 25 32 30 25 %0A%0A%20%2A%20% 0060: 45 33 25 38 31 25 38 42 25 45 33 25 38 31 25 38 E3%81%8B%E3%81%8 0070: 44 25 45 33 25 38 31 25 38 46 25 45 33 25 38 31 D%E3%81%8F%E3%81 0080: 25 39 31 25 45 33 25 38 31 25 39 33 25 30 41 %91%E3%81%93%0A 21:19:46.015298 == Info: upload completely sent off: 143 out of 143 bytes 21:19:46.015366 == Info: additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0 21:19:46.018839 == Info: HTTP 1.1 or later with persistent connection, pipelining supported 21:19:46.018908 <= Recv header, 17 bytes (0x11) 0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 0010: 0a . 21:19:46.019013 <= Recv header, 25 bytes (0x19) 0000: 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 content-type: te 0010: 78 74 2f 68 74 6d 6c 0d 0a xt/html.. 21:19:46.019134 <= Recv header, 19 bytes (0x13) 0000: 63 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 connection: clos 0010: 65 0d 0a e.. 21:19:46.019247 <= Recv header, 18 bytes (0x12) 0000: 73 65 72 76 65 72 3a 20 68 74 74 70 64 2e 6a 73 server: httpd.js 0010: 0d 0a .. 21:19:46.019466 <= Recv header, 37 bytes (0x25) 0000: 64 61 74 65 3a 20 57 65 64 2c 20 32 38 20 4e 6f date: Wed, 28 No 0010: 76 20 32 30 31 32 20 31 32 3a 31 39 3a 34 36 20 v 2012 12:19:46 0020: 47 4d 54 0d 0a GMT.. 21:19:46.019647 <= Recv header, 21 bytes (0x15) 0000: 63 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 content-length: 0010: 32 30 35 0d 0a 205.. 21:19:46.019760 <= Recv header, 2 bytes (0x2) 0000: 0d 0a .. 21:19:46.019898 <= Recv data, 205 bytes (0xcd) 0000: 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a <!DOCTYPE html>. 0010: 3c 68 74 6d 6c 20 78 6d 6c 6e 73 3d 22 68 74 74 <html xmlns="htt 0020: 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 31 p://www.w3.org/1 0030: 39 39 39 2f 78 68 74 6d 6c 22 3e 0a 3c 68 65 61 999/xhtml">.<hea 0040: 64 3e 3c 6d 65 74 61 20 63 68 61 72 73 65 74 3d d><meta charset= 0050: 22 75 74 66 2d 38 22 2f 3e 3c 74 69 74 6c 65 3e "utf-8"/><title> 0060: 68 74 74 70 64 2e 6a 73 3c 2f 74 69 74 6c 65 3e httpd.js</title> 0070: 3c 2f 68 65 61 64 3e 0a 3c 62 6f 64 79 3e 0a 3c </head>.<body>.< 0080: 68 31 3e e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 h1>............. 0090: 81 8a 3c 2f 68 31 3e 0a 0a 3c 75 6c 3e 0a 3c 6c ..</h1>..<ul>.<l 00a0: 69 3e e3 81 8b e3 81 8d e3 81 8f e3 81 91 e3 81 i>.............. 00b0: 93 3c 2f 6c 69 3e 0a 3c 2f 75 6c 3e 0a 3c 2f 62 .</li>.</ul>.</b 00c0: 6f 64 79 3e 0a 3c 2f 68 74 6d 6c 3e 0a ody>.</html>. 21:19:46.021157 == Info: Closing connection #0
妙な地雷を踏んだ気分...。