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

妙な地雷を踏んだ気分...。