Compare commits
2044 Commits
curl-7_25_
...
curl-7_33_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f77e89c5d2 | ||
![]() |
92cf6141ed | ||
![]() |
cf12d5b62f | ||
![]() |
39beaa5ffb | ||
![]() |
5df04bfafd | ||
![]() |
d015f4ccac | ||
![]() |
143d7c13d8 | ||
![]() |
9b33ecfd01 | ||
![]() |
ca1b34b887 | ||
![]() |
f0f95c97f7 | ||
![]() |
4cd444e01a | ||
![]() |
8264478490 | ||
![]() |
b46491900d | ||
![]() |
725288bf2f | ||
![]() |
173160c0d0 | ||
![]() |
3c3622b662 | ||
![]() |
a22c478ed7 | ||
![]() |
3d43a48781 | ||
![]() |
c8b05b809e | ||
![]() |
ca995010d0 | ||
![]() |
25a0c96a49 | ||
![]() |
a8b606b1a6 | ||
![]() |
20a99a45c0 | ||
![]() |
49341628b5 | ||
![]() |
ab7e6afd44 | ||
![]() |
4d7bf73fc3 | ||
![]() |
3c34f453fa | ||
![]() |
d5f687ed8f | ||
![]() |
a377fab015 | ||
![]() |
092f33d6bf | ||
![]() |
09a13a1c01 | ||
![]() |
30a09783b2 | ||
![]() |
733a4419d0 | ||
![]() |
77dc4ba877 | ||
![]() |
14d8209adc | ||
![]() |
a942d8ff5b | ||
![]() |
1695c67818 | ||
![]() |
f81d1e1666 | ||
![]() |
b71ed1fb3d | ||
![]() |
86ccfaa3fd | ||
![]() |
3b69462fc0 | ||
![]() |
22bccb0eda | ||
![]() |
4f591b9148 | ||
![]() |
52cefc8cd7 | ||
![]() |
8880f84e1a | ||
![]() |
9d4a8c7936 | ||
![]() |
fd8dc21fd0 | ||
![]() |
8ec6486d05 | ||
![]() |
59c1743c78 | ||
![]() |
60a2046162 | ||
![]() |
6dd8bd8d2f | ||
![]() |
b07709f741 | ||
![]() |
9215cee4c6 | ||
![]() |
34df869f99 | ||
![]() |
3f04d48495 | ||
![]() |
517b8e2290 | ||
![]() |
af44da38d6 | ||
![]() |
fcfa26a7ee | ||
![]() |
18db743851 | ||
![]() |
0e188e2dc3 | ||
![]() |
eecb0e969f | ||
![]() |
bd7d56ec71 | ||
![]() |
6f78aaad6f | ||
![]() |
89d320c2fd | ||
![]() |
b809bafb0c | ||
![]() |
3b6a1681dc | ||
![]() |
9300bb826d | ||
![]() |
dfe7ee1429 | ||
![]() |
841103c776 | ||
![]() |
8d2335ca23 | ||
![]() |
04064e89c1 | ||
![]() |
c873375123 | ||
![]() |
62d232c131 | ||
![]() |
98f7ca7e97 | ||
![]() |
4cfbb201c4 | ||
![]() |
dc016567ce | ||
![]() |
96b68c57ce | ||
![]() |
158dfe2c5c | ||
![]() |
8f5336a2fa | ||
![]() |
f8a9dbd391 | ||
![]() |
016879d477 | ||
![]() |
c03335ec68 | ||
![]() |
894585784c | ||
![]() |
33c1f2876b | ||
![]() |
00ee5c5cf1 | ||
![]() |
dadc495540 | ||
![]() |
eae86ba62d | ||
![]() |
e9cca79dd1 | ||
![]() |
4ba3b6c05a | ||
![]() |
187ac69374 | ||
![]() |
84ad1569e5 | ||
![]() |
45e0a661ce | ||
![]() |
4d6ef6297a | ||
![]() |
b68c52704b | ||
![]() |
4f4dc5832d | ||
![]() |
fbcefc0ce0 | ||
![]() |
83f6f58834 | ||
![]() |
0a691f8935 | ||
![]() |
c243d45aad | ||
![]() |
8a6dba520b | ||
![]() |
32352ed6ad | ||
![]() |
df69440d05 | ||
![]() |
345955e87e | ||
![]() |
6f5b46855c | ||
![]() |
5f93c5d658 | ||
![]() |
7fd84b14d2 | ||
![]() |
f2403140f9 | ||
![]() |
f3c9749a40 | ||
![]() |
3f6991766f | ||
![]() |
cfe5f7dbf4 | ||
![]() |
5840c918d5 | ||
![]() |
b0afb00000 | ||
![]() |
0b5ae7c80e | ||
![]() |
0d55f4e1bc | ||
![]() |
86d340af27 | ||
![]() |
5c14a7f068 | ||
![]() |
2879ffacfa | ||
![]() |
d89eb55906 | ||
![]() |
4a85e60cfe | ||
![]() |
bfefe2400a | ||
![]() |
25c6890375 | ||
![]() |
eb6314260d | ||
![]() |
313c38c9de | ||
![]() |
ae6096471a | ||
![]() |
66ea5c415b | ||
![]() |
2481ac358c | ||
![]() |
c639d725a3 | ||
![]() |
857f999353 | ||
![]() |
6d9cddc513 | ||
![]() |
e20e48cbf2 | ||
![]() |
ee5e2cf6cb | ||
![]() |
e8313697b6 | ||
![]() |
28427b4083 | ||
![]() |
131649a121 | ||
![]() |
632b3d81d6 | ||
![]() |
241aeadc50 | ||
![]() |
669e4ca366 | ||
![]() |
c9617d9f93 | ||
![]() |
f8986a2b34 | ||
![]() |
1b96ce04b2 | ||
![]() |
f851df88fb | ||
![]() |
18c595fde2 | ||
![]() |
56abdd07e7 | ||
![]() |
7e06c336d6 | ||
![]() |
8a4069fb17 | ||
![]() |
243ad539fe | ||
![]() |
3d60590422 | ||
![]() |
08fa4fed70 | ||
![]() |
4344fa926a | ||
![]() |
61672bde44 | ||
![]() |
13dbb41c49 | ||
![]() |
e5c2354fd5 | ||
![]() |
09634f46fb | ||
![]() |
0119a93b33 | ||
![]() |
9fa42beddc | ||
![]() |
d6cda9e8ab | ||
![]() |
2a7f1425d9 | ||
![]() |
900ccc26ae | ||
![]() |
01d7bbbebe | ||
![]() |
3dc6fc42bf | ||
![]() |
d2fe616e7e | ||
![]() |
316ca865e3 | ||
![]() |
812d49db90 | ||
![]() |
02370fff3a | ||
![]() |
e9de8e78f0 | ||
![]() |
2eabb7d590 | ||
![]() |
d707a975f6 | ||
![]() |
ac487842a1 | ||
![]() |
06b6e1d0d2 | ||
![]() |
b77997e6da | ||
![]() |
9e8ced9890 | ||
![]() |
698e3bdf82 | ||
![]() |
9011fb3f0c | ||
![]() |
073b03fab7 | ||
![]() |
f73f052010 | ||
![]() |
97ed1ac905 | ||
![]() |
322f0bc2f1 | ||
![]() |
af4bddf20b | ||
![]() |
f19efd07e7 | ||
![]() |
83f5332536 | ||
![]() |
497775024c | ||
![]() |
ea38a70539 | ||
![]() |
5eea336d01 | ||
![]() |
f3849a7b84 | ||
![]() |
1ca6ed7b75 | ||
![]() |
aa51d3a139 | ||
![]() |
64c8909071 | ||
![]() |
e848942505 | ||
![]() |
7e489c42f7 | ||
![]() |
75b52f9dcc | ||
![]() |
221825aebf | ||
![]() |
9d35ad9552 | ||
![]() |
c4a7ca038e | ||
![]() |
84f3b3dd44 | ||
![]() |
2ef83136d4 | ||
![]() |
d737aa19c8 | ||
![]() |
78e6683bb0 | ||
![]() |
2f9b64ac33 | ||
![]() |
6a353049ac | ||
![]() |
49e3d803ab | ||
![]() |
b644ae68c8 | ||
![]() |
4ae7b7ea69 | ||
![]() |
13a2e32548 | ||
![]() |
c3b513e75c | ||
![]() |
a74b36af2a | ||
![]() |
1b4dc10393 | ||
![]() |
45b6e2dd89 | ||
![]() |
6dca35c0e5 | ||
![]() |
a691e04470 | ||
![]() |
3d1a453d88 | ||
![]() |
d7a39f8f97 | ||
![]() |
3c929ff9f6 | ||
![]() |
9d957294cb | ||
![]() |
acf59be7f0 | ||
![]() |
e7dcc454c6 | ||
![]() |
84789e12fb | ||
![]() |
460fb12097 | ||
![]() |
63d8b3a507 | ||
![]() |
90ab65c632 | ||
![]() |
34122800b8 | ||
![]() |
7f41eab395 | ||
![]() |
0192ad65bb | ||
![]() |
06c1bea72f | ||
![]() |
19a05c908f | ||
![]() |
bb55293313 | ||
![]() |
817ceb09e0 | ||
![]() |
1a911f7ec4 | ||
![]() |
ea464d72e9 | ||
![]() |
22adb46a32 | ||
![]() |
fc99eaa5ae | ||
![]() |
4bea91fc67 | ||
![]() |
06d1b10cbe | ||
![]() |
816b639035 | ||
![]() |
8804ffd4fa | ||
![]() |
19122c0768 | ||
![]() |
c346c4c8f9 | ||
![]() |
bc7d806e3a | ||
![]() |
6cf8413e31 | ||
![]() |
062e5bfd9c | ||
![]() |
e4a1888bd0 | ||
![]() |
2f1a0bc0bf | ||
![]() |
09ddb1d61c | ||
![]() |
15f76bf7bb | ||
![]() |
36585b5395 | ||
![]() |
11baffbff6 | ||
![]() |
53333a43a1 | ||
![]() |
c56f9797e7 | ||
![]() |
9281be36d5 | ||
![]() |
f15a88f2b2 | ||
![]() |
5ca96cb844 | ||
![]() |
10afe7cf10 | ||
![]() |
6972335f50 | ||
![]() |
d5e2d0b6bf | ||
![]() |
f34b5fb4d8 | ||
![]() |
f584312e81 | ||
![]() |
0b4557f766 | ||
![]() |
204126a5f1 | ||
![]() |
2ae3d28f3d | ||
![]() |
8a42c2ef8d | ||
![]() |
e79535bc5e | ||
![]() |
4ad8e142da | ||
![]() |
e3ee73b70c | ||
![]() |
70812c2f32 | ||
![]() |
a64bca68c7 | ||
![]() |
67633e1308 | ||
![]() |
715ca7c5fe | ||
![]() |
001758760b | ||
![]() |
2f06265e39 | ||
![]() |
432431368f | ||
![]() |
4b0028f82d | ||
![]() |
8c9236bb2c | ||
![]() |
2af0b10c95 | ||
![]() |
08adecc9a1 | ||
![]() |
015556d74c | ||
![]() |
4c40fe64b8 | ||
![]() |
d20def2046 | ||
![]() |
d2b36e466a | ||
![]() |
27f8c93daf | ||
![]() |
058b86e6f3 | ||
![]() |
0018d6830e | ||
![]() |
59224a31fd | ||
![]() |
0994d737c8 | ||
![]() |
96749554fd | ||
![]() |
785749405f | ||
![]() |
7cc00d9a83 | ||
![]() |
230e16dc03 | ||
![]() |
0ce410a629 | ||
![]() |
5d3cbde72e | ||
![]() |
8fe8fd2b17 | ||
![]() |
0ddc678927 | ||
![]() |
51f0b798fa | ||
![]() |
6b27703b5f | ||
![]() |
045ccb59a4 | ||
![]() |
784336deec | ||
![]() |
eb41e8eebe | ||
![]() |
3cd43bbfec | ||
![]() |
204e340bcd | ||
![]() |
37f2ba7e57 | ||
![]() |
09b9fc9009 | ||
![]() |
7da3caaf95 | ||
![]() |
82ab5f1b0c | ||
![]() |
7ae64af368 | ||
![]() |
2ad688ed7c | ||
![]() |
ca786233d2 | ||
![]() |
14a3139c4d | ||
![]() |
5af2bfb955 | ||
![]() |
1691a31cab | ||
![]() |
9dedcbf9ec | ||
![]() |
537ffc4c69 | ||
![]() |
c3e7210548 | ||
![]() |
9a5c2d8373 | ||
![]() |
8693bbd8c4 | ||
![]() |
251dd03b88 | ||
![]() |
55ea83d622 | ||
![]() |
b5478a0e03 | ||
![]() |
db2deba6b4 | ||
![]() |
41fb6443ce | ||
![]() |
e5dfe6c282 | ||
![]() |
e277e20a6d | ||
![]() |
a23e56d109 | ||
![]() |
ca89a0a092 | ||
![]() |
50a74be125 | ||
![]() |
8c1e3bb713 | ||
![]() |
4fad1943a2 | ||
![]() |
4d346673a2 | ||
![]() |
de052ca6fc | ||
![]() |
1a593191c2 | ||
![]() |
2c4ef997b9 | ||
![]() |
d020e2c381 | ||
![]() |
48fe9226a0 | ||
![]() |
a77ac42e52 | ||
![]() |
5880db8abd | ||
![]() |
0f4ba89ffd | ||
![]() |
edeb1ae65f | ||
![]() |
82232bbbaf | ||
![]() |
bb2e0686ab | ||
![]() |
513e587c5e | ||
![]() |
6ed2bcc5f5 | ||
![]() |
d529f3882b | ||
![]() |
e2e92486a7 | ||
![]() |
2e5b3168d6 | ||
![]() |
6bcacff1a5 | ||
![]() |
12d01cb6fa | ||
![]() |
90695fb2c5 | ||
![]() |
dd17069c9e | ||
![]() |
26b0cb6ae2 | ||
![]() |
6d30f8ebed | ||
![]() |
11220678c4 | ||
![]() |
448d55ef0a | ||
![]() |
7b115cc1e1 | ||
![]() |
a10d5e3851 | ||
![]() |
1016637f5a | ||
![]() |
2e00872c04 | ||
![]() |
56ece42c81 | ||
![]() |
99924f6606 | ||
![]() |
0eba02fd41 | ||
![]() |
464c8693d2 | ||
![]() |
50af17ef24 | ||
![]() |
3a24cb7bc4 | ||
![]() |
e839446c2a | ||
![]() |
695931cf8e | ||
![]() |
964a7600b9 | ||
![]() |
d4492f955d | ||
![]() |
9c15325d34 | ||
![]() |
d8c04909fa | ||
![]() |
c0a7a98aee | ||
![]() |
f5005dd8d0 | ||
![]() |
d3aaa68f55 | ||
![]() |
cfc907e43d | ||
![]() |
2af64c6432 | ||
![]() |
83f0dae129 | ||
![]() |
65d53cf6ef | ||
![]() |
0d9e65f79f | ||
![]() |
c983aa9efc | ||
![]() |
b16b7f9d3a | ||
![]() |
5c6f12b9f2 | ||
![]() |
2022b10e50 | ||
![]() |
45339625bc | ||
![]() |
20ff820ef2 | ||
![]() |
39e85d99fe | ||
![]() |
3a0e931fc7 | ||
![]() |
fe7e3229f8 | ||
![]() |
ecf042ff3c | ||
![]() |
aff245b360 | ||
![]() |
e01469907a | ||
![]() |
b7a933154a | ||
![]() |
54f18e5427 | ||
![]() |
833fba265d | ||
![]() |
d633052905 | ||
![]() |
009d2336fe | ||
![]() |
abca89aaa0 | ||
![]() |
d689376cb0 | ||
![]() |
98b0d66eb4 | ||
![]() |
9c2853f2ae | ||
![]() |
aff7562922 | ||
![]() |
365c5ba395 | ||
![]() |
cb1aa8b0e3 | ||
![]() |
d3d5c4a40e | ||
![]() |
6117d4025e | ||
![]() |
d23745f7c9 | ||
![]() |
ad47d8e263 | ||
![]() |
8a7a277c08 | ||
![]() |
0030fbd382 | ||
![]() |
f3052c8a81 | ||
![]() |
7d80ed64e4 | ||
![]() |
a2e0ce86ba | ||
![]() |
6fab0bd9f1 | ||
![]() |
02964ed630 | ||
![]() |
6f3e7aabdc | ||
![]() |
631e3e13a9 | ||
![]() |
832c195179 | ||
![]() |
7877619f85 | ||
![]() |
ec248b590d | ||
![]() |
4846b5e9fe | ||
![]() |
85c710e11e | ||
![]() |
0de7249bb3 | ||
![]() |
192c4f788d | ||
![]() |
da0db499fd | ||
![]() |
88c5c63ffc | ||
![]() |
a9f5ad0e2a | ||
![]() |
e305f5ec71 | ||
![]() |
7ac3e9f1ba | ||
![]() |
03a3dd9ee3 | ||
![]() |
5fc24a5297 | ||
![]() |
b1a295ac4e | ||
![]() |
1826c768ab | ||
![]() |
9c3e098259 | ||
![]() |
0feeab7802 | ||
![]() |
f24dc09d20 | ||
![]() |
9e10963c20 | ||
![]() |
10b6d81c64 | ||
![]() |
8026bd7abd | ||
![]() |
9b8df58169 | ||
![]() |
529a2e9110 | ||
![]() |
21091549c0 | ||
![]() |
7b97f03f09 | ||
![]() |
ce362e8eb9 | ||
![]() |
a4decb49a6 | ||
![]() |
c53fb36b0c | ||
![]() |
dc19e656b5 | ||
![]() |
87cf677eca | ||
![]() |
5657c56f63 | ||
![]() |
51b3445e84 | ||
![]() |
a7452b8b8c | ||
![]() |
0bf5ce77aa | ||
![]() |
159d34b58e | ||
![]() |
29bf0598aa | ||
![]() |
239b58d34d | ||
![]() |
74f1810546 | ||
![]() |
f4b08b8f40 | ||
![]() |
6691fdf517 | ||
![]() |
7d8d2a54ba | ||
![]() |
9986c6cb2b | ||
![]() |
ba9a66663a | ||
![]() |
ac419bf562 | ||
![]() |
520833cbe1 | ||
![]() |
e58d9c87f7 | ||
![]() |
84f7991474 | ||
![]() |
85b9dc8023 | ||
![]() |
7d4d4892d8 | ||
![]() |
fc4759af9d | ||
![]() |
ee84c47655 | ||
![]() |
ce32176db7 | ||
![]() |
04f52e9b4d | ||
![]() |
100a33f7ff | ||
![]() |
7ed25ccf0d | ||
![]() |
01eede2662 | ||
![]() |
ae26ee3489 | ||
![]() |
992bee504d | ||
![]() |
01a2abedd7 | ||
![]() |
a45e3f93e4 | ||
![]() |
bdb396ef2a | ||
![]() |
6add1901a1 | ||
![]() |
51b0f09b5e | ||
![]() |
8dac7be438 | ||
![]() |
bcf1b9dec1 | ||
![]() |
b045d079f8 | ||
![]() |
683f2b8323 | ||
![]() |
2de20dd9a1 | ||
![]() |
b47cf4f688 | ||
![]() |
a15b2b6c62 | ||
![]() |
42e01cff9a | ||
![]() |
865d4138a0 | ||
![]() |
35874298e4 | ||
![]() |
52d72e66c2 | ||
![]() |
f3d10aa0d4 | ||
![]() |
7632bc911b | ||
![]() |
92ef5f19c8 | ||
![]() |
99b4045183 | ||
![]() |
087f9bb20a | ||
![]() |
e2c7e19144 | ||
![]() |
f5c3d95384 | ||
![]() |
6b10f5b963 | ||
![]() |
ee74b77d45 | ||
![]() |
734bdb68c2 | ||
![]() |
514817669e | ||
![]() |
cb9c0ac7d7 | ||
![]() |
1c435295b8 | ||
![]() |
46d26a0e77 | ||
![]() |
f4e3cae8a7 | ||
![]() |
b52cf5d2cd | ||
![]() |
073e83b543 | ||
![]() |
c3e6d69acb | ||
![]() |
b56e3d43e5 | ||
![]() |
f317ffb7bb | ||
![]() |
9ea5145952 | ||
![]() |
1d7c38e1f0 | ||
![]() |
18bfc8f2d7 | ||
![]() |
945246988d | ||
![]() |
a5c0e20939 | ||
![]() |
128517649c | ||
![]() |
219358b93d | ||
![]() |
f133719f73 | ||
![]() |
f4e6e201b1 | ||
![]() |
790b2086d7 | ||
![]() |
f9b691cdb0 | ||
![]() |
4118c30261 | ||
![]() |
dacbdaab94 | ||
![]() |
70e30f6caa | ||
![]() |
7cb6c31370 | ||
![]() |
5d3a031ca7 | ||
![]() |
a846fbbe2a | ||
![]() |
6420672879 | ||
![]() |
c4067a5678 | ||
![]() |
0523152ad6 | ||
![]() |
b37b5233ca | ||
![]() |
c68c7e588e | ||
![]() |
1498a0073e | ||
![]() |
27777949a0 | ||
![]() |
4dc2d965d6 | ||
![]() |
70bbbccc39 | ||
![]() |
0dd470fc61 | ||
![]() |
89acdf50fa | ||
![]() |
c0d502785f | ||
![]() |
a8c92cb608 | ||
![]() |
53fda844cc | ||
![]() |
bbf63b0faa | ||
![]() |
2af9fd4960 | ||
![]() |
2c0d65785f | ||
![]() |
d791179d7f | ||
![]() |
c49ed0b6c0 | ||
![]() |
868d8e6831 | ||
![]() |
e3aca1b2ce | ||
![]() |
ddac43b38e | ||
![]() |
416ecc1584 | ||
![]() |
455ba691a7 | ||
![]() |
11332577b3 | ||
![]() |
702b0dd408 | ||
![]() |
e8a9f794f0 | ||
![]() |
bddf3d4705 | ||
![]() |
e99c81a07c | ||
![]() |
fe880475ed | ||
![]() |
5821d5f111 | ||
![]() |
d535c4a2e1 | ||
![]() |
ca8f17a303 | ||
![]() |
fddb7b44a7 | ||
![]() |
49184c3723 | ||
![]() |
cc7f6a2ddf | ||
![]() |
90fe59b829 | ||
![]() |
7b074a460b | ||
![]() |
993cdcd6ee | ||
![]() |
8763374f0e | ||
![]() |
63388fe1f3 | ||
![]() |
b75a88aa72 | ||
![]() |
bb20989a63 | ||
![]() |
0d49e408a4 | ||
![]() |
90c87f311e | ||
![]() |
da06ac7f3f | ||
![]() |
6d9236e805 | ||
![]() |
c306d2e42f | ||
![]() |
f737e3a3dd | ||
![]() |
686586b0f9 | ||
![]() |
e621a5f6ea | ||
![]() |
8093f9541e | ||
![]() |
68e7fb499d | ||
![]() |
d9569720dd | ||
![]() |
1c40685d32 | ||
![]() |
31c6e7af6a | ||
![]() |
552ba67bb1 | ||
![]() |
651254dcc7 | ||
![]() |
26bdafcbf9 | ||
![]() |
02dc9e788f | ||
![]() |
e11c6e9961 | ||
![]() |
e4eaa92728 | ||
![]() |
577f8e5ac6 | ||
![]() |
95ba6cdd54 | ||
![]() |
7ce6cb9ab4 | ||
![]() |
8723cade21 | ||
![]() |
d956d9db47 | ||
![]() |
ecf93ac986 | ||
![]() |
b3a01be2f3 | ||
![]() |
00045a3009 | ||
![]() |
3f7188dd94 | ||
![]() |
720218fea1 | ||
![]() |
73aa95592f | ||
![]() |
ad3fdbc0a4 | ||
![]() |
73cbd21b5e | ||
![]() |
c5ba0c2f54 | ||
![]() |
edddf394b8 | ||
![]() |
61d259f950 | ||
![]() |
c01735865f | ||
![]() |
ca46c5dbe2 | ||
![]() |
2da127abb5 | ||
![]() |
bc33f2200d | ||
![]() |
fd399cde00 | ||
![]() |
00c74019f4 | ||
![]() |
9d0063befa | ||
![]() |
01e55ebb26 | ||
![]() |
4bbad1dac7 | ||
![]() |
ddbda328b3 | ||
![]() |
8ffbeeda80 | ||
![]() |
1d1ffaf912 | ||
![]() |
e0cff02061 | ||
![]() |
7fe95bb0d5 | ||
![]() |
80d241046e | ||
![]() |
5c5e1a1cd2 | ||
![]() |
2eb8dcf26c | ||
![]() |
96ffe645fd | ||
![]() |
c86ea58304 | ||
![]() |
577703495e | ||
![]() |
f8da49eec0 | ||
![]() |
e0fb2d86c9 | ||
![]() |
658ec97055 | ||
![]() |
88535d593e | ||
![]() |
11dee0bfae | ||
![]() |
4594ee5e14 | ||
![]() |
d7f4c3772e | ||
![]() |
29fdb2700f | ||
![]() |
32144ca241 | ||
![]() |
4990f46856 | ||
![]() |
5e24db0cba | ||
![]() |
638c6da9db | ||
![]() |
9141c75bfb | ||
![]() |
704a5dfca9 | ||
![]() |
6b8c36954f | ||
![]() |
762961fe35 | ||
![]() |
4b643f1ca4 | ||
![]() |
e73db5dcbd | ||
![]() |
25f08de4d6 | ||
![]() |
f3bd2abb61 | ||
![]() |
4e2ed01a2e | ||
![]() |
ae4558dbb4 | ||
![]() |
ee7669ba3a | ||
![]() |
e34bc917d6 | ||
![]() |
2ba0f1373c | ||
![]() |
b4fae9d73f | ||
![]() |
e51b23c925 | ||
![]() |
18f0ab7bd3 | ||
![]() |
57aeabcc1a | ||
![]() |
9474c4a9a5 | ||
![]() |
090b55c100 | ||
![]() |
a181e7b084 | ||
![]() |
34fa8d1e38 | ||
![]() |
a03d0c5b88 | ||
![]() |
ac09b5a92b | ||
![]() |
91252d9fb9 | ||
![]() |
efa5488448 | ||
![]() |
e3787e862f | ||
![]() |
6eb56e72de | ||
![]() |
eeefcdff54 | ||
![]() |
bf7a270e0b | ||
![]() |
5e722b2d09 | ||
![]() |
688124f0e9 | ||
![]() |
247b291b12 | ||
![]() |
e7c56a8406 | ||
![]() |
e5d25b6c68 | ||
![]() |
a6eade56ca | ||
![]() |
5f5e4c92c4 | ||
![]() |
07cca0dc7c | ||
![]() |
ed35e1fa1b | ||
![]() |
e87e76e2dc | ||
![]() |
984e20d6bb | ||
![]() |
fbc35d394c | ||
![]() |
3dcc1a9c19 | ||
![]() |
7ba091ca82 | ||
![]() |
ce8a35c318 | ||
![]() |
c3fa3aaf2c | ||
![]() |
8efd74de46 | ||
![]() |
962eb3d9ed | ||
![]() |
eb25dd3be2 | ||
![]() |
43e045fc3e | ||
![]() |
74467f8e78 | ||
![]() |
cfb7e80991 | ||
![]() |
c7e56db050 | ||
![]() |
0614b90213 | ||
![]() |
c4d7c1514f | ||
![]() |
e839e7c61b | ||
![]() |
ca62ac69bb | ||
![]() |
048726a5a2 | ||
![]() |
b1ce7c5a6b | ||
![]() |
b8c195974c | ||
![]() |
1e29d275c6 | ||
![]() |
142755fa5c | ||
![]() |
acafe9c160 | ||
![]() |
8ec2cb5544 | ||
![]() |
c5eabd48e8 | ||
![]() |
11219b3c93 | ||
![]() |
bc6037ed3e | ||
![]() |
ce2008066a | ||
![]() |
d85647cfdd | ||
![]() |
c0c46c3137 | ||
![]() |
7713e67bc5 | ||
![]() |
9a13a516b4 | ||
![]() |
b8a986be06 | ||
![]() |
1c44f83e54 | ||
![]() |
6f1f7e5de8 | ||
![]() |
91ab2497c6 | ||
![]() |
d1d0ee075f | ||
![]() |
90110a9be0 | ||
![]() |
b0dfbf305a | ||
![]() |
b3440f490f | ||
![]() |
2dd56991f7 | ||
![]() |
ff3444c36d | ||
![]() |
5e2ef3942f | ||
![]() |
f660fc4423 | ||
![]() |
5d4e12bbea | ||
![]() |
91e2ce6e76 | ||
![]() |
2ba5f4bf1c | ||
![]() |
bf4cef1db1 | ||
![]() |
8ce915c7a4 | ||
![]() |
1700668d78 | ||
![]() |
a8f93d4efc | ||
![]() |
e4b733e3f1 | ||
![]() |
b50285d751 | ||
![]() |
001e664ff7 | ||
![]() |
01dc954f8a | ||
![]() |
c2fab66575 | ||
![]() |
0f147887b0 | ||
![]() |
911b2d3f67 | ||
![]() |
ba7fbd0960 | ||
![]() |
ac890cd5f2 | ||
![]() |
308dc625f7 | ||
![]() |
8ae9ee0cf2 | ||
![]() |
17c088fb45 | ||
![]() |
e60bf25107 | ||
![]() |
e450f66a02 | ||
![]() |
57ccdfa8d2 | ||
![]() |
491e026ccd | ||
![]() |
83a42ee20e | ||
![]() |
90d7d1b727 | ||
![]() |
92295aa73c | ||
![]() |
50a83890c9 | ||
![]() |
817f73dcda | ||
![]() |
bd86528e6b | ||
![]() |
25d040035e | ||
![]() |
8dc7393d89 | ||
![]() |
245f522761 | ||
![]() |
90c8386187 | ||
![]() |
263db764c4 | ||
![]() |
3a5530a1f3 | ||
![]() |
0d49f92872 | ||
![]() |
b12ddc4eed | ||
![]() |
c2e2938a7e | ||
![]() |
62b5015796 | ||
![]() |
85e944928c | ||
![]() |
5a6464ae09 | ||
![]() |
fb327e42c6 | ||
![]() |
a1348aa23c | ||
![]() |
ad361d109b | ||
![]() |
1fcf52cae4 | ||
![]() |
cbea345f61 | ||
![]() |
059647f398 | ||
![]() |
136a3a0ee2 | ||
![]() |
64b2d2d77e | ||
![]() |
8826435571 | ||
![]() |
6645d2ae8f | ||
![]() |
cb07bca689 | ||
![]() |
09b2db2dfd | ||
![]() |
ca3c0ed3a9 | ||
![]() |
6bdd3d4a88 | ||
![]() |
69eca5c252 | ||
![]() |
0840f01e99 | ||
![]() |
b4c9b515aa | ||
![]() |
b482417ac4 | ||
![]() |
4838d196fd | ||
![]() |
f691f9609c | ||
![]() |
e5bb4e86ac | ||
![]() |
6d8d306905 | ||
![]() |
1f41772bef | ||
![]() |
21c1de430a | ||
![]() |
c5a08af579 | ||
![]() |
bd649ac1c5 | ||
![]() |
70b5173410 | ||
![]() |
eacfb5d8a6 | ||
![]() |
170ae51c47 | ||
![]() |
cc890906b1 | ||
![]() |
b99c9f7c7f | ||
![]() |
ad2920fa85 | ||
![]() |
67b6fa5f95 | ||
![]() |
3df1e35838 | ||
![]() |
7e6d2fe9ec | ||
![]() |
442084cdb5 | ||
![]() |
7f963a19ec | ||
![]() |
9ceee69ff7 | ||
![]() |
a9cc5ee0c6 | ||
![]() |
c1ce09d470 | ||
![]() |
81408d2111 | ||
![]() |
5c89413b24 | ||
![]() |
37f3fcd631 | ||
![]() |
c9f9f601b8 | ||
![]() |
24ffceed81 | ||
![]() |
acfce19de1 | ||
![]() |
b7f39156d4 | ||
![]() |
9d0af3018c | ||
![]() |
fa9748df11 | ||
![]() |
198012ee13 | ||
![]() |
742544aad0 | ||
![]() |
041754e3fa | ||
![]() |
b960f1e8bd | ||
![]() |
c29346613d | ||
![]() |
172e6378f8 | ||
![]() |
26eaa83830 | ||
![]() |
fadf33c78a | ||
![]() |
298f806d01 | ||
![]() |
e6b7dae947 | ||
![]() |
fa637c6cab | ||
![]() |
036366f1ef | ||
![]() |
757aa7b09d | ||
![]() |
b1ebf4bda1 | ||
![]() |
284ea5f924 | ||
![]() |
c03cad3a61 | ||
![]() |
ad8b76d094 | ||
![]() |
226c1c6876 | ||
![]() |
711065e4df | ||
![]() |
ee7034800d | ||
![]() |
1d3ccf27ec | ||
![]() |
51dbaae432 | ||
![]() |
dcffd936e1 | ||
![]() |
e94fbcabd7 | ||
![]() |
ec38ac38c7 | ||
![]() |
0f64dd086a | ||
![]() |
459e1bffee | ||
![]() |
7b471fb344 | ||
![]() |
f8c8c76d39 | ||
![]() |
90b7d0ea59 | ||
![]() |
1383522e3a | ||
![]() |
d46d107e0c | ||
![]() |
25884aa197 | ||
![]() |
be51a46353 | ||
![]() |
48596f87a9 | ||
![]() |
b06a786226 | ||
![]() |
b4eb08e7fb | ||
![]() |
10549ee08f | ||
![]() |
d9235e74ed | ||
![]() |
6ff7197e70 | ||
![]() |
0be2251394 | ||
![]() |
4cef525992 | ||
![]() |
11a22f3264 | ||
![]() |
025ba6e9be | ||
![]() |
cdea86ff67 | ||
![]() |
974c663471 | ||
![]() |
692ef0e158 | ||
![]() |
17f032c0d9 | ||
![]() |
ad3177da24 | ||
![]() |
afad1ce753 | ||
![]() |
13006f3de9 | ||
![]() |
1d86d813c3 | ||
![]() |
f53ed631b3 | ||
![]() |
5b3736b533 | ||
![]() |
cce08581ac | ||
![]() |
c368fbcb10 | ||
![]() |
b644c47192 | ||
![]() |
d03aa16164 | ||
![]() |
aa44ec62aa | ||
![]() |
05c03e7edd | ||
![]() |
f67bd1a344 | ||
![]() |
a8eb059203 | ||
![]() |
59c71c7fc7 | ||
![]() |
58efa46a5d | ||
![]() |
acd22f05dd | ||
![]() |
ce9a0a6d65 | ||
![]() |
f92f341a3f | ||
![]() |
91b2184e1b | ||
![]() |
1ffdc5058e | ||
![]() |
0ffefefe7f | ||
![]() |
764b818934 | ||
![]() |
9d45391347 | ||
![]() |
a390454728 | ||
![]() |
005ad9e60d | ||
![]() |
a360944ed6 | ||
![]() |
6f02209cc8 | ||
![]() |
015ceb4706 | ||
![]() |
e63c33d88d | ||
![]() |
94336d3c1e | ||
![]() |
cc27aff7b3 | ||
![]() |
d23d2f2bd8 | ||
![]() |
37f0caeabd | ||
![]() |
671f896c0b | ||
![]() |
7f5824a106 | ||
![]() |
797b004738 | ||
![]() |
1ff6a8338d | ||
![]() |
66149248ba | ||
![]() |
c38d69f06a | ||
![]() |
324b7fe47b | ||
![]() |
e87a3ccc62 | ||
![]() |
cb3ae6894f | ||
![]() |
e0cbfe825d | ||
![]() |
04456a74d0 | ||
![]() |
5c5b7c7146 | ||
![]() |
7f6c7331b2 | ||
![]() |
0b795db731 | ||
![]() |
8a468ef222 | ||
![]() |
ed7d438a12 | ||
![]() |
8960d81b0d | ||
![]() |
429820b180 | ||
![]() |
539ed6f02a | ||
![]() |
e756641040 | ||
![]() |
2f638a8f5e | ||
![]() |
b6f32464e9 | ||
![]() |
4afcb77820 | ||
![]() |
0ee79114ef | ||
![]() |
29a4a16db8 | ||
![]() |
e2201dc849 | ||
![]() |
4cfc7f951c | ||
![]() |
fcf02cbb75 | ||
![]() |
419bcf9d60 | ||
![]() |
d415327bd7 | ||
![]() |
35fb6bee0e | ||
![]() |
13625a0d09 | ||
![]() |
2476b34b95 | ||
![]() |
3906353b41 | ||
![]() |
65644b8335 | ||
![]() |
6b7cf6c72d | ||
![]() |
217024a687 | ||
![]() |
c3ea3eb6a3 | ||
![]() |
a5b231acc2 | ||
![]() |
790abe3fbe | ||
![]() |
1a4dd1aa7c | ||
![]() |
296b9a5af0 | ||
![]() |
1dac29fa83 | ||
![]() |
cd65ecb2e8 | ||
![]() |
44a3cdb9db | ||
![]() |
80e2b3edb9 | ||
![]() |
52605e006c | ||
![]() |
6a87ac8c88 | ||
![]() |
79f1bf32d0 | ||
![]() |
a995ea05b3 | ||
![]() |
25e577b33d | ||
![]() |
52b5eadf3c | ||
![]() |
06e6fd1aa7 | ||
![]() |
ed7174c6f6 | ||
![]() |
072b1ad15a | ||
![]() |
10c1b11f88 | ||
![]() |
e52fc1e297 | ||
![]() |
12ea5beffc | ||
![]() |
d4703fa428 | ||
![]() |
5e2e3cb54e | ||
![]() |
39b79c6b75 | ||
![]() |
b0e0f44934 | ||
![]() |
6d7033b48a | ||
![]() |
f10006ee5f | ||
![]() |
c35a10483d | ||
![]() |
db3f3c14f2 | ||
![]() |
1346cb19f2 | ||
![]() |
2dbeaf7dad | ||
![]() |
673b7ba80a | ||
![]() |
154bf3d699 | ||
![]() |
8c2c4e21b3 | ||
![]() |
c25383ae13 | ||
![]() |
6106eeba16 | ||
![]() |
8481386513 | ||
![]() |
2683927756 | ||
![]() |
5d8ec4a634 | ||
![]() |
4f328b85c3 | ||
![]() |
92a537a2bb | ||
![]() |
7ed689d24a | ||
![]() |
a6dca9d28c | ||
![]() |
358c5c0745 | ||
![]() |
d821525cee | ||
![]() |
ad7291c1a9 | ||
![]() |
d09d08dc1f | ||
![]() |
0c6fa0dd64 | ||
![]() |
cc8fad9a7f | ||
![]() |
72da89a74d | ||
![]() |
beae838ed5 | ||
![]() |
7970821117 | ||
![]() |
d713e9a207 | ||
![]() |
508cdf4da4 | ||
![]() |
e6c1e773d9 | ||
![]() |
52281a10aa | ||
![]() |
66aa9bf52d | ||
![]() |
bd93062ee5 | ||
![]() |
b56c9eb48e | ||
![]() |
586f5d3614 | ||
![]() |
de492b31c5 | ||
![]() |
5cd85db9fa | ||
![]() |
9a6e580e3a | ||
![]() |
ff8c5a329e | ||
![]() |
da3fc1ee91 | ||
![]() |
85a2e9ec82 | ||
![]() |
18d1ea4528 | ||
![]() |
566a3638fa | ||
![]() |
e0f4af4032 | ||
![]() |
b50ce1e5ba | ||
![]() |
b333504327 | ||
![]() |
2e0a295e3b | ||
![]() |
f6010d9a03 | ||
![]() |
c76cb3da04 | ||
![]() |
2f66ca11c1 | ||
![]() |
a1701eea28 | ||
![]() |
8170d1f828 | ||
![]() |
92f7606f29 | ||
![]() |
fd52530b50 | ||
![]() |
572f7864b2 | ||
![]() |
62bd217464 | ||
![]() |
f0bfc0fbd7 | ||
![]() |
7f266f1c99 | ||
![]() |
5be2499e16 | ||
![]() |
f44d0aedc1 | ||
![]() |
23d17190ee | ||
![]() |
21657823ea | ||
![]() |
3bb45aa7f5 | ||
![]() |
40f9bb787f | ||
![]() |
dda53476ca | ||
![]() |
463082bea4 | ||
![]() |
72688317ad | ||
![]() |
07f97809b8 | ||
![]() |
9613cf7211 | ||
![]() |
ce4b554e5d | ||
![]() |
6da7dc026c | ||
![]() |
e07385f853 | ||
![]() |
86dfcf737d | ||
![]() |
4ed469a56f | ||
![]() |
7704621f4c | ||
![]() |
542507f316 | ||
![]() |
0e66d5878e | ||
![]() |
cecb9c0f71 | ||
![]() |
632e50ca8d | ||
![]() |
7be925aefc | ||
![]() |
611ec0a190 | ||
![]() |
de0410fe9a | ||
![]() |
12dbb8aedc | ||
![]() |
d23d69e14e | ||
![]() |
2488a01337 | ||
![]() |
0a4bb75bc5 | ||
![]() |
bf633a584d | ||
![]() |
0f1deac71e | ||
![]() |
f206d6c055 | ||
![]() |
add37cc49f | ||
![]() |
85625c5e28 | ||
![]() |
453e821ad7 | ||
![]() |
e0c491026f | ||
![]() |
12f4ea50f7 | ||
![]() |
ae6b5f1772 | ||
![]() |
5f8f20f5e6 | ||
![]() |
33a182e6c2 | ||
![]() |
68de6a0b3e | ||
![]() |
25d13822ae | ||
![]() |
25f351424b | ||
![]() |
cb3e6dfa35 | ||
![]() |
1d22407863 | ||
![]() |
bb7c2ee37c | ||
![]() |
278ab75e9f | ||
![]() |
0d1b754376 | ||
![]() |
4cd027f17e | ||
![]() |
bd1f170a5a | ||
![]() |
03577a355e | ||
![]() |
022e67294e | ||
![]() |
7fd5f680ea | ||
![]() |
9ca812f386 | ||
![]() |
a94a68a3c1 | ||
![]() |
f850abf439 | ||
![]() |
e1cd753e4d | ||
![]() |
4c26ba9cea | ||
![]() |
c0c334b42a | ||
![]() |
b4270a9af1 | ||
![]() |
6b6bdc83bd | ||
![]() |
56b7c87c74 | ||
![]() |
32e8467a66 | ||
![]() |
e243d80dea | ||
![]() |
a33075b8d3 | ||
![]() |
ddd40a43aa | ||
![]() |
38131d415b | ||
![]() |
c7b6e43ef8 | ||
![]() |
3d7b7b6b84 | ||
![]() |
163a1dca5f | ||
![]() |
23a47ef01b | ||
![]() |
38ec16d671 | ||
![]() |
d411402a65 | ||
![]() |
826e1b81fa | ||
![]() |
11dde6ac72 | ||
![]() |
0494da830b | ||
![]() |
5243b18f3d | ||
![]() |
0e5e720c19 | ||
![]() |
3dbf11d0a1 | ||
![]() |
499e30c4bb | ||
![]() |
73fae58132 | ||
![]() |
44cf225f7a | ||
![]() |
d9c3505e83 | ||
![]() |
593f242803 | ||
![]() |
a76ea8b79a | ||
![]() |
c0e8e94ca2 | ||
![]() |
eb2e62c0af | ||
![]() |
2bfb8b6080 | ||
![]() |
fda0f14f73 | ||
![]() |
f8ba1273af | ||
![]() |
8b275718e2 | ||
![]() |
379d63ecc7 | ||
![]() |
b1826d81fb | ||
![]() |
6a55f25f67 | ||
![]() |
f2f897172f | ||
![]() |
aa9e72d358 | ||
![]() |
c527759701 | ||
![]() |
5c28a64e57 | ||
![]() |
8c6c42a67f | ||
![]() |
045c734e16 | ||
![]() |
de991037e4 | ||
![]() |
56d4de468c | ||
![]() |
2698520aef | ||
![]() |
fa176376c8 | ||
![]() |
efe4656656 | ||
![]() |
0ed4a0923c | ||
![]() |
a3e65b1a50 | ||
![]() |
1347b3085c | ||
![]() |
9d1effad05 | ||
![]() |
e5ea45ec2e | ||
![]() |
63605d281f | ||
![]() |
f4cc54cb47 | ||
![]() |
34ae007d4d | ||
![]() |
d90b9aee64 | ||
![]() |
ece8681a60 | ||
![]() |
7b5be79908 | ||
![]() |
446afec71a | ||
![]() |
e2bfae239f | ||
![]() |
ccb34cb46d | ||
![]() |
0e1855d9d3 | ||
![]() |
c43127414d | ||
![]() |
9fd88abb70 | ||
![]() |
4ed6b07d8d | ||
![]() |
533c31b785 | ||
![]() |
7ab3ae0bf0 | ||
![]() |
4b401b2d99 | ||
![]() |
d7f2c3af5f | ||
![]() |
bc682cbd3e | ||
![]() |
26613d7817 | ||
![]() |
18e7c14f30 | ||
![]() |
16abdd4f39 | ||
![]() |
99229b74eb | ||
![]() |
600cbaca6f | ||
![]() |
b36f1d26f8 | ||
![]() |
d17f536688 | ||
![]() |
b35a176c66 | ||
![]() |
a7db42e4f0 | ||
![]() |
308cce8231 | ||
![]() |
a6848250d2 | ||
![]() |
a9ca5e61e5 | ||
![]() |
06558695d5 | ||
![]() |
dd73c924ac | ||
![]() |
5a053ffe80 | ||
![]() |
e2bcd2ab9e | ||
![]() |
fea3a3d569 | ||
![]() |
75fa3542d0 | ||
![]() |
4ffb8a6398 | ||
![]() |
7a6d8b1b1a | ||
![]() |
905d0be509 | ||
![]() |
fd3efca164 | ||
![]() |
825677ad09 | ||
![]() |
561b551deb | ||
![]() |
6a4f5e5268 | ||
![]() |
f6e33cf669 | ||
![]() |
4e6265ea5a | ||
![]() |
494b8664da | ||
![]() |
d6bebd56f7 | ||
![]() |
70dcde78d0 | ||
![]() |
89a3086231 | ||
![]() |
cfb6f03224 | ||
![]() |
11f55a9672 | ||
![]() |
5475ac279d | ||
![]() |
a77d18efaf | ||
![]() |
dd561c3834 | ||
![]() |
db20517796 | ||
![]() |
4a5aa6682d | ||
![]() |
e0ba958e28 | ||
![]() |
8f80f412fb | ||
![]() |
cc4ac82bb6 | ||
![]() |
1795e24176 | ||
![]() |
b708a522a1 | ||
![]() |
65e8ba8e1d | ||
![]() |
0b3180b4f5 | ||
![]() |
8f13e3ddb9 | ||
![]() |
7d83dfff9c | ||
![]() |
dbf93a8973 | ||
![]() |
5b6e7927c6 | ||
![]() |
13606bbfde | ||
![]() |
8f0171bdd4 | ||
![]() |
c087374c64 | ||
![]() |
dfe4769157 | ||
![]() |
404a95b588 | ||
![]() |
bc5298e25c | ||
![]() |
d86503ea82 | ||
![]() |
bd8ae68006 | ||
![]() |
c02449ca53 | ||
![]() |
1576548428 | ||
![]() |
36837c10b2 | ||
![]() |
f947de4bb5 | ||
![]() |
2424b7ab1b | ||
![]() |
c43af566fa | ||
![]() |
488245f99c | ||
![]() |
27f90c0962 | ||
![]() |
ffa62e5bab | ||
![]() |
2255ac52f7 | ||
![]() |
b3204e6d60 | ||
![]() |
f6f6f278e2 | ||
![]() |
167717b806 | ||
![]() |
8177bc262f | ||
![]() |
ffd8e127e7 | ||
![]() |
f871de0064 | ||
![]() |
ec691ca34b | ||
![]() |
709b3506cd | ||
![]() |
2ee2693a47 | ||
![]() |
431ead1c9a | ||
![]() |
e3ed2b82e6 | ||
![]() |
311151beab | ||
![]() |
ae2a2c9931 | ||
![]() |
eb5aa12c8b | ||
![]() |
77b5c0b2cf | ||
![]() |
b44da5a82a | ||
![]() |
219fe7b29c | ||
![]() |
d49531dd3a | ||
![]() |
4a23b19a13 | ||
![]() |
a662f86f6f | ||
![]() |
d335aa2cdc | ||
![]() |
0aabfd9963 | ||
![]() |
14b77db1b9 | ||
![]() |
e125eea5a6 | ||
![]() |
1649e680f6 | ||
![]() |
2897ce7dc2 | ||
![]() |
5ed03ebe52 | ||
![]() |
3456bbc4cc | ||
![]() |
7a09907146 | ||
![]() |
a1fc9b80c8 | ||
![]() |
dfe382c6ae | ||
![]() |
b3d91a147f | ||
![]() |
c59c5e8ea2 | ||
![]() |
0969045b6e | ||
![]() |
c30c557e4d | ||
![]() |
d738adc1fb | ||
![]() |
c691037517 | ||
![]() |
eafccdb315 | ||
![]() |
b7a1eccce8 | ||
![]() |
c91a6cd78f | ||
![]() |
7d49d774fd | ||
![]() |
9ab5f9dd8d | ||
![]() |
b8dde1cf19 | ||
![]() |
57fa576a35 | ||
![]() |
f6af9d9886 | ||
![]() |
87e8691e7c | ||
![]() |
bbb4bbc0f1 | ||
![]() |
0e8e340cba | ||
![]() |
a0b207164c | ||
![]() |
f254c59dc7 | ||
![]() |
568befb6aa | ||
![]() |
f4b60e7f14 | ||
![]() |
85b77209ae | ||
![]() |
e880680fb6 | ||
![]() |
aee540b831 | ||
![]() |
4710d3d969 | ||
![]() |
d758234ade | ||
![]() |
c07a6f3ff3 | ||
![]() |
d021f2e8a0 | ||
![]() |
ca5f4e2135 | ||
![]() |
3c6ea7ca82 | ||
![]() |
8b15c84ea9 | ||
![]() |
60edbf65b6 | ||
![]() |
fe2b2a3b9d | ||
![]() |
7332a7cafb | ||
![]() |
23f8dca6fb | ||
![]() |
b908376bef | ||
![]() |
8b02afd9a9 | ||
![]() |
3202cc6162 | ||
![]() |
068f7ae264 | ||
![]() |
68d2830ee9 | ||
![]() |
2ecdd48683 | ||
![]() |
6bd6b3a8a1 | ||
![]() |
91b57cd6e5 | ||
![]() |
d27a46f09b | ||
![]() |
4abf4fbaac | ||
![]() |
16a8281f71 | ||
![]() |
534d2ca1d7 | ||
![]() |
79954a1b07 | ||
![]() |
b33074d893 | ||
![]() |
0683adbf50 | ||
![]() |
68e2c9a85f | ||
![]() |
616a0099d1 | ||
![]() |
665adcd4b7 | ||
![]() |
91dc73ef44 | ||
![]() |
14dc679ce0 | ||
![]() |
ef6f040355 | ||
![]() |
c1dd687af6 | ||
![]() |
f435d6699d | ||
![]() |
ba33665d1f | ||
![]() |
67f053b672 | ||
![]() |
cfb67752fe | ||
![]() |
ba476bb6d8 | ||
![]() |
7762192ecf | ||
![]() |
b9fdb721f2 | ||
![]() |
c830115c48 | ||
![]() |
52af6e69f0 | ||
![]() |
32be348af2 | ||
![]() |
7e87499213 | ||
![]() |
7719333f55 | ||
![]() |
276452ca10 | ||
![]() |
1b10dd7aae | ||
![]() |
7aebb3cc42 | ||
![]() |
6f444b2761 | ||
![]() |
81d96c4421 | ||
![]() |
10296ac665 | ||
![]() |
ab0fa55780 | ||
![]() |
409f2a041f | ||
![]() |
dd75cba3ef | ||
![]() |
ee588fe088 | ||
![]() |
db4215f14a | ||
![]() |
32afaaef93 | ||
![]() |
0ac827848d | ||
![]() |
c277bd6ce7 | ||
![]() |
6d8443a245 | ||
![]() |
53c83ee3ed | ||
![]() |
fa1ae0abcd | ||
![]() |
38ed72cd37 | ||
![]() |
1099f3a071 | ||
![]() |
6a4bdb027b | ||
![]() |
7c0cbcf2f6 | ||
![]() |
076e1fa348 | ||
![]() |
cd5261ea6d | ||
![]() |
4b994e14fb | ||
![]() |
e62ee60c7a | ||
![]() |
e237402c47 | ||
![]() |
1c23d2b392 | ||
![]() |
7ecd874bce | ||
![]() |
49c37e6c1c | ||
![]() |
dca8ae5f02 | ||
![]() |
cf75a64651 | ||
![]() |
0af1a9d270 | ||
![]() |
1394cad30f | ||
![]() |
18c0e9bd71 | ||
![]() |
c70c1a22d2 | ||
![]() |
5a4f6413d1 | ||
![]() |
6d1b493f3d | ||
![]() |
7840c4c70c | ||
![]() |
9096f4f451 | ||
![]() |
487538e87a | ||
![]() |
e1fa945e7e | ||
![]() |
cda6d891ab | ||
![]() |
473003fbdf | ||
![]() |
3f20303702 | ||
![]() |
a1be8e7f9b | ||
![]() |
8d97bed806 | ||
![]() |
13ce9031cc | ||
![]() |
95326a40ff | ||
![]() |
8e329bb759 | ||
![]() |
da82f59b69 | ||
![]() |
ab1f80200a | ||
![]() |
41eec4efa2 | ||
![]() |
2045d83dd3 | ||
![]() |
0da6c113ce | ||
![]() |
fa6d78829f | ||
![]() |
550e403f00 | ||
![]() |
f99430d89e | ||
![]() |
09a491378a | ||
![]() |
9019a0a86c | ||
![]() |
b2954e66e8 | ||
![]() |
7c0f201075 | ||
![]() |
0ecb57056f | ||
![]() |
3be96564a8 | ||
![]() |
0cb5650386 | ||
![]() |
8f61e5cea7 | ||
![]() |
34ff881ece | ||
![]() |
af121ccad8 | ||
![]() |
c81eb7e226 | ||
![]() |
74fe1b95fb | ||
![]() |
d1c769877a | ||
![]() |
94891ff296 | ||
![]() |
12a40e17a9 | ||
![]() |
8ffc971138 | ||
![]() |
f1d2e18508 | ||
![]() |
1a02e84589 | ||
![]() |
c79c0909d9 | ||
![]() |
3fc5779b91 | ||
![]() |
ff32546d81 | ||
![]() |
99b036c9b2 | ||
![]() |
33c02d4771 | ||
![]() |
8373ca3641 | ||
![]() |
3644a35027 | ||
![]() |
542802af23 | ||
![]() |
9547be37c2 | ||
![]() |
974d5d5921 | ||
![]() |
211605f0c5 | ||
![]() |
a5b6f91e8d | ||
![]() |
fbf3560886 | ||
![]() |
07593b2422 | ||
![]() |
cd423348d9 | ||
![]() |
90821c6202 | ||
![]() |
dee2ef8083 | ||
![]() |
50a7d32af0 | ||
![]() |
a5c6ecba8d | ||
![]() |
7a53474f43 | ||
![]() |
6b18f18b4c | ||
![]() |
971f5bcedd | ||
![]() |
42bbc5ce10 | ||
![]() |
c01b6f4d09 | ||
![]() |
9da2c96039 | ||
![]() |
e8ab9a0d27 | ||
![]() |
628c4e7af1 | ||
![]() |
4ea7a65af7 | ||
![]() |
d89861f651 | ||
![]() |
0c8ccf7207 | ||
![]() |
39dff07a27 | ||
![]() |
84e6c7a9e5 | ||
![]() |
c1400f6f12 | ||
![]() |
889038f668 | ||
![]() |
907a9d25e8 | ||
![]() |
b3d72a95be | ||
![]() |
b78944146a | ||
![]() |
9b25b00fa3 | ||
![]() |
ba41ecfa17 | ||
![]() |
1ab6c35363 | ||
![]() |
5162cb8ad6 | ||
![]() |
8a2be299f4 | ||
![]() |
f73a27cadc | ||
![]() |
f332f14102 | ||
![]() |
775cc1be66 | ||
![]() |
f05e51362f | ||
![]() |
ce515e993f | ||
![]() |
a34197ef77 | ||
![]() |
7f7e2ea72f | ||
![]() |
4d384a8714 | ||
![]() |
c44e6741ce | ||
![]() |
94c3e0f702 | ||
![]() |
c8846c0907 | ||
![]() |
f9da9a0edb | ||
![]() |
6372144be0 | ||
![]() |
ef753b710b | ||
![]() |
e6ba048701 | ||
![]() |
71813f5e46 | ||
![]() |
a6df3550cf | ||
![]() |
8a57b3c972 | ||
![]() |
f665e5d130 | ||
![]() |
fa4b4d2033 | ||
![]() |
a492632022 | ||
![]() |
6c6f1f64c2 | ||
![]() |
160312d945 | ||
![]() |
badb81769a | ||
![]() |
8b5d050267 | ||
![]() |
2e7d2c8f74 | ||
![]() |
3a0b64489f | ||
![]() |
ee3551e45e | ||
![]() |
1b0477a5a9 | ||
![]() |
4ae2f77ba1 | ||
![]() |
0a0f3c63a6 | ||
![]() |
da0d15733c | ||
![]() |
cb2feb9def | ||
![]() |
abb0da9193 | ||
![]() |
b6a141ea8a | ||
![]() |
ca84361e4b | ||
![]() |
09d9dd8873 | ||
![]() |
925707c0f8 | ||
![]() |
de24d7bd4c | ||
![]() |
2f6e1a8cc3 | ||
![]() |
40153716a3 | ||
![]() |
7735141e73 | ||
![]() |
5ede86ae51 | ||
![]() |
3b7d31c1ed | ||
![]() |
d4af0bb8f6 | ||
![]() |
4eec66e479 | ||
![]() |
4c070de4fb | ||
![]() |
54faab69cb | ||
![]() |
8136649e9d | ||
![]() |
71358ddffd | ||
![]() |
be5fbf7372 | ||
![]() |
ba569a27cc | ||
![]() |
0f76e492ae | ||
![]() |
a90492a083 | ||
![]() |
f4b4365c19 | ||
![]() |
d792e75f2c | ||
![]() |
41a3bff3da | ||
![]() |
82b0aebef3 | ||
![]() |
23ef5e4ba2 | ||
![]() |
44154e0733 | ||
![]() |
d22186bbbc | ||
![]() |
b8983aa309 | ||
![]() |
4dcde5aa3d | ||
![]() |
99f0e45b61 | ||
![]() |
7520f9f1c3 | ||
![]() |
f208bf5a2d | ||
![]() |
52b6eda4f2 | ||
![]() |
73342f0ee0 | ||
![]() |
0774386b23 | ||
![]() |
e351972bc8 | ||
![]() |
021e89b8c6 | ||
![]() |
4dd44d9c20 | ||
![]() |
31f39120b7 | ||
![]() |
b9fb9c2380 | ||
![]() |
14afbf361a | ||
![]() |
bf6dc61967 | ||
![]() |
1de496cf0f | ||
![]() |
154fc29f58 | ||
![]() |
52db6e370d | ||
![]() |
672f24b1dc | ||
![]() |
2f02d825f1 | ||
![]() |
15108d6308 | ||
![]() |
c771968ab6 | ||
![]() |
b61e8b81f5 | ||
![]() |
77f72aa6c3 | ||
![]() |
b4a558041f | ||
![]() |
8bad5f2a61 | ||
![]() |
f0d611df9e | ||
![]() |
013d043d22 | ||
![]() |
382429e760 | ||
![]() |
0b08491f83 | ||
![]() |
5fbf4e348c | ||
![]() |
73b1a965f7 | ||
![]() |
42e4c34ff3 | ||
![]() |
0df14c8393 | ||
![]() |
60a2ee88a5 | ||
![]() |
66a77a9b49 | ||
![]() |
3b9103e4a6 | ||
![]() |
77c66e0247 | ||
![]() |
9f304291bd | ||
![]() |
986c7949c0 | ||
![]() |
69f5fe070d | ||
![]() |
5dedda1448 | ||
![]() |
24c43e9d34 | ||
![]() |
50b87c4e68 | ||
![]() |
ce8311c7e4 | ||
![]() |
674da8ae07 | ||
![]() |
84490052d4 | ||
![]() |
19035292d0 | ||
![]() |
81656a8466 | ||
![]() |
76ba591957 | ||
![]() |
1f8518c5d9 | ||
![]() |
a52857cb02 | ||
![]() |
9e01625779 | ||
![]() |
6e1f867523 | ||
![]() |
cd350e3829 | ||
![]() |
0bededd7c5 | ||
![]() |
a797e9efdf | ||
![]() |
27893c64f3 | ||
![]() |
dd4699c111 | ||
![]() |
11a7ac0d6a | ||
![]() |
b13106339e | ||
![]() |
1b1c43a9fe | ||
![]() |
7b5c411f5c | ||
![]() |
7f9f94a1df | ||
![]() |
3b4d430cd8 | ||
![]() |
33b815e894 | ||
![]() |
f92779198d | ||
![]() |
9ac5cdfc2f | ||
![]() |
8a279d2275 | ||
![]() |
c0f8340c7c | ||
![]() |
d317ca50ae | ||
![]() |
487406c3c0 | ||
![]() |
2c7cfd2926 | ||
![]() |
c66f6e60fc | ||
![]() |
b0735f3165 | ||
![]() |
1fc5a41447 | ||
![]() |
cb787b70bf | ||
![]() |
0f15ed1617 | ||
![]() |
5d80017fd6 | ||
![]() |
e1711b0e9a | ||
![]() |
c27cc4cfe0 | ||
![]() |
dc470723b1 | ||
![]() |
da2bde9d62 | ||
![]() |
13abfd997e | ||
![]() |
8276791749 | ||
![]() |
9d11716933 | ||
![]() |
ff318a6302 | ||
![]() |
0e24c1e921 | ||
![]() |
9ca3137987 | ||
![]() |
20ff8a0988 | ||
![]() |
771e91374b | ||
![]() |
1a74e54e8b | ||
![]() |
6e3802a2cf | ||
![]() |
df5a47b819 | ||
![]() |
a39789c85c | ||
![]() |
b7298e49ae | ||
![]() |
be795f90da | ||
![]() |
1c4663bc42 | ||
![]() |
d759a70db8 | ||
![]() |
1dcf4418ba | ||
![]() |
685366006c | ||
![]() |
85ce195f75 | ||
![]() |
18f8b7eb72 | ||
![]() |
0dc1e1e92e | ||
![]() |
0e1f107f83 | ||
![]() |
dfe405076e | ||
![]() |
dce2e1aa0f | ||
![]() |
d8ce83e73a | ||
![]() |
33eac5f7fd | ||
![]() |
0025770a99 | ||
![]() |
d4bade7a4e | ||
![]() |
f9dfd7e4b7 | ||
![]() |
c7106b3eb7 | ||
![]() |
f2b6ebed7b | ||
![]() |
e5843470e8 | ||
![]() |
4ab2d26cb8 | ||
![]() |
40cd996cc0 | ||
![]() |
904346bf88 | ||
![]() |
c42ca3e73a | ||
![]() |
329be28d69 | ||
![]() |
9a158f1ef0 | ||
![]() |
61c7af92f2 | ||
![]() |
59c88da74d | ||
![]() |
bce8bc203f | ||
![]() |
24af69a411 | ||
![]() |
d7c9f2f63a | ||
![]() |
d39bbcfa8d | ||
![]() |
86871577d9 | ||
![]() |
aeca33f96c | ||
![]() |
825fff880e | ||
![]() |
68e6b56a2a | ||
![]() |
5a99bce07d | ||
![]() |
4ac56b9d9f | ||
![]() |
b1f64d3a2a | ||
![]() |
e77d867068 | ||
![]() |
1b27bb446f | ||
![]() |
ed7bfeee7a | ||
![]() |
176f7ea3bb | ||
![]() |
6398c8bba8 | ||
![]() |
c5de48b56c | ||
![]() |
28dc509dde | ||
![]() |
897cf5d117 | ||
![]() |
a3dbbcfd2a | ||
![]() |
6388ac7dc1 | ||
![]() |
304e24e211 | ||
![]() |
6fb0ed88d6 | ||
![]() |
98ca62c2d6 | ||
![]() |
1ba5712f88 | ||
![]() |
1a97fd7b63 | ||
![]() |
32b4896107 | ||
![]() |
c75ece4442 | ||
![]() |
016dabcf04 | ||
![]() |
ae8f08ee59 | ||
![]() |
33ee67112f | ||
![]() |
e0b9d3b2c9 | ||
![]() |
33e19f881e | ||
![]() |
dd302206ad | ||
![]() |
b3ebfc2b74 | ||
![]() |
069b280f63 | ||
![]() |
89b431f60f | ||
![]() |
4e3320a679 | ||
![]() |
39a72bbcd1 | ||
![]() |
696ddf6f0a | ||
![]() |
60d5a16b99 | ||
![]() |
febd598597 | ||
![]() |
7747136421 | ||
![]() |
dd707b746f | ||
![]() |
ac6111aeb0 | ||
![]() |
c0f2bfb2c7 | ||
![]() |
74552acaea | ||
![]() |
5600879a1d | ||
![]() |
bf4580d5fd | ||
![]() |
5439849246 | ||
![]() |
3bda1cef92 | ||
![]() |
e3014dcc01 | ||
![]() |
57d2732ccb | ||
![]() |
e6b2eb78a2 | ||
![]() |
6c09ffaf46 | ||
![]() |
5ce9e7a0b7 | ||
![]() |
3e6dfe138a | ||
![]() |
7aa95afadd | ||
![]() |
dc7dc9786f | ||
![]() |
aed6db2cb9 | ||
![]() |
3a4b28d473 | ||
![]() |
f1474db360 | ||
![]() |
a8478fc8d3 | ||
![]() |
849179ba27 | ||
![]() |
6d1ea388cb | ||
![]() |
07e3ea7f26 | ||
![]() |
4afc33db8d | ||
![]() |
d025af9bb5 | ||
![]() |
f99f02bb05 | ||
![]() |
92c40ce190 | ||
![]() |
1eb74f94c4 | ||
![]() |
a28cda3653 | ||
![]() |
861e1ba604 | ||
![]() |
7731c34d79 | ||
![]() |
14dc361433 | ||
![]() |
7f59577fdd | ||
![]() |
b193ba8a02 | ||
![]() |
53423673ca | ||
![]() |
2f738c7f40 | ||
![]() |
aefb9196cf | ||
![]() |
7292486ec3 | ||
![]() |
7561a0fc83 | ||
![]() |
196c8242ca | ||
![]() |
424bb35877 | ||
![]() |
08e0ad7b39 | ||
![]() |
2ebb87f047 | ||
![]() |
006b83798e | ||
![]() |
293c9288b3 | ||
![]() |
8f92e8be12 | ||
![]() |
a3e3f8ffa0 | ||
![]() |
07086c9487 | ||
![]() |
066811592d | ||
![]() |
72a5813192 | ||
![]() |
99b13f2741 | ||
![]() |
a15378e073 | ||
![]() |
7d2abe27dd | ||
![]() |
64962b0218 | ||
![]() |
75dd191bdf | ||
![]() |
e93e3bcb82 | ||
![]() |
feaf8f9590 | ||
![]() |
8a8829499d | ||
![]() |
1e4c57fa64 | ||
![]() |
29dd7192e6 | ||
![]() |
705330c750 | ||
![]() |
599a2c1f1a | ||
![]() |
5a8649863c | ||
![]() |
05f6f2497a | ||
![]() |
d56e8bcc8a | ||
![]() |
220776de6b | ||
![]() |
3da2c0f6d2 | ||
![]() |
ac3e356c95 | ||
![]() |
a96fa00f38 | ||
![]() |
a5e0583cd3 | ||
![]() |
46480bb9a1 | ||
![]() |
16c725dbc7 | ||
![]() |
0fd5dda99d | ||
![]() |
9d8375c29b | ||
![]() |
508dbb99aa | ||
![]() |
42f0588ea8 | ||
![]() |
6085ca2aed | ||
![]() |
a8259945c4 | ||
![]() |
3af5023a20 | ||
![]() |
2bac074f08 | ||
![]() |
d098cfd8c0 | ||
![]() |
b4b7f6828c | ||
![]() |
0d0893f2b9 | ||
![]() |
2bfa57bc32 | ||
![]() |
b276ac7691 | ||
![]() |
32ce7f19b2 | ||
![]() |
819afe46ee | ||
![]() |
c13af84372 | ||
![]() |
47c1bf9e43 | ||
![]() |
d95b8e0627 | ||
![]() |
1e8e6057ea | ||
![]() |
38f05cea46 | ||
![]() |
7bf910482e | ||
![]() |
b8edf5bbe9 | ||
![]() |
5e7a0fe73b | ||
![]() |
746b80a210 | ||
![]() |
764a5e4a50 | ||
![]() |
af0888aaf6 | ||
![]() |
9c18bb3702 | ||
![]() |
c7cc914961 | ||
![]() |
c45069bfbe | ||
![]() |
9a51c11074 | ||
![]() |
cb142cf217 | ||
![]() |
7da6a9128b | ||
![]() |
61d152384e | ||
![]() |
0c86ccc647 | ||
![]() |
a92df2e007 | ||
![]() |
634f7cfee4 | ||
![]() |
70d56bfe3c | ||
![]() |
bd38ebc697 | ||
![]() |
b15434e749 | ||
![]() |
7047e2ed72 | ||
![]() |
c1311c2b8f | ||
![]() |
0bb5ff5d1a | ||
![]() |
64dc957a41 | ||
![]() |
3d3a3f9e7c | ||
![]() |
8d78848a39 | ||
![]() |
90412c8613 | ||
![]() |
78729e76da | ||
![]() |
f858bb0d1f | ||
![]() |
15ca80c831 | ||
![]() |
ec9e9f38b1 | ||
![]() |
46792af733 | ||
![]() |
445245ca85 | ||
![]() |
f96f1f3165 | ||
![]() |
bead90a837 | ||
![]() |
aaa42aa0d5 | ||
![]() |
1f635608bb | ||
![]() |
9c94236e6c | ||
![]() |
3f9ab7cf5d | ||
![]() |
63e9685470 | ||
![]() |
6cd084a3b5 | ||
![]() |
72c7c1d64e | ||
![]() |
6ea32b8b76 | ||
![]() |
1aaf86a596 | ||
![]() |
6188855b67 | ||
![]() |
a3660127a4 | ||
![]() |
c09c621af7 | ||
![]() |
4e430a8a16 | ||
![]() |
6478e1d7e5 | ||
![]() |
a884ffe430 | ||
![]() |
c29d1f4e3a | ||
![]() |
674e53f40e | ||
![]() |
68857e40d6 | ||
![]() |
dd576194ce | ||
![]() |
870c99b7e7 | ||
![]() |
e3f5e04cf0 | ||
![]() |
0cd8c287a4 | ||
![]() |
eeeba1496c | ||
![]() |
186b101deb | ||
![]() |
d2fc8b4a5f | ||
![]() |
04ca9aecd1 | ||
![]() |
2e48139fbf | ||
![]() |
0636af6131 | ||
![]() |
7352ac408b | ||
![]() |
c41d959ee6 | ||
![]() |
430791616b | ||
![]() |
00fddba672 | ||
![]() |
eef4b3fcfc | ||
![]() |
aaa1e7f9d4 | ||
![]() |
37550c16f9 | ||
![]() |
b1f2a680bd | ||
![]() |
2b56e4c1bb | ||
![]() |
62f374b19e | ||
![]() |
89b5680d81 | ||
![]() |
0f3c330ad8 | ||
![]() |
7157363ab4 | ||
![]() |
c5b66836a5 | ||
![]() |
57e6336794 | ||
![]() |
64510fe917 | ||
![]() |
38dfe52559 | ||
![]() |
7759d10f36 | ||
![]() |
32ab3276ee | ||
![]() |
74a7ee9973 | ||
![]() |
0c460e80ed | ||
![]() |
bf51b8c07a | ||
![]() |
04a6f0a1a4 | ||
![]() |
1fc89eb87f | ||
![]() |
e336bc7c42 | ||
![]() |
b511486fcd | ||
![]() |
3bfff57e1f | ||
![]() |
628e62a966 | ||
![]() |
f087211566 | ||
![]() |
665e16899c | ||
![]() |
58987556d5 | ||
![]() |
79c2af3082 | ||
![]() |
8c0bfd3e0c | ||
![]() |
24f127027b | ||
![]() |
2b9ca12edf | ||
![]() |
3b8cf5bd14 | ||
![]() |
c12a414b21 | ||
![]() |
b5bb61ee69 | ||
![]() |
69f01ec2d1 | ||
![]() |
4cff10af69 | ||
![]() |
c4e3578e4b | ||
![]() |
797315044d | ||
![]() |
08c128bd93 | ||
![]() |
530675a1ad | ||
![]() |
273e9afcc8 | ||
![]() |
9c7016f560 | ||
![]() |
69ba0da827 | ||
![]() |
1fa2af5136 | ||
![]() |
cfa81b8fb0 | ||
![]() |
69f7156ad9 | ||
![]() |
6f964e4f06 | ||
![]() |
d9ca9e9869 | ||
![]() |
2df6e6d9f8 | ||
![]() |
379efd62aa | ||
![]() |
00dd45720e | ||
![]() |
54d484e136 | ||
![]() |
cb3d0ce2cb | ||
![]() |
f86432b119 | ||
![]() |
2c6d32b864 | ||
![]() |
3c14c524c5 | ||
![]() |
8e860c1662 | ||
![]() |
c90acaa77a | ||
![]() |
b420f60a06 | ||
![]() |
7291c1f565 | ||
![]() |
3fa0fbb816 | ||
![]() |
a9d798c4d5 | ||
![]() |
72f4b534c4 | ||
![]() |
a03100c357 | ||
![]() |
a7731673d0 | ||
![]() |
3124a8df93 | ||
![]() |
c267c53017 | ||
![]() |
dc454bd16b | ||
![]() |
c6495bccbf | ||
![]() |
f95f19e854 | ||
![]() |
ca8b4e9742 | ||
![]() |
cd4cf989bb | ||
![]() |
6015b71c4e | ||
![]() |
1bfd750f3f | ||
![]() |
7bdb9fba95 | ||
![]() |
6927153703 | ||
![]() |
6a655ca192 | ||
![]() |
9f7f7925da | ||
![]() |
c3ef63f167 | ||
![]() |
94eb132896 | ||
![]() |
383641d70a | ||
![]() |
963bcde476 | ||
![]() |
dde279ed31 | ||
![]() |
89747794fe | ||
![]() |
462f10f824 | ||
![]() |
8834448cc1 | ||
![]() |
ee483aeca2 | ||
![]() |
fd17cd4d9c | ||
![]() |
53f2c02ac7 | ||
![]() |
1919352a10 | ||
![]() |
9f9f9ed1b2 | ||
![]() |
a0d7a26e32 | ||
![]() |
bb1ce6cc0b | ||
![]() |
b5fdbe848b | ||
![]() |
efb8471a69 | ||
![]() |
25c1b29226 | ||
![]() |
2839c059b1 | ||
![]() |
cb9e2e8466 | ||
![]() |
a379a4c163 | ||
![]() |
b061fed981 | ||
![]() |
9c480490f7 | ||
![]() |
978b808f7d | ||
![]() |
74be993576 | ||
![]() |
4f3ec68dc7 | ||
![]() |
d220834f80 | ||
![]() |
244e966138 | ||
![]() |
c262c35676 | ||
![]() |
ef60fdbd73 | ||
![]() |
b1f081f6e6 | ||
![]() |
6cc066a2c5 | ||
![]() |
0fd7fa7daf | ||
![]() |
9258b84673 | ||
![]() |
fdf2517bd9 | ||
![]() |
cc36756aa2 | ||
![]() |
1c58f291cc | ||
![]() |
8ae1e657e8 | ||
![]() |
7ba07c80a1 | ||
![]() |
fec096f153 | ||
![]() |
499ffe2f8c | ||
![]() |
cf41ee3ac9 | ||
![]() |
e315927a1a | ||
![]() |
03c1bcf4bd | ||
![]() |
92f841aef7 | ||
![]() |
9fafa68533 | ||
![]() |
e7257dcf2e | ||
![]() |
3ebcfdda36 | ||
![]() |
77bac26587 | ||
![]() |
d6773834f2 | ||
![]() |
6f998400d9 | ||
![]() |
64f48e884e | ||
![]() |
e146a5f132 | ||
![]() |
1beda0cbb7 | ||
![]() |
72b72fe8ed | ||
![]() |
bd9eb30ffd | ||
![]() |
dd18e714ff | ||
![]() |
d6c449e3b4 | ||
![]() |
071f8d4182 | ||
![]() |
d83233501f | ||
![]() |
419a50f817 | ||
![]() |
975d23480c | ||
![]() |
13211705cd | ||
![]() |
9ec0b7e0c4 | ||
![]() |
412510f974 | ||
![]() |
683bfa60ad | ||
![]() |
77172a242f | ||
![]() |
46cd5f1dad | ||
![]() |
2976de4808 | ||
![]() |
560cd62272 | ||
![]() |
0f54880277 | ||
![]() |
5cd524df18 | ||
![]() |
94111bbbd4 | ||
![]() |
df4205c10a | ||
![]() |
9421b06397 | ||
![]() |
09690be8de | ||
![]() |
ce8a321dd0 | ||
![]() |
3833765ba5 | ||
![]() |
4d28a59fc2 | ||
![]() |
a498daa0e0 | ||
![]() |
bd12c44d35 | ||
![]() |
4c385cf896 | ||
![]() |
7d4ed0b10e | ||
![]() |
48d13b44c6 | ||
![]() |
8b63b48627 | ||
![]() |
b9ac64c2cb | ||
![]() |
4d2c3f0a4d | ||
![]() |
c156b916a4 | ||
![]() |
865893fb14 | ||
![]() |
a60edcc6d4 | ||
![]() |
20cb12db8d | ||
![]() |
42aa796150 | ||
![]() |
2a902738fb | ||
![]() |
bb5d4234e3 | ||
![]() |
930781e168 | ||
![]() |
1c3a99b52c | ||
![]() |
5f04843e5b | ||
![]() |
8c29bf5640 | ||
![]() |
82306ebfba | ||
![]() |
03d4b9f078 | ||
![]() |
51114f07f1 | ||
![]() |
e19917296f | ||
![]() |
8ed40acac6 | ||
![]() |
38ae6ec1a2 | ||
![]() |
9e24b9c7af | ||
![]() |
a144bb8b76 | ||
![]() |
4d3fb91fb4 | ||
![]() |
bbfe118209 | ||
![]() |
e5c14674f0 | ||
![]() |
6dba7608bf | ||
![]() |
21423497ef | ||
![]() |
01b0f1061d | ||
![]() |
3d8c093145 | ||
![]() |
919c97fa65 | ||
![]() |
376b4d48fe | ||
![]() |
118e73306d | ||
![]() |
1dd69921d3 | ||
![]() |
29e68b200c | ||
![]() |
0b516b7162 | ||
![]() |
a0b3535735 | ||
![]() |
5e852ab9d1 | ||
![]() |
f9bb5d2984 | ||
![]() |
ad595c3ba9 | ||
![]() |
7031ff23bb | ||
![]() |
9753c6bec5 | ||
![]() |
b16e3da12a | ||
![]() |
e7661d198f | ||
![]() |
13c7b91133 | ||
![]() |
950b0b770e | ||
![]() |
15e1227ed4 | ||
![]() |
ddfe821bcf | ||
![]() |
54866b68cd | ||
![]() |
05a443adf2 | ||
![]() |
ebf315e6f3 | ||
![]() |
c44d45db86 | ||
![]() |
7a2647e162 | ||
![]() |
9bae9ddad9 | ||
![]() |
004d7251ab | ||
![]() |
33d044a862 | ||
![]() |
a9086e8a4b | ||
![]() |
761c3c5446 | ||
![]() |
66c0e26e28 | ||
![]() |
7d1b715605 | ||
![]() |
9f494fe423 | ||
![]() |
809c809281 | ||
![]() |
0580b60622 | ||
![]() |
4bdb664c33 | ||
![]() |
459435dca1 | ||
![]() |
3fdb7808ef | ||
![]() |
97ff646fc1 | ||
![]() |
9801596fb3 | ||
![]() |
982315573c | ||
![]() |
9f96e6da28 | ||
![]() |
01690ed2bc | ||
![]() |
2da89708ec | ||
![]() |
5c62a551c4 | ||
![]() |
602a8a565c | ||
![]() |
c4a8446c70 | ||
![]() |
456d8db35e | ||
![]() |
e952a7e710 | ||
![]() |
682f0840e7 | ||
![]() |
f85ec43f24 | ||
![]() |
b5713887ae |
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -1 +1,5 @@
|
||||
*.dsw -crlf
|
||||
buildconf eol=lf
|
||||
configure.ac eol=lf
|
||||
*.m4 eol=lf
|
||||
*.in eol=lf
|
||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@@ -42,3 +42,7 @@ TAGS
|
||||
*~
|
||||
aclocal.m4.bak
|
||||
CHANGES.dist
|
||||
.project
|
||||
.cproject
|
||||
.settings
|
||||
/[0-9]*.patch
|
||||
|
@@ -2,17 +2,19 @@
|
||||
# Adds OPENSSL_INCLUDE_DIRS and libeay32
|
||||
include("${CMAKE_ROOT}/Modules/FindOpenSSL.cmake")
|
||||
|
||||
# Bill Hoffman told that libeay32 is necessary for him:
|
||||
find_library(SSL_LIBEAY NAMES libeay32)
|
||||
# starting 2.8 it is better to use standard modules
|
||||
if(CMAKE_MAJOR_VERSION EQUAL "2" AND CMAKE_MINOR_VERSION LESS "8")
|
||||
# Bill Hoffman told that libeay32 is necessary for him:
|
||||
find_library(SSL_LIBEAY NAMES libeay32)
|
||||
|
||||
if(OPENSSL_FOUND)
|
||||
if(SSL_LIBEAY)
|
||||
list(APPEND OPENSSL_LIBRARIES ${SSL_LIBEAY})
|
||||
else()
|
||||
set(OPENSSL_FOUND FALSE)
|
||||
if(OPENSSL_FOUND)
|
||||
if(SSL_LIBEAY)
|
||||
list(APPEND OPENSSL_LIBRARIES ${SSL_LIBEAY})
|
||||
else()
|
||||
set(OPENSSL_FOUND FALSE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endif() # if (CMAKE_MAJOR_VERSION EQUAL "2" AND CMAKE_MINOR_VERSION LESS "8")
|
||||
|
||||
if(OPENSSL_FOUND)
|
||||
set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
|
||||
|
@@ -1,8 +1,10 @@
|
||||
# Locate zlib
|
||||
include("${CMAKE_ROOT}/Modules/FindZLIB.cmake")
|
||||
|
||||
find_library(ZLIB_LIBRARY_DEBUG NAMES zd zlibd zdlld zlib1d )
|
||||
|
||||
if(ZLIB_FOUND AND ZLIB_LIBRARY_DEBUG)
|
||||
set( ZLIB_LIBRARIES optimized "${ZLIB_LIBRARY}" debug ${ZLIB_LIBRARY_DEBUG})
|
||||
# starting 2.8 it is better to use standard modules
|
||||
if(CMAKE_MAJOR_VERSION EQUAL "2" AND CMAKE_MINOR_VERSION LESS "8")
|
||||
find_library(ZLIB_LIBRARY_DEBUG NAMES zd zlibd zdlld zlib1d )
|
||||
if(ZLIB_FOUND AND ZLIB_LIBRARY_DEBUG)
|
||||
set( ZLIB_LIBRARIES optimized "${ZLIB_LIBRARY}" debug ${ZLIB_LIBRARY_DEBUG})
|
||||
endif()
|
||||
endif()
|
||||
|
127
CMakeLists.txt
127
CMakeLists.txt
@@ -57,10 +57,6 @@ set(OS "\"${CMAKE_SYSTEM_NAME}\"")
|
||||
include_directories(${PROJECT_BINARY_DIR}/include/curl)
|
||||
include_directories( ${CURL_SOURCE_DIR}/include )
|
||||
|
||||
if(WIN32)
|
||||
set(NATIVE_WINDOWS ON)
|
||||
endif()
|
||||
|
||||
option(BUILD_CURL_EXE "Set to ON to build cURL executable." ON)
|
||||
option(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON)
|
||||
option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
|
||||
@@ -113,22 +109,11 @@ mark_as_advanced(CURL_DISABLE_HTTP)
|
||||
|
||||
option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
|
||||
mark_as_advanced(CURL_DISABLE_LDAPS)
|
||||
if(WIN32)
|
||||
set(CURL_DEFAULT_DISABLE_LDAP OFF)
|
||||
# some windows compilers do not have wldap32
|
||||
if( NOT HAVE_WLDAP32)
|
||||
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
|
||||
message(STATUS "wldap32 not found CURL_DISABLE_LDAP set ON")
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" OFF)
|
||||
else()
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" ON)
|
||||
endif()
|
||||
mark_as_advanced(CURL_LDAP_WIN)
|
||||
endif()
|
||||
|
||||
if(HTTP_ONLY)
|
||||
set(CURL_DISABLE_FTP ON)
|
||||
set(CURL_DISABLE_LDAP ON)
|
||||
set(CURL_DISABLE_LDAPS ON)
|
||||
set(CURL_DISABLE_TELNET ON)
|
||||
set(CURL_DISABLE_DICT ON)
|
||||
set(CURL_DISABLE_FILE ON)
|
||||
@@ -147,22 +132,6 @@ mark_as_advanced(DISABLED_THREADSAFE)
|
||||
option(ENABLE_IPV6 "Define if you want to enable IPv6 support" OFF)
|
||||
mark_as_advanced(ENABLE_IPV6)
|
||||
|
||||
if(WIN32)
|
||||
# Windows standard libraries are located in C:/Program Files/Microsoft SDKs/[...]
|
||||
# They are already included in the default MSVC LIBPATH => no find_library is needed!
|
||||
list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES wsock32.lib ws2_32.lib) # bufferoverflowu.lib
|
||||
if(CURL_DISABLE_LDAP)
|
||||
# Remove wldap32.lib from space-separated list
|
||||
string(REPLACE " " ";" _LIST ${CMAKE_C_STANDARD_LIBRARIES})
|
||||
list(REMOVE_ITEM _LIST "wldap32.lib")
|
||||
to_list_spaces(_LIST CMAKE_C_STANDARD_LIBRARIES)
|
||||
else()
|
||||
# Append wldap32.lib
|
||||
list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES wldap32.lib)
|
||||
endif()
|
||||
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
|
||||
# We need ansi c-flags, especially on HP
|
||||
set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
|
||||
@@ -221,6 +190,20 @@ check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32)
|
||||
check_library_exists_concat("winmm" getch HAVE_LIBWINMM)
|
||||
check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32)
|
||||
|
||||
if(WIN32)
|
||||
set(CURL_DEFAULT_DISABLE_LDAP OFF)
|
||||
# some windows compilers do not have wldap32
|
||||
if(NOT HAVE_WLDAP32)
|
||||
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
|
||||
message(STATUS "wldap32 not found CURL_DISABLE_LDAP set ON")
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" OFF)
|
||||
else()
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" ON)
|
||||
endif()
|
||||
mark_as_advanced(CURL_LDAP_WIN)
|
||||
endif()
|
||||
|
||||
|
||||
# IF(NOT CURL_SPECIAL_LIBZ)
|
||||
# CHECK_LIBRARY_EXISTS_CONCAT("z" inflateEnd HAVE_LIBZ)
|
||||
# ENDIF(NOT CURL_SPECIAL_LIBZ)
|
||||
@@ -250,26 +233,28 @@ if(CURL_ZLIB) # AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE
|
||||
set(HAVE_ZLIB_H ON)
|
||||
set(HAVE_ZLIB ON)
|
||||
set(HAVE_LIBZ ON)
|
||||
list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON)
|
||||
mark_as_advanced(CMAKE_USE_OPENSSL)
|
||||
if(CMAKE_USE_OPENSSL)
|
||||
if(WIN32)
|
||||
find_package(OpenSSL)
|
||||
if(OPENSSL_FOUND)
|
||||
set(USE_SSLEAY TRUE)
|
||||
set(USE_OPENSSL TRUE)
|
||||
list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES} )
|
||||
else()
|
||||
set(CMAKE_USE_OPENSSL FALSE)
|
||||
message(STATUS "OpenSSL NOT Found, disabling CMAKE_USE_OPENSSL")
|
||||
endif()
|
||||
else(WIN32)
|
||||
check_library_exists_concat("crypto" CRYPTO_lock HAVE_LIBCRYPTO)
|
||||
check_library_exists_concat("ssl" SSL_connect HAVE_LIBSSL)
|
||||
endif(WIN32)
|
||||
|
||||
set(USE_SSLEAY OFF)
|
||||
set(USE_OPENSSL OFF)
|
||||
set(HAVE_LIBCRYPTO OFF)
|
||||
set(HAVE_LIBSSL OFF)
|
||||
|
||||
find_package(OpenSSL)
|
||||
if(OPENSSL_FOUND)
|
||||
list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||
set(USE_SSLEAY ON)
|
||||
set(USE_OPENSSL ON)
|
||||
set(HAVE_LIBCRYPTO ON)
|
||||
set(HAVE_LIBSSL ON)
|
||||
endif(OPENSSL_FOUND)
|
||||
endif(CMAKE_USE_OPENSSL)
|
||||
|
||||
# If we have features.h, then do the _BSD_SOURCE magic
|
||||
@@ -335,14 +320,17 @@ check_include_file_concat("net/if.h" HAVE_NET_IF_H)
|
||||
check_include_file_concat("netdb.h" HAVE_NETDB_H)
|
||||
check_include_file_concat("netinet/in.h" HAVE_NETINET_IN_H)
|
||||
check_include_file_concat("netinet/tcp.h" HAVE_NETINET_TCP_H)
|
||||
check_include_file_concat("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
|
||||
check_include_file_concat("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
|
||||
check_include_file_concat("openssl/err.h" HAVE_OPENSSL_ERR_H)
|
||||
check_include_file_concat("openssl/pem.h" HAVE_OPENSSL_PEM_H)
|
||||
check_include_file_concat("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
|
||||
check_include_file_concat("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
|
||||
check_include_file_concat("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
|
||||
check_include_file_concat("openssl/x509.h" HAVE_OPENSSL_X509_H)
|
||||
if(CMAKE_USE_OPENSSL AND OPENSSL_FOUND)
|
||||
check_include_file_concat("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
|
||||
check_include_file_concat("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
|
||||
check_include_file_concat("openssl/err.h" HAVE_OPENSSL_ERR_H)
|
||||
check_include_file_concat("openssl/pem.h" HAVE_OPENSSL_PEM_H)
|
||||
check_include_file_concat("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
|
||||
check_include_file_concat("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
|
||||
check_include_file_concat("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
|
||||
check_include_file_concat("openssl/x509.h" HAVE_OPENSSL_X509_H)
|
||||
check_include_file_concat("openssl/rand.h" HAVE_OPENSSL_RAND_H)
|
||||
endif(CMAKE_USE_OPENSSL AND OPENSSL_FOUND)
|
||||
check_include_file_concat("pem.h" HAVE_PEM_H)
|
||||
check_include_file_concat("poll.h" HAVE_POLL_H)
|
||||
check_include_file_concat("pwd.h" HAVE_PWD_H)
|
||||
@@ -378,15 +366,18 @@ check_include_file_concat("sockio.h" HAVE_SOCKIO_H)
|
||||
check_include_file_concat("sys/utsname.h" HAVE_SYS_UTSNAME_H)
|
||||
check_include_file_concat("idna.h" HAVE_IDNA_H)
|
||||
|
||||
if(CMAKE_USE_OPENSSL)
|
||||
check_include_file_concat("openssl/rand.h" HAVE_OPENSSL_RAND_H)
|
||||
endif(CMAKE_USE_OPENSSL)
|
||||
|
||||
if(NOT HAVE_LDAP_H)
|
||||
message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON")
|
||||
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
|
||||
# No ldap, no ldaps.
|
||||
if(CURL_DISABLE_LDAP)
|
||||
if(NOT CURL_DISABLE_LDAPS)
|
||||
message(STATUS "LDAP needs to be enabled to support LDAPS")
|
||||
set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_type_size(size_t SIZEOF_SIZE_T)
|
||||
check_type_size(ssize_t SIZEOF_SSIZE_T)
|
||||
@@ -426,7 +417,7 @@ if(SIZEOF_LONG EQUAL 8)
|
||||
set(CURL_FORMAT_CURL_OFF_TU "lu")
|
||||
set(CURL_FORMAT_OFF_T "%ld")
|
||||
set(CURL_SUFFIX_CURL_OFF_T L)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU LU)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU UL)
|
||||
endif(SIZEOF_LONG EQUAL 8)
|
||||
|
||||
if(SIZEOF_LONG_LONG EQUAL 8)
|
||||
@@ -436,7 +427,7 @@ if(SIZEOF_LONG_LONG EQUAL 8)
|
||||
set(CURL_FORMAT_CURL_OFF_TU "llu")
|
||||
set(CURL_FORMAT_OFF_T "%lld")
|
||||
set(CURL_SUFFIX_CURL_OFF_T LL)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU LLU)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU ULL)
|
||||
endif(SIZEOF_LONG_LONG EQUAL 8)
|
||||
|
||||
if(NOT CURL_TYPEOF_CURL_OFF_T)
|
||||
@@ -810,9 +801,6 @@ endif(MSVC)
|
||||
function(SETUP_CURL_DEPENDENCIES TARGET_NAME)
|
||||
if(CURL_ZLIB AND ZLIB_FOUND)
|
||||
include_directories(${ZLIB_INCLUDE_DIR})
|
||||
endif()
|
||||
if(CURL_ZLIB AND ZLIB_FOUND)
|
||||
target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES})
|
||||
#ADD_DEFINITIONS( -DHAVE_ZLIB_H -DHAVE_ZLIB -DHAVE_LIBZ )
|
||||
endif()
|
||||
|
||||
@@ -820,9 +808,10 @@ function(SETUP_CURL_DEPENDENCIES TARGET_NAME)
|
||||
include_directories(${OPENSSL_INCLUDE_DIR})
|
||||
endif()
|
||||
if(CMAKE_USE_OPENSSL AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
|
||||
target_link_libraries(${TARGET_NAME} ${OPENSSL_LIBRARIES})
|
||||
#ADD_DEFINITIONS( -DUSE_SSLEAY )
|
||||
endif()
|
||||
|
||||
target_link_libraries(${TARGET_NAME} ${CURL_LIBS})
|
||||
endfunction()
|
||||
|
||||
# Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
|
||||
@@ -863,3 +852,13 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
|
||||
DESTINATION include
|
||||
FILES_MATCHING PATTERN "*.h"
|
||||
PATTERN "curlbuild.h" EXCLUDE)
|
||||
|
||||
|
||||
# Workaround for MSVS10 to avoid the Dialog Hell
|
||||
# FIXME: This could be removed with future version of CMake.
|
||||
if(MSVC_VERSION EQUAL 1600)
|
||||
set(CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln")
|
||||
if(EXISTS "${CURL_SLN_FILENAME}")
|
||||
file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n")
|
||||
endif()
|
||||
endif()
|
||||
|
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
||||
COPYRIGHT AND PERMISSION NOTICE
|
||||
|
||||
Copyright (c) 1996 - 2011, Daniel Stenberg, <daniel@haxx.se>.
|
||||
Copyright (c) 1996 - 2013, Daniel Stenberg, <daniel@haxx.se>.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
6
GIT-INFO
6
GIT-INFO
@@ -48,9 +48,9 @@ installed:
|
||||
o nroff + perl
|
||||
|
||||
If you don't have nroff and perl and you for some reason don't want to
|
||||
install them, you can rename the source file src/hugehelp.c.cvs to
|
||||
src/hugehelp.c and avoid having to generate this file. This will give you
|
||||
a stubbed version of the file that doesn't contain actual content.
|
||||
install them, you can rename the source file src/tool_hugehelp.c.cvs to
|
||||
src/tool_hugehelp.c and avoid having to generate this file. This will
|
||||
give you a stubbed version of the file that doesn't contain actual content.
|
||||
|
||||
MAC OS X
|
||||
|
||||
|
@@ -10,6 +10,10 @@
|
||||
# 10.5 is the *ONLY* SDK that support PPC64 :( -- 10.6 do not have ppc64 support
|
||||
#If you need to have PPC64 support then change below to 1
|
||||
PPC64_NEEDED=0
|
||||
# Apple does not support building for PPC anymore in Xcode 4 and later.
|
||||
# If you're using Xcode 3 or earlier and need PPC support, then change
|
||||
# the setting below to 1
|
||||
PPC_NEEDED=0
|
||||
|
||||
# For me the default is to develop for the platform I am on, and if you
|
||||
#desire compatibility with older versions then change USE_OLD to 1 :)
|
||||
@@ -24,9 +28,16 @@ FRAMEWORK_VERSION=Versions/Release-$VERSION
|
||||
# and setup the right paths to this version, leaving the system version
|
||||
# "intact", so you can "fix" it later with the links to Versions/A/...
|
||||
|
||||
|
||||
OLD_SDK=`ls /Developer/SDKs|head -1`
|
||||
NEW_SDK=`ls -r /Developer/SDKs|head -1`
|
||||
DEVELOPER_PATH=`xcode-select --print-path`
|
||||
# Around Xcode 4.3, SDKs were moved from the Developer folder into the
|
||||
# MacOSX.platform folder
|
||||
if test -d "$DEVELOPER_PATH/Platforms/MacOSX.platform/Developer/SDKs"; then
|
||||
SDK_PATH="$DEVELOPER_PATH/Platforms/MacOSX.platform/Developer/SDKs"
|
||||
else
|
||||
SDK_PATH="$DEVELOPER_PATH/SDKs";
|
||||
fi
|
||||
OLD_SDK=`ls $SDK_PATH|head -1`
|
||||
NEW_SDK=`ls -r $SDK_PATH|head -1`
|
||||
|
||||
if test "0"$USE_OLD -gt 0
|
||||
then
|
||||
@@ -37,21 +48,24 @@ fi
|
||||
|
||||
MACVER=`echo $SDK32|sed -e s/[a-zA-Z]//g -e s/.\$//`
|
||||
|
||||
SDK32_DIR='/Developer/SDKs/'$SDK32
|
||||
SDK32_DIR=$SDK_PATH/$SDK32
|
||||
MINVER32='-mmacosx-version-min='$MACVER
|
||||
ARCHES32='-arch i386 -arch ppc'
|
||||
|
||||
if test $PPC_NEEDED -gt 0; then
|
||||
ARCHES32='-arch i386 -arch ppc'
|
||||
else
|
||||
ARCHES32='-arch i386'
|
||||
fi
|
||||
|
||||
if test $PPC64_NEEDED -gt 0
|
||||
then
|
||||
SDK64=10.5
|
||||
ARCHES64='-arch x86_64 -arch ppc64'
|
||||
SDK64=`ls /Developer/SDKs|grep 10.5|head -1`
|
||||
SDK64=`ls $SDK_PATH|grep 10.5|head -1`
|
||||
else
|
||||
ARCHES64='-arch x86_64'
|
||||
#We "know" that 10.4 and earlier do not support 64bit
|
||||
OLD_SDK64=`ls /Developer/SDKs|egrep -v "10.[0-4]"|head -1`
|
||||
NEW_SDK64=`ls -r /Developer/SDKs|egrep -v "10.[0-4]"|head -1`
|
||||
OLD_SDK64=`ls $SDK_PATH|egrep -v "10.[0-4]"|head -1`
|
||||
NEW_SDK64=`ls -r $SDK_PATH|egrep -v "10.[0-4]"|head -1`
|
||||
if test $USE_OLD -gt 0
|
||||
then
|
||||
SDK64=$OLD_SDK64
|
||||
@@ -60,7 +74,7 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
SDK64_DIR='/Developer/SDKs/'$SDK64
|
||||
SDK64_DIR=$SDK_PATH/$SDK64
|
||||
MACVER64=`echo $SDK64|sed -e s/[a-zA-Z]//g -e s/.\$//`
|
||||
|
||||
MINVER64='-mmacosx-version-min='$MACVER64
|
||||
@@ -68,13 +82,13 @@ MINVER64='-mmacosx-version-min='$MACVER64
|
||||
if test ! -z $SDK32; then
|
||||
echo "----Configuring libcurl for 32 bit universal framework..."
|
||||
make clean
|
||||
./configure --disable-dependency-tracking --disable-static --with-gssapi \
|
||||
CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32 $MINVER32" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 $MINVER32 -Wl,-headerpad_max_install_names" \
|
||||
./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \
|
||||
CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 -Wl,-headerpad_max_install_names" \
|
||||
CC=$CC
|
||||
|
||||
echo "----Building 32 bit libcurl..."
|
||||
make
|
||||
make -j `sysctl -n hw.logicalcpu_max`
|
||||
|
||||
echo "----Creating 32 bit framework..."
|
||||
rm -r libcurl.framework
|
||||
@@ -89,21 +103,21 @@ if test ! -z $SDK32; then
|
||||
ln -fs ${FRAMEWORK_VERSION}/Resources Resources
|
||||
ln -fs ${FRAMEWORK_VERSION}/Headers Headers
|
||||
cd Versions
|
||||
ln -fs ${FRAMEWORK_VERSION} Current
|
||||
ln -fs $(basename "${FRAMEWORK_VERSION}") Current
|
||||
|
||||
echo TEsting for SDK64
|
||||
echo Testing for SDK64
|
||||
if test -d $SDK64_DIR; then
|
||||
echo entering...
|
||||
popd
|
||||
make clean
|
||||
echo "----Configuring libcurl for 64 bit universal framework..."
|
||||
./configure --disable-dependency-tracking --disable-static --with-gssapi \
|
||||
CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64 $MINVER64" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 $MINVER64 -Wl,-headerpad_max_install_names" \
|
||||
./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \
|
||||
CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 -Wl,-headerpad_max_install_names" \
|
||||
CC=$CC
|
||||
|
||||
echo "----Building 64 bit libcurl..."
|
||||
make
|
||||
make -j `sysctl -n hw.logicalcpu_max`
|
||||
|
||||
echo "----Appending 64 bit framework to 32 bit framework..."
|
||||
cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
|
||||
|
135
Makefile.am
135
Makefile.am
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -30,13 +30,38 @@ CMake/CurlTests.c CMake/FindOpenSSL.cmake CMake/FindZLIB.cmake \
|
||||
CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \
|
||||
CMake/Utilities.cmake include/curl/curlbuild.h.cmake
|
||||
|
||||
VC6LIBDSP = vs/vc6/lib/vc6libcurl.dsp
|
||||
VC6LIBDSPHEAD = vs/t/lib/vc6_libcurl_dsp.head
|
||||
VC6LIBDSPFOOT = vs/t/lib/vc6_libcurl_dsp.foot
|
||||
|
||||
VC8LIBPRJ = vs/vc8/lib/vc8libcurl.vcproj
|
||||
VC8LIBPRJHEAD = vs/t/lib/vc8_libcurl_prj.head
|
||||
VC8LIBPRJFOOT = vs/t/lib/vc8_libcurl_prj.foot
|
||||
|
||||
VC_DIST = \
|
||||
vs/t/README \
|
||||
$(VC6LIBDSP) $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \
|
||||
$(VC8LIBPRJ) $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \
|
||||
vs/vc6/vc6curl.dsw \
|
||||
vs/vc6/lib/vc6libcurl.dsw \
|
||||
vs/vc6/src/vc6curltool.dsw \
|
||||
vs/vc6/src/vc6curltool.dsp
|
||||
|
||||
VC6LIBDSP_DEPS = $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \
|
||||
Makefile.am lib/Makefile.inc
|
||||
|
||||
VC8LIBPRJ_DEPS = $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \
|
||||
Makefile.am lib/Makefile.inc
|
||||
|
||||
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
|
||||
winbuild/MakefileBuild.vc winbuild/Makefile.vc
|
||||
winbuild/MakefileBuild.vc winbuild/Makefile.vc \
|
||||
winbuild/Makefile.msvc.names
|
||||
|
||||
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
|
||||
curl-style.el sample.emacs RELEASE-NOTES buildconf \
|
||||
libcurl.pc.in vc6curl.dsw MacOSX-Framework Android.mk $(CMAKE_DIST) \
|
||||
Makefile.msvc.names $(WINBUILD_DIST) lib/libcurl.vers.in
|
||||
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
|
||||
$(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in
|
||||
|
||||
CLEANFILES = $(VC6LIBDSP) $(VC8LIBPRJ)
|
||||
|
||||
bin_SCRIPTS = curl-config
|
||||
|
||||
@@ -46,6 +71,12 @@ DIST_SUBDIRS = $(SUBDIRS) tests packages docs
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libcurl.pc
|
||||
|
||||
# List of libcurl source files required to generate VC IDE dsp and prj files
|
||||
include lib/Makefile.inc
|
||||
|
||||
WIN32SOURCES = $(CSOURCES)
|
||||
WIN32HEADERS = $(HHEADERS) config-win32.h
|
||||
|
||||
dist-hook:
|
||||
rm -rf $(top_builddir)/tests/log
|
||||
find $(distdir) -name "*.dist" -exec rm {} \;
|
||||
@@ -81,14 +112,21 @@ test-full:
|
||||
test-torture:
|
||||
@(cd tests; $(MAKE) all torture-test)
|
||||
|
||||
test-am:
|
||||
@(cd tests; $(MAKE) all am-test)
|
||||
|
||||
endif
|
||||
|
||||
examples:
|
||||
@(cd docs/examples; $(MAKE) check)
|
||||
|
||||
# This is a hook to have 'make clean' also clean up the docs and the tests
|
||||
# dir. The extra check for the Makefiles being present is necessary because
|
||||
# 'make distcheck' will make clean first in these directories _before_ it runs
|
||||
# this hook.
|
||||
clean-local:
|
||||
@(cd tests; $(MAKE) clean)
|
||||
@(cd docs; $(MAKE) clean)
|
||||
@(if test -f tests/Makefile; then cd tests; $(MAKE) clean; fi)
|
||||
@(if test -f docs/Makefile; then cd docs; $(MAKE) clean; fi)
|
||||
|
||||
#
|
||||
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
||||
@@ -159,3 +197,86 @@ ca-firefox: lib/firefox-db2pem.sh
|
||||
checksrc:
|
||||
cd lib && $(MAKE) checksrc
|
||||
cd src && $(MAKE) checksrc
|
||||
|
||||
.PHONY: vc6-ide
|
||||
|
||||
vc6-ide:
|
||||
$(MAKE) $(VC6LIBDSP)
|
||||
|
||||
$(VC6LIBDSP): $(VC6LIBDSP_DEPS)
|
||||
@(echo "generating '$(VC6LIBDSP)'"; \
|
||||
\
|
||||
for dir in 'vs' 'vs/vc6' 'vs/vc6/lib'; do \
|
||||
test -d "$$dir" || mkdir "$$dir" || exit 1; \
|
||||
done; \
|
||||
\
|
||||
dir='..\..\..\lib\'; \
|
||||
body='$(VC6LIBDSP)'.body; \
|
||||
win32_srcs='$(WIN32SOURCES)'; \
|
||||
win32_hdrs='$(WIN32HEADERS)'; \
|
||||
sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \
|
||||
sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \
|
||||
\
|
||||
echo "# Begin Group \"Source Files\"" > $$body; \
|
||||
echo "" >> $$body; \
|
||||
echo "# PROP Default_Filter \"\"" >> $$body; \
|
||||
for file in $$sorted_srcs; do \
|
||||
echo "# Begin Source File" >> $$body; \
|
||||
echo "" >> $$body; \
|
||||
echo "SOURCE="$$dir$$file >> $$body; \
|
||||
echo "# End Source File" >> $$body; \
|
||||
done; \
|
||||
echo "# End Group" >> $$body; \
|
||||
echo "# Begin Group \"Header Files\"" >> $$body; \
|
||||
echo "" >> $$body; \
|
||||
echo "# PROP Default_Filter \"\"" >> $$body; \
|
||||
for file in $$sorted_hdrs; do \
|
||||
echo "# Begin Source File" >> $$body; \
|
||||
echo "" >> $$body; \
|
||||
echo "SOURCE="$$dir$$file >> $$body; \
|
||||
echo "# End Source File" >> $$body; \
|
||||
done; \
|
||||
echo "# End Group" >> $$body; \
|
||||
\
|
||||
awk '{ printf("%s\r\n", $$0); }' \
|
||||
$(srcdir)/$(VC6LIBDSPHEAD) $$body $(srcdir)/$(VC6LIBDSPFOOT) \
|
||||
> $(VC6LIBDSP) || { rm -f $$body; exit 1; }; \
|
||||
\
|
||||
rm -f $$body)
|
||||
|
||||
.PHONY: vc8-ide
|
||||
|
||||
vc8-ide:
|
||||
$(MAKE) $(VC8LIBPRJ)
|
||||
|
||||
$(VC8LIBPRJ): $(VC8LIBPRJ_DEPS)
|
||||
@(echo "generating '$(VC8LIBPRJ)'"; \
|
||||
\
|
||||
for dir in 'vs' 'vs/vc8' 'vs/vc8/lib'; do \
|
||||
test -d "$$dir" || mkdir "$$dir" || exit 1; \
|
||||
done; \
|
||||
\
|
||||
dir='..\..\..\lib\'; \
|
||||
body='$(VC8LIBPRJ)'.body; \
|
||||
win32_srcs='$(WIN32SOURCES)'; \
|
||||
win32_hdrs='$(WIN32HEADERS)'; \
|
||||
sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \
|
||||
sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \
|
||||
\
|
||||
echo "%tab%%tab%<Filter Name=\"Source Files\">" > $$body; \
|
||||
for file in $$sorted_srcs; do \
|
||||
echo "%tab%%tab%%tab%<File RelativePath=\""$$dir$$file"\"></File>" >> $$body; \
|
||||
done; \
|
||||
echo "%tab%%tab%</Filter>" >> $$body; \
|
||||
echo "%tab%%tab%<Filter Name=\"Header Files\">" >> $$body; \
|
||||
for file in $$sorted_hdrs; do \
|
||||
echo "%tab%%tab%%tab%<File RelativePath=\""$$dir$$file"\"></File>" >> $$body; \
|
||||
done; \
|
||||
echo "%tab%%tab%</Filter>" >> $$body; \
|
||||
\
|
||||
awk '{ gsub(/%tab%/, "\t"); printf("%s\r\n", $$0); }' \
|
||||
$(srcdir)/$(VC8LIBPRJHEAD) $$body $(srcdir)/$(VC8LIBPRJFOOT) \
|
||||
> $(VC8LIBPRJ) || { rm -f $$body; exit 1; }; \
|
||||
\
|
||||
rm -f $$body)
|
||||
|
||||
|
@@ -148,12 +148,24 @@ vc-ssl-zlib: $(VC)
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
|
||||
vc-winssl-zlib: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-winssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-winssl-zlib
|
||||
|
||||
vc-x64-ssl-zlib: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
|
||||
|
||||
vc-x64-winssl-zlib: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib
|
||||
|
||||
vc-ssl-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
|
157
RELEASE-NOTES
157
RELEASE-NOTES
@@ -1,49 +1,68 @@
|
||||
Curl and libcurl 7.25.0
|
||||
Curl and libcurl 7.33.0
|
||||
|
||||
Public curl releases: 127
|
||||
Command line options: 151
|
||||
curl_easy_setopt() options: 199
|
||||
Public curl releases: 135
|
||||
Command line options: 161
|
||||
curl_easy_setopt() options: 205
|
||||
Public functions in libcurl: 58
|
||||
Known libcurl bindings: 39
|
||||
Contributors: 929
|
||||
Known libcurl bindings: 42
|
||||
Contributors: 1057
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o configure: add option disable --libcurl output [1]
|
||||
o --ssl-allow-beast and CURLOPT_SSL_OPTIONS added [2]
|
||||
o Added CURLOPT_TCP_KEEPALIVE, CURLOPT_TCP_KEEPIDLE, CURLOPT_TCP_KEEPINTVL [4]
|
||||
o curl: use new library-side TCP_KEEPALIVE options [5]
|
||||
o Added a new CURLOPT_MAIL_AUTH option [13]
|
||||
o Added support for --mail-auth [14]
|
||||
o --libcurl now also works with -F and more! [15]
|
||||
o test code for testing the event based API [3]
|
||||
o CURLM_ADDED_ALREADY: new error code
|
||||
o test TFTP server: support "writedelay" within <servercmd>
|
||||
o krb4 support has been removed
|
||||
o imap/pop3/smtp: added basic SASL XOAUTH2 support [9]
|
||||
o darwinssl: add support for PKCS#12 files for client authentication
|
||||
o darwinssl: enable BEAST workaround on iOS 7 & later
|
||||
o Pass password to OpenSSL engine by user interface [15]
|
||||
o c-ares: Add support for various DNS binding options
|
||||
o cookies: add expiration
|
||||
o curl: added --oauth2-bearer option
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o --max-redirs: allow negative numbers as option value [3]
|
||||
o parse_proxy: bail out on zero-length proxy names [6]
|
||||
o configure: don't modify LD_LIBRARY_PATH for cross compiles [7]
|
||||
o curl_easy_reset: reset the referer string [8]
|
||||
o curl tool: don't abort glob-loop due to failures [9]
|
||||
o CONNECT: send correct Host: with IPv6 numerical address [10]
|
||||
o Explicitly link to the nettle/gcrypt libraries [11]
|
||||
o more resilient connection times among IP addresses [12]
|
||||
o winbuild: fix IPV6 and IDN options
|
||||
o SMTP: Fixed error when using CURLOPT_CONNECT_ONLY
|
||||
o cyassl: update to CyaSSL 2.0.x API
|
||||
o smtp: Fixed an issue with the EOB checking
|
||||
o pop3: Fixed drop of final CRLF in EOB checking [16]
|
||||
o smtp: Fixed an issue with writing postdata
|
||||
o smtp: Added support for returning SMTP response codes
|
||||
o CONNECT: fix ipv6 address in the Request-Line [17]
|
||||
o curl-config: only provide libraries with --libs
|
||||
o LWIP: don't consider HAVE_ERRNO_H to be winsock [19]
|
||||
o ssh: tunnel through HTTP proxy if requested
|
||||
o cookies: strip off [brackets] from numerical ipv6 host names [20]
|
||||
o libcurl docs: version corrections [18]
|
||||
o cmake: list_spaces_append_once failure [22]
|
||||
o resolve with c-ares: don't resolve IPv6 when not working [21]
|
||||
o smtp: changed error code for EHLO and HELO responses
|
||||
o parsedate: fix a numeric overflow
|
||||
o nss: make sure that NSS is initialized
|
||||
o curl: make --no-[option] work properly for several options
|
||||
o FTP: with socket_action send better socket updates in active mode [1]
|
||||
o curl: fix the --sasl-ir in the --help output
|
||||
o tests 2032, 2033: Don't hardcode port in expected output
|
||||
o urlglob: better detect unclosed braces, empty lists and overflows [7]
|
||||
o urlglob: error out on range overflow [8]
|
||||
o imap: Fixed response check for SEARCH, EXPUNGE, LSUB, UID and NOOP commands [10]
|
||||
o handle arbitrary-length username and password [2]
|
||||
o TFTP: make the CURLOPT_LOW_SPEED* options work [4]
|
||||
o curl.h: name space pollution by "enum type" [5]
|
||||
o multi: move on from STATE_DONE faster [6]
|
||||
o FTP: 60 secs delay if aborted in the CURLOPT_HEADERFUNCTION callback [11]
|
||||
o multi_socket: improved 100-continue timeout handling
|
||||
o curl_multi_remove_handle: allow multiple removes
|
||||
o FTP: fix getsock during DO_MORE state [12]
|
||||
o -x: rephrased the --proxy section somewhat
|
||||
o acinclude: fix --without-ca-path when cross-compiling [13]
|
||||
o LDAP: fix bad free() when URL parsing failed [14]
|
||||
o --data: mention CRLF treatment when reading from file
|
||||
o curl_easy_pause: suggest one way to unpause
|
||||
o imap: Fixed calculation of transfer when partial FETCH received [16]
|
||||
o pingpong: Check SSL library buffers for already read data [16]
|
||||
o imap/pop3/smtp: Speed up SSL connection initialization
|
||||
o libcurl.3: for multi interface connections are held in the multi handle
|
||||
o curl_easy_setopt.3: mention RTMP URL quirks [17]
|
||||
o curl.1: detail how short/long options work [18]
|
||||
o curl.1: Added information about optional login options to --user option
|
||||
o curl: Added clarification to the --mail options in the --help output
|
||||
o curl_easy_setopt.3: clarify that TIMEOUT and TIMEOUT_MS set the same value
|
||||
o openssl: use correct port number in error message [19]
|
||||
o darwinssl: block TLS_RSA_WITH_NULL_SHA256 cipher
|
||||
o OpenSSL: acknowledge CURLOPT_SSL_VERIFYHOST without VERIFYPEER
|
||||
o xattr: add support for FreeBSD xattr API
|
||||
o win32: fix Visual Studio 2010 build with WINVER >= 0x600 [22]
|
||||
o configure: use icc options without space [21]
|
||||
o test1112: Increase the timeout from 7s to 16s [20]
|
||||
o SCP: upload speed on a fast connection limited to 16384 B/s
|
||||
o curl_setup_once: fix errno access for lwip on Windows [24]
|
||||
o HTTP: Output http response 304 when modified time is too old [23]
|
||||
|
||||
This release includes the following known bugs:
|
||||
|
||||
@@ -52,35 +71,41 @@ This release includes the following known bugs:
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Colin Hogben, Alessandro Ghedini, Kamil Dudka, Rob Ward, Dave Reisner,
|
||||
Martin Storsjo, Pierre Ynard, Pierre Joye, Yang Tse, Dan Fandrich,
|
||||
Michael Day, Juan Barreto, Chandrakant Bagul, Steve Holme, Todd Ouska,
|
||||
Rich Gray, John Joseph Bachir, Armel Asselin, Andrei Cipu,
|
||||
Maxim Prohorov
|
||||
|
||||
Alex McLellan, Bill Doyle, Colby Ranger, Fabian Keil, Gisle Vanem,
|
||||
John E. Malmberg, Jonathan Nieder, Kamil Dudka, Shawn Landden,
|
||||
Tor Arntsen, Will Dietz, Yi Huang, Kyle L. Huff, Steve Holme, Mike Mio,
|
||||
Stefan Neis, Nick Zitzmann, Geoff Beier, John Dunn, Jiri Hruska,
|
||||
Tomas Mlcoch, Kim Vandry, Ben Greear, Gorilla Maguila, Jerry Krinock,
|
||||
Yamada Yasuharu, Gordon Marler, Dave Thompson, D. Flinkmann,
|
||||
Benoit Sigoure, Clemens Gruber, Guenter Knauf, Petr Pisar, Elmira A Semenova,
|
||||
Francois Charlier, Ishan SinghLevett, Marcel Raad, Ulf Samuelsson,
|
||||
Andrej E Baranov, Derek Higgins, Heinrich Schaefer
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
||||
References to bug reports and discussions on issues:
|
||||
|
||||
[1] = http://curl.haxx.se/mail/lib-2012-02/0009.html
|
||||
[2] = http://curl.haxx.se/mail/lib-2012-02/0001.html
|
||||
[3] = http://curl.haxx.se/mail/lib-2012-02/0098.html
|
||||
[4] = http://curl.haxx.se/mail/lib-2012-01/0264.html
|
||||
[5] = http://curl.haxx.se/mail/lib-2012-01/0263.html
|
||||
[6] = http://curl.haxx.se/mail/lib-2012-02/0000.html
|
||||
[7] = http://curl.haxx.se/mail/lib-2012-02/0052.html
|
||||
[8] = http://curl.haxx.se/bug/view.cgi?id=3481551
|
||||
[9] = http://curl.haxx.se/bug/view.cgi?id=3481223
|
||||
[10] = http://curl.haxx.se/bug/view.cgi?id=3482093
|
||||
[11] = http://curl.haxx.se/mail/lib-2012-01/0303.html
|
||||
[12] = http://curl.haxx.se/mail/lib-2012-01/0190.html
|
||||
[13] = http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTMAILAUTH
|
||||
[14] = http://curl.haxx.se/docs/manpage.html#--mail-auth
|
||||
[15] = http://curl.haxx.se/docs/manpage.html#--libcurl
|
||||
[16] = http://curl.haxx.se/mail/lib-2012-02/0051.html
|
||||
[17] = http://curl.haxx.se/bug/view.cgi?id=3493129
|
||||
[18] = http://curl.haxx.se/bug/view.cgi?id=3494091
|
||||
[19] = http://curl.haxx.se/mail/lib-2012-03/0046.html
|
||||
[20] = http://curl.haxx.se/mail/lib-2012-03/0036.html
|
||||
[21] = http://curl.haxx.se/mail/lib-2012-03/0045.html
|
||||
[22] = http://curl.haxx.se/bug/view.cgi?id=3494968
|
||||
[1] = http://curl.haxx.se/mail/lib-2013-08/0043.html
|
||||
[2] = http://bugs.debian.org/719856
|
||||
[3] = http://daniel.haxx.se/blog/2013/08/20/testing-curl_multi_socket_action/
|
||||
[4] = http://curl.haxx.se/bug/view.cgi?id=1269
|
||||
[5] = https://github.com/bagder/curl/pull/76
|
||||
[6] = http://curl.haxx.se/mail/lib-2013-08/0211.html
|
||||
[7] = http://curl.haxx.se/bug/view.cgi?id=1264
|
||||
[8] = http://curl.haxx.se/bug/view.cgi?id=1267
|
||||
[9] = http://curl.haxx.se/mail/lib-2013-08/0234.html
|
||||
[10] = http://curl.haxx.se/mail/lib-2013-08/0136.html
|
||||
[11] = https://bugzilla.redhat.com/1005686
|
||||
[12] = http://curl.haxx.se/mail/lib-2013-08/0109.html
|
||||
[13] = http://curl.haxx.se/bug/view.cgi?id=1273
|
||||
[14] = http://curl.haxx.se/mail/lib-2013-08/0209.html
|
||||
[15] = http://curl.haxx.se/mail/lib-2013-08/0265.html
|
||||
[16] = http://curl.haxx.se/mail/lib-2013-08/0170.html
|
||||
[17] = http://curl.haxx.se/bug/view.cgi?id=1278
|
||||
[18] = http://curl.haxx.se/bug/view.cgi?id=1279
|
||||
[19] = http://curl.haxx.se/bug/view.cgi?id=1281
|
||||
[20] = http://curl.haxx.se/mail/lib-2010-02/0200.html
|
||||
[21] = http://curl.haxx.se/mail/lib-2013-09/0182.html
|
||||
[22] = http://curl.haxx.se/bug/view.cgi?id=1282
|
||||
[23] = http://curl.haxx.se/bug/view.cgi?id=1288
|
||||
[24] = http://curl.haxx.se/mail/lib-2013-10/0048.html
|
||||
|
17
TODO-RELEASE
17
TODO-RELEASE
@@ -1,15 +1,4 @@
|
||||
To be addressed in 7.24.1
|
||||
=========================
|
||||
To be addressed in ...
|
||||
=======================
|
||||
|
||||
295 - "RTSP Authentication (#22)" https://github.com/bagder/curl/pull/22
|
||||
|
||||
296 - "OOM leak in multi code" (by Dan Fandrich)
|
||||
|
||||
300 - "Polling on stray socket on sequential transfers." Andrew S
|
||||
http://curl.haxx.se/mail/lib-2011-07/0053.html
|
||||
|
||||
308 - Revisit option --enable-threaded-resolver at least allow selection among
|
||||
pthreads and Windows threads when building a Windows target.
|
||||
http://curl.haxx.se/mail/lib-2012-01/0291.html
|
||||
|
||||
309 -
|
||||
327 -
|
||||
|
343
acinclude.m4
343
acinclude.m4
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -130,7 +130,7 @@ int main (void)
|
||||
]])
|
||||
],[
|
||||
tst_lib_xnet_required="yes"
|
||||
LIBS="$LIBS -lxnet"
|
||||
LIBS="-lxnet $LIBS"
|
||||
])
|
||||
AC_MSG_RESULT([$tst_lib_xnet_required])
|
||||
])
|
||||
@@ -150,6 +150,7 @@ AC_DEFUN([CURL_CHECK_AIX_ALL_SOURCE], [
|
||||
#endif])
|
||||
AC_BEFORE([$0], [AC_SYS_LARGEFILE])dnl
|
||||
AC_BEFORE([$0], [CURL_CONFIGURE_REENTRANT])dnl
|
||||
AC_BEFORE([$0], [CURL_CONFIGURE_PULL_SYS_POLL])dnl
|
||||
AC_MSG_CHECKING([if OS is AIX (to define _ALL_SOURCE)])
|
||||
AC_EGREP_CPP([yes_this_is_aix],[
|
||||
#ifdef _AIX
|
||||
@@ -228,12 +229,7 @@ AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
|
||||
])
|
||||
fi
|
||||
])
|
||||
case "$ac_cv_native_windows" in
|
||||
yes)
|
||||
AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
|
||||
[Define to 1 if you are building a native Windows target.])
|
||||
;;
|
||||
esac
|
||||
AM_CONDITIONAL(DOING_NATIVE_WINDOWS, test "x$ac_cv_native_windows" = xyes)
|
||||
])
|
||||
|
||||
|
||||
@@ -1601,213 +1597,6 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_FUNC_RECVFROM
|
||||
dnl -------------------------------------------------
|
||||
dnl Test if the socket recvfrom() function is available,
|
||||
dnl and check its return type and the types of its
|
||||
dnl arguments. If the function succeeds HAVE_RECVFROM
|
||||
dnl will be defined, defining the types of the arguments
|
||||
dnl in RECVFROM_TYPE_ARG1, RECVFROM_TYPE_ARG2, and so on
|
||||
dnl to RECVFROM_TYPE_ARG6, defining also the type of the
|
||||
dnl function return value in RECVFROM_TYPE_RETV.
|
||||
dnl Notice that the types returned for pointer arguments
|
||||
dnl will actually be the type pointed by the pointer.
|
||||
|
||||
AC_DEFUN([CURL_CHECK_FUNC_RECVFROM], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||
AC_CHECK_HEADERS(sys/types.h sys/socket.h)
|
||||
#
|
||||
AC_MSG_CHECKING([for recvfrom])
|
||||
AC_LINK_IFELSE([
|
||||
AC_LANG_PROGRAM([[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#endif
|
||||
]],[[
|
||||
recvfrom(0, 0, 0, 0, 0, 0);
|
||||
]])
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_recvfrom="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
curl_cv_recvfrom="no"
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_recvfrom" = "yes"; then
|
||||
AC_CACHE_CHECK([types of args and return type for recvfrom],
|
||||
[curl_cv_func_recvfrom_args], [
|
||||
curl_cv_func_recvfrom_args="unknown"
|
||||
for recvfrom_retv in 'int' 'ssize_t'; do
|
||||
for recvfrom_arg1 in 'int' 'ssize_t' 'SOCKET'; do
|
||||
for recvfrom_arg2 in 'char *' 'void *'; do
|
||||
for recvfrom_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
|
||||
for recvfrom_arg4 in 'int' 'unsigned int'; do
|
||||
for recvfrom_arg5 in 'struct sockaddr *' 'void *' 'const struct sockaddr *'; do
|
||||
for recvfrom_arg6 in 'socklen_t *' 'int *' 'unsigned int *' 'size_t *' 'void *'; do
|
||||
if test "$curl_cv_func_recvfrom_args" = "unknown"; then
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#define RECVFROMCALLCONV PASCAL
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#define RECVFROMCALLCONV
|
||||
#endif
|
||||
extern $recvfrom_retv RECVFROMCALLCONV
|
||||
recvfrom($recvfrom_arg1, $recvfrom_arg2,
|
||||
$recvfrom_arg3, $recvfrom_arg4,
|
||||
$recvfrom_arg5, $recvfrom_arg6);
|
||||
]],[[
|
||||
$recvfrom_arg1 s=0;
|
||||
$recvfrom_arg2 buf=0;
|
||||
$recvfrom_arg3 len=0;
|
||||
$recvfrom_arg4 flags=0;
|
||||
$recvfrom_arg5 addr=0;
|
||||
$recvfrom_arg6 addrlen=0;
|
||||
$recvfrom_retv res=0;
|
||||
res = recvfrom(s, buf, len, flags, addr, addrlen);
|
||||
]])
|
||||
],[
|
||||
curl_cv_func_recvfrom_args="$recvfrom_arg1,$recvfrom_arg2,$recvfrom_arg3,$recvfrom_arg4,$recvfrom_arg5,$recvfrom_arg6,$recvfrom_retv"
|
||||
])
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
]) # AC-CACHE-CHECK
|
||||
# Nearly last minute change for this release starts here
|
||||
AC_DEFINE_UNQUOTED(HAVE_RECVFROM, 1,
|
||||
[Define to 1 if you have the recvfrom function.])
|
||||
ac_cv_func_recvfrom="yes"
|
||||
# Nearly last minute change for this release ends here
|
||||
if test "$curl_cv_func_recvfrom_args" = "unknown"; then
|
||||
AC_MSG_WARN([Cannot find proper types to use for recvfrom args])
|
||||
else
|
||||
recvfrom_prev_IFS=$IFS; IFS=','
|
||||
set dummy `echo "$curl_cv_func_recvfrom_args" | sed 's/\*/\*/g'`
|
||||
IFS=$recvfrom_prev_IFS
|
||||
shift
|
||||
#
|
||||
recvfrom_ptrt_arg2=$[2]
|
||||
recvfrom_qual_ptrt_arg5=$[5]
|
||||
recvfrom_ptrt_arg6=$[6]
|
||||
#
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG1, $[1],
|
||||
[Define to the type of arg 1 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG3, $[3],
|
||||
[Define to the type of arg 3 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG4, $[4],
|
||||
[Define to the type of arg 4 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_RETV, $[7],
|
||||
[Define to the function return type for recvfrom.])
|
||||
#
|
||||
prev_sh_opts=$-
|
||||
#
|
||||
case $prev_sh_opts in
|
||||
*f*)
|
||||
;;
|
||||
*)
|
||||
set -f
|
||||
;;
|
||||
esac
|
||||
#
|
||||
case "$recvfrom_qual_ptrt_arg5" in
|
||||
const*)
|
||||
recvfrom_qual_arg5=const
|
||||
recvfrom_ptrt_arg5=`echo $recvfrom_qual_ptrt_arg5 | sed 's/^const //'`
|
||||
;;
|
||||
*)
|
||||
recvfrom_qual_arg5=
|
||||
recvfrom_ptrt_arg5=$recvfrom_qual_ptrt_arg5
|
||||
;;
|
||||
esac
|
||||
#
|
||||
recvfrom_type_arg2=`echo $recvfrom_ptrt_arg2 | sed 's/ \*//'`
|
||||
recvfrom_type_arg5=`echo $recvfrom_ptrt_arg5 | sed 's/ \*//'`
|
||||
recvfrom_type_arg6=`echo $recvfrom_ptrt_arg6 | sed 's/ \*//'`
|
||||
#
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG2, $recvfrom_type_arg2,
|
||||
[Define to the type pointed by arg 2 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_QUAL_ARG5, $recvfrom_qual_arg5,
|
||||
[Define to the type qualifier pointed by arg 5 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG5, $recvfrom_type_arg5,
|
||||
[Define to the type pointed by arg 5 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG6, $recvfrom_type_arg6,
|
||||
[Define to the type pointed by arg 6 for recvfrom.])
|
||||
#
|
||||
if test "$recvfrom_type_arg2" = "void"; then
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG2_IS_VOID, 1,
|
||||
[Define to 1 if the type pointed by arg 2 for recvfrom is void.])
|
||||
fi
|
||||
if test "$recvfrom_type_arg5" = "void"; then
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG5_IS_VOID, 1,
|
||||
[Define to 1 if the type pointed by arg 5 for recvfrom is void.])
|
||||
fi
|
||||
if test "$recvfrom_type_arg6" = "void"; then
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG6_IS_VOID, 1,
|
||||
[Define to 1 if the type pointed by arg 6 for recvfrom is void.])
|
||||
fi
|
||||
#
|
||||
case $prev_sh_opts in
|
||||
*f*)
|
||||
;;
|
||||
*)
|
||||
set +f
|
||||
;;
|
||||
esac
|
||||
#
|
||||
AC_DEFINE_UNQUOTED(HAVE_RECVFROM, 1,
|
||||
[Define to 1 if you have the recvfrom function.])
|
||||
ac_cv_func_recvfrom="yes"
|
||||
fi
|
||||
else
|
||||
AC_MSG_WARN([Unable to link function recvfrom])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_MSG_NOSIGNAL
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for MSG_NOSIGNAL
|
||||
@@ -2158,7 +1947,6 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
|
||||
else
|
||||
LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS"
|
||||
fi
|
||||
CURL_LIBS="$CURL_LIBS $curl_cv_gclk_LIBS"
|
||||
AC_MSG_RESULT([$curl_cv_gclk_LIBS])
|
||||
ac_cv_func_clock_gettime="yes"
|
||||
;;
|
||||
@@ -2315,6 +2103,8 @@ AC_DEFUN([CURL_CONFIGURE_CURL_SOCKLEN_T], [
|
||||
AC_REQUIRE([CURL_INCLUDES_SYS_SOCKET])dnl
|
||||
AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
|
||||
#
|
||||
AC_BEFORE([$0], [CURL_CONFIGURE_PULL_SYS_POLL])dnl
|
||||
#
|
||||
AC_MSG_CHECKING([for curl_socklen_t data type])
|
||||
curl_typeof_curl_socklen_t="unknown"
|
||||
for arg1 in int SOCKET; do
|
||||
@@ -2423,6 +2213,45 @@ AC_DEFUN([CURL_CONFIGURE_CURL_SOCKLEN_T], [
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CONFIGURE_PULL_SYS_POLL
|
||||
dnl -------------------------------------------------
|
||||
dnl Find out if system header file sys/poll.h must be included by the
|
||||
dnl external interface, making appropriate definitions for template file
|
||||
dnl include/curl/curlbuild.h.in to properly configure and use the library.
|
||||
dnl
|
||||
dnl The need for the sys/poll.h inclusion arises mainly to properly
|
||||
dnl interface AIX systems which define macros 'events' and 'revents'.
|
||||
|
||||
AC_DEFUN([CURL_CONFIGURE_PULL_SYS_POLL], [
|
||||
AC_REQUIRE([CURL_INCLUDES_POLL])dnl
|
||||
#
|
||||
tst_poll_events_macro_defined="unknown"
|
||||
#
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([[
|
||||
$curl_includes_poll
|
||||
]],[[
|
||||
#if defined(events) || defined(revents)
|
||||
return 0;
|
||||
#else
|
||||
force compilation error
|
||||
#endif
|
||||
]])
|
||||
],[
|
||||
tst_poll_events_macro_defined="yes"
|
||||
],[
|
||||
tst_poll_events_macro_defined="no"
|
||||
])
|
||||
#
|
||||
if test "$tst_poll_events_macro_defined" = "yes"; then
|
||||
if test "x$ac_cv_header_sys_poll_h" = "xyes"; then
|
||||
CURL_DEFINE_UNQUOTED([CURL_PULL_SYS_POLL_H])
|
||||
fi
|
||||
fi
|
||||
#
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_FUNC_SELECT
|
||||
dnl -------------------------------------------------
|
||||
dnl Test if the socket select() function is available,
|
||||
@@ -2791,46 +2620,50 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
|
||||
capath="$want_capath"
|
||||
ca="no"
|
||||
else
|
||||
dnl neither of --with-ca-* given
|
||||
dnl first try autodetecting a CA bundle , then a CA path
|
||||
dnl both autodetections can be skipped by --without-ca-*
|
||||
ca="no"
|
||||
capath="no"
|
||||
if test "x$want_ca" = "xunset"; then
|
||||
dnl the path we previously would have installed the curl ca bundle
|
||||
dnl to, and thus we now check for an already existing cert in that place
|
||||
dnl in case we find no other
|
||||
if test "x$prefix" != xNONE; then
|
||||
cac="${prefix}/share/curl/curl-ca-bundle.crt"
|
||||
else
|
||||
cac="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
|
||||
fi
|
||||
if test "x$cross_compiling" != "xyes"; then
|
||||
dnl NOT cross-compiling and...
|
||||
dnl neither of the --with-ca-* options are provided
|
||||
if test "x$want_ca" = "xunset"; then
|
||||
dnl the path we previously would have installed the curl ca bundle
|
||||
dnl to, and thus we now check for an already existing cert in that
|
||||
dnl place in case we find no other
|
||||
if test "x$prefix" != xNONE; then
|
||||
cac="${prefix}/share/curl/curl-ca-bundle.crt"
|
||||
else
|
||||
cac="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
|
||||
fi
|
||||
|
||||
for a in /etc/ssl/certs/ca-certificates.crt \
|
||||
/etc/pki/tls/certs/ca-bundle.crt \
|
||||
/usr/share/ssl/certs/ca-bundle.crt \
|
||||
/usr/local/share/certs/ca-root.crt \
|
||||
/etc/ssl/cert.pem \
|
||||
"$cac"; do
|
||||
if test -f "$a"; then
|
||||
ca="$a"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \
|
||||
"x$OPENSSL_ENABLED" = "x1"; then
|
||||
for a in /etc/ssl/certs/; do
|
||||
if test -d "$a" && ls "$a"/[[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]].0 >/dev/null 2>/dev/null; then
|
||||
capath="$a"
|
||||
break
|
||||
fi
|
||||
done
|
||||
for a in /etc/ssl/certs/ca-certificates.crt \
|
||||
/etc/pki/tls/certs/ca-bundle.crt \
|
||||
/usr/share/ssl/certs/ca-bundle.crt \
|
||||
/usr/local/share/certs/ca-root.crt \
|
||||
/etc/ssl/cert.pem \
|
||||
"$cac"; do
|
||||
if test -f "$a"; then
|
||||
ca="$a"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \
|
||||
"x$OPENSSL_ENABLED" = "x1"; then
|
||||
for a in /etc/ssl/certs/; do
|
||||
if test -d "$a" && ls "$a"/[[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]].0 >/dev/null 2>/dev/null; then
|
||||
capath="$a"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
dnl no option given and cross-compiling
|
||||
AC_MSG_WARN([skipped the ca-cert path detection when cross-compiling])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if test "x$ca" != "xno"; then
|
||||
CURL_CA_BUNDLE='"'$ca'"'
|
||||
AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle])
|
||||
@@ -3220,8 +3053,8 @@ AC_DEFUN([CURL_EXPORT_PCDIR], [
|
||||
|
||||
dnl CURL_CHECK_PKGCONFIG ($module, [$pcdir])
|
||||
dnl ------------------------
|
||||
dnl search for the pkg-config tool (if not cross-compiling). Set the PKGCONFIG
|
||||
dnl variable to hold the path to it, or 'no' if not found/present.
|
||||
dnl search for the pkg-config tool. Set the PKGCONFIG variable to hold the
|
||||
dnl path to it, or 'no' if not found/present.
|
||||
dnl
|
||||
dnl If pkg-config is present, check that it has info about the $module or
|
||||
dnl return "no" anyway!
|
||||
@@ -3233,15 +3066,7 @@ AC_DEFUN([CURL_CHECK_PKGCONFIG], [
|
||||
|
||||
PKGCONFIG="no"
|
||||
|
||||
if test x$cross_compiling = xyes; then
|
||||
dnl see if there's a pkg-specific for this host setup
|
||||
AC_PATH_PROG( PKGCONFIG, ${host}-pkg-config, no,
|
||||
$PATH:/usr/bin:/usr/local/bin)
|
||||
fi
|
||||
|
||||
if test x$PKGCONFIG = xno; then
|
||||
AC_PATH_PROG( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
|
||||
fi
|
||||
AC_PATH_TOOL( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
|
||||
|
||||
if test x$PKGCONFIG != xno; then
|
||||
AC_MSG_CHECKING([for $1 options with pkg-config])
|
||||
|
@@ -6,7 +6,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -384,9 +384,6 @@ $PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
|
||||
echo "buildconf: running autoheader"
|
||||
${AUTOHEADER:-autoheader} || die "autoheader command failed"
|
||||
|
||||
echo "buildconf: cp lib/curl_config.h.in src/curl_config.h.in"
|
||||
cp lib/curl_config.h.in src/curl_config.h.in
|
||||
|
||||
echo "buildconf: running autoconf"
|
||||
${AUTOCONF:-autoconf} || die "autoconf command failed"
|
||||
|
||||
|
@@ -12,9 +12,9 @@ ECHO ERROR: This file shall only be used with a curl git tree checkout.
|
||||
goto end_all
|
||||
:start_doing
|
||||
|
||||
REM create hugehelp.c
|
||||
if not exist src\hugehelp.c.cvs goto end_hugehelp_c
|
||||
copy /Y src\hugehelp.c.cvs src\hugehelp.c
|
||||
REM create tool_hugehelp.c
|
||||
if not exist src\tool_hugehelp.c.cvs goto end_hugehelp_c
|
||||
copy /Y src\tool_hugehelp.c.cvs src\tool_hugehelp.c
|
||||
:end_hugehelp_c
|
||||
|
||||
REM create Makefile
|
||||
@@ -27,11 +27,6 @@ if not exist include\curl\curlbuild.h.dist goto end_curlbuild_h
|
||||
copy /Y include\curl\curlbuild.h.dist include\curl\curlbuild.h
|
||||
:end_curlbuild_h
|
||||
|
||||
REM create src\config-win32.h
|
||||
if not exist lib\config-win32.h goto end_config_win32_h
|
||||
copy /Y lib\config-win32.h src\config-win32.h
|
||||
:end_config_win32_h
|
||||
|
||||
REM setup c-ares git tree
|
||||
if not exist ares\buildconf.bat goto end_c_ares
|
||||
cd ares
|
||||
|
1082
configure.ac
1082
configure.ac
File diff suppressed because it is too large
Load Diff
46
contributors.sh
Executable file
46
contributors.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
#
|
||||
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
# copies of the Software, and permit persons to whom the Software is
|
||||
# furnished to do so, under the terms of the COPYING file.
|
||||
#
|
||||
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
# KIND, either express or implied.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
#
|
||||
# This script shows all mentioned contributors from <hash> until HEAD. To aid
|
||||
# when writing RELEASE-NOTES and THANKS.
|
||||
#
|
||||
|
||||
start=$1
|
||||
|
||||
if test -z "$start"; then
|
||||
echo "Usage: $0 <since this tag/hash>"
|
||||
fi
|
||||
|
||||
# filter out Author:, Commit: and *by: lines
|
||||
# cut off the email parts
|
||||
# cut off spaces first and last on the line
|
||||
# only count names with a space (ie more than one word)
|
||||
# sort all unique names
|
||||
git log $start..HEAD | \
|
||||
egrep '(Author|Commit|by):' | \
|
||||
cut -d: -f2- | \
|
||||
cut '-d<' -f1 | \
|
||||
sed -e 's/^ //' -e 's/ $//g' | \
|
||||
grep ' ' | \
|
||||
sort -u
|
107
curl-config.in
107
curl-config.in
@@ -6,7 +6,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2001 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 2001 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -24,6 +24,7 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
includedir=@includedir@
|
||||
cppflag_curl_staticlib=@CPPFLAG_CURL_STATICLIB@
|
||||
|
||||
usage()
|
||||
{
|
||||
@@ -70,96 +71,106 @@ while test $# -gt 0; do
|
||||
;;
|
||||
|
||||
--ca)
|
||||
echo "@CURL_CA_BUNDLE@"
|
||||
;;
|
||||
echo "@CURL_CA_BUNDLE@"
|
||||
;;
|
||||
|
||||
--cc)
|
||||
echo "@CC@"
|
||||
;;
|
||||
echo "@CC@"
|
||||
;;
|
||||
|
||||
--prefix)
|
||||
echo "$prefix"
|
||||
;;
|
||||
echo "$prefix"
|
||||
;;
|
||||
|
||||
--feature|--features)
|
||||
for feature in @SUPPORT_FEATURES@ ""; do
|
||||
test -n "$feature" && echo "$feature"
|
||||
done
|
||||
;;
|
||||
;;
|
||||
|
||||
--protocols)
|
||||
for protocol in @SUPPORT_PROTOCOLS@; do
|
||||
echo "$protocol"
|
||||
done
|
||||
;;
|
||||
;;
|
||||
|
||||
--version)
|
||||
echo libcurl @CURLVERSION@
|
||||
exit 0
|
||||
;;
|
||||
echo libcurl @CURLVERSION@
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--checkfor)
|
||||
checkfor=$2
|
||||
cmajor=`echo $checkfor | cut -d. -f1`
|
||||
cminor=`echo $checkfor | cut -d. -f2`
|
||||
# when extracting the patch part we strip off everything after a
|
||||
# dash as that's used for things like version 1.2.3-CVS
|
||||
cpatch=`echo $checkfor | cut -d. -f3 | cut -d- -f1`
|
||||
# dash as that's used for things like version 1.2.3-CVS
|
||||
cpatch=`echo $checkfor | cut -d. -f3 | cut -d- -f1`
|
||||
checknum=`echo "$cmajor*256*256 + $cminor*256 + ${cpatch:-0}" | bc`
|
||||
numuppercase=`echo @VERSIONNUM@ | tr 'a-f' 'A-F'`
|
||||
nownum=`echo "obase=10; ibase=16; $numuppercase" | bc`
|
||||
|
||||
if test "$nownum" -ge "$checknum"; then
|
||||
# silent success
|
||||
exit 0
|
||||
else
|
||||
echo "requested version $checkfor is newer than existing @CURLVERSION@"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
if test "$nownum" -ge "$checknum"; then
|
||||
# silent success
|
||||
exit 0
|
||||
else
|
||||
echo "requested version $checkfor is newer than existing @CURLVERSION@"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
--vernum)
|
||||
echo @VERSIONNUM@
|
||||
exit 0
|
||||
;;
|
||||
echo @VERSIONNUM@
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--help)
|
||||
usage 0
|
||||
;;
|
||||
usage 0
|
||||
;;
|
||||
|
||||
--cflags)
|
||||
if test "X@includedir@" = "X/usr/include"; then
|
||||
echo ""
|
||||
if test "X$cppflag_curl_staticlib" = "X-DCURL_STATICLIB"; then
|
||||
CPPFLAG_CURL_STATICLIB="-DCURL_STATICLIB "
|
||||
else
|
||||
echo "-I@includedir@"
|
||||
CPPFLAG_CURL_STATICLIB=""
|
||||
fi
|
||||
;;
|
||||
if test "X@includedir@" = "X/usr/include"; then
|
||||
echo "$CPPFLAG_CURL_STATICLIB"
|
||||
else
|
||||
echo "${CPPFLAG_CURL_STATICLIB}-I@includedir@"
|
||||
fi
|
||||
;;
|
||||
|
||||
--libs)
|
||||
if test "X@libdir@" != "X/usr/lib" -a "X@libdir@" != "X/usr/lib64"; then
|
||||
CURLLIBDIR="-L@libdir@ "
|
||||
else
|
||||
CURLLIBDIR=""
|
||||
fi
|
||||
if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then
|
||||
echo ${CURLLIBDIR}-lcurl @LIBCURL_LIBS@ @LIBS@
|
||||
else
|
||||
echo ${CURLLIBDIR}-lcurl @LIBS@
|
||||
fi
|
||||
;;
|
||||
if test "X@libdir@" != "X/usr/lib" -a "X@libdir@" != "X/usr/lib64"; then
|
||||
CURLLIBDIR="-L@libdir@ "
|
||||
else
|
||||
CURLLIBDIR=""
|
||||
fi
|
||||
if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then
|
||||
echo ${CURLLIBDIR}-lcurl @LIBCURL_LIBS@
|
||||
else
|
||||
echo ${CURLLIBDIR}-lcurl
|
||||
fi
|
||||
;;
|
||||
|
||||
--static-libs)
|
||||
echo @libdir@/libcurl.@libext@ @LDFLAGS@ @LIBCURL_LIBS@ @LIBS@
|
||||
;;
|
||||
if test "X@ENABLE_STATIC@" != "Xno" ; then
|
||||
echo @libdir@/libcurl.@libext@ @LDFLAGS@ @LIBCURL_LIBS@
|
||||
else
|
||||
echo "curl was built with static libraries disabled" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
--configure)
|
||||
echo @CONFIGURE_OPTIONS@
|
||||
;;
|
||||
echo @CONFIGURE_OPTIONS@
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "unknown option: $1"
|
||||
usage 1
|
||||
;;
|
||||
usage 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
@@ -1,50 +0,0 @@
|
||||
;;;; Emacs Lisp help for writing curl code. ;;;;
|
||||
|
||||
;;; The curl hacker's C conventions.
|
||||
;;; See the sample.emacs file on how this file can be made to take
|
||||
;;; effect automatically when editing curl source files.
|
||||
|
||||
(defconst curl-c-style
|
||||
'((c-basic-offset . 2)
|
||||
(c-comment-only-line-offset . 0)
|
||||
(c-hanging-braces-alist . ((substatement-open before after)))
|
||||
(c-offsets-alist . ((topmost-intro . 0)
|
||||
(topmost-intro-cont . 0)
|
||||
(substatement . +)
|
||||
(substatement-open . 0)
|
||||
(statement-case-intro . +)
|
||||
(statement-case-open . 0)
|
||||
(case-label . 0)
|
||||
))
|
||||
)
|
||||
"Curl C Programming Style")
|
||||
|
||||
(defun curl-code-cleanup ()
|
||||
"no docs"
|
||||
(interactive)
|
||||
(untabify (point-min) (point-max))
|
||||
(delete-trailing-whitespace)
|
||||
)
|
||||
|
||||
;; Customizations for all of c-mode, c++-mode, and objc-mode
|
||||
(defun curl-c-mode-common-hook ()
|
||||
"Curl C mode hook"
|
||||
;; add curl style and set it for the current buffer
|
||||
(c-add-style "curl" curl-c-style t)
|
||||
(setq tab-width 8
|
||||
indent-tabs-mode nil ; Use spaces. Not tabs.
|
||||
comment-column 40
|
||||
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "curl_socklen_t" "fd_set" "time_t" "curl_off_t" "curl_socket_t" "in_addr_t" "CURLSHcode" "CURLMcode" "Curl_addrinfo"))
|
||||
)
|
||||
;; keybindings for C, C++, and Objective-C. We can put these in
|
||||
;; c-mode-base-map because of inheritance ...
|
||||
(define-key c-mode-base-map "\M-q" 'c-fill-paragraph)
|
||||
(define-key c-mode-base-map "\M-m" 'curl-code-cleanup)
|
||||
(setq c-recognize-knr-p nil)
|
||||
;;; (add-hook 'write-file-hooks 'delete-trailing-whitespace t)
|
||||
(setq show-trailing-whitespace t)
|
||||
)
|
||||
|
||||
;; Set this is in your .emacs if you want to use the c-mode-hook as
|
||||
;; defined here right out of the box.
|
||||
; (add-hook 'c-mode-common-hook 'curl-c-mode-common-hook)
|
@@ -6,14 +6,14 @@
|
||||
|
||||
libcurl bindings
|
||||
|
||||
Creative people have written bindings or interfaces for various environments
|
||||
and programming languages. Using one of these allows you to take advantage of
|
||||
curl powers from within your favourite language or system.
|
||||
Creative people have written bindings or interfaces for various environments
|
||||
and programming languages. Using one of these allows you to take advantage of
|
||||
curl powers from within your favourite language or system.
|
||||
|
||||
This is a list of all known interfaces as of this writing.
|
||||
This is a list of all known interfaces as of this writing.
|
||||
|
||||
The bindings listed below are not part of the curl/libcurl distribution
|
||||
archives, but must be downloaded and installed separately.
|
||||
The bindings listed below are not part of the curl/libcurl distribution
|
||||
archives, but must be downloaded and installed separately.
|
||||
|
||||
Ada95
|
||||
|
||||
@@ -41,7 +41,10 @@ Ch
|
||||
|
||||
Cocoa
|
||||
|
||||
Written by Dan Wood
|
||||
BBHTTP: written by Bruno de Carvalho
|
||||
https://github.com/brunodecarvalho/BBHTTP
|
||||
|
||||
curlhandle: Written by Dan Wood
|
||||
http://curlhandle.sourceforge.net/
|
||||
|
||||
D
|
||||
@@ -55,6 +58,7 @@ Dylan
|
||||
http://dylanlibs.sourceforge.net/
|
||||
|
||||
Eiffel
|
||||
|
||||
Written by Eiffel Software
|
||||
http://curl.haxx.se/libcurl/eiffel/
|
||||
|
||||
@@ -81,6 +85,11 @@ glib/GTK+
|
||||
Written by Richard Atterer
|
||||
http://atterer.net/glibcurl/
|
||||
|
||||
Guile:
|
||||
|
||||
Written by Michael L. Gran
|
||||
http://www.lonelycactus.com/guile-curl.html
|
||||
|
||||
Haskell
|
||||
|
||||
Written by Galois, Inc
|
||||
@@ -91,6 +100,11 @@ Java
|
||||
Maintained by [blank]
|
||||
http://curl.haxx.se/libcurl/java/
|
||||
|
||||
Julia
|
||||
|
||||
Written by Paul Howe
|
||||
https://github.com/forio/Curl.jl
|
||||
|
||||
Lisp
|
||||
|
||||
Written by Liam Healy
|
||||
|
10
docs/BUGS
10
docs/BUGS
@@ -20,7 +20,7 @@ BUGS
|
||||
1.1 There are still bugs
|
||||
|
||||
Curl and libcurl have grown substantially since the beginning. At the time
|
||||
of writing (September 2011), there are about 66000 lines of source code, and
|
||||
of writing (January 2013), there are about 83,000 lines of source code, and
|
||||
by the time you read this it has probably grown even more.
|
||||
|
||||
Of course there are lots of bugs left. And lots of misfeatures.
|
||||
@@ -35,9 +35,11 @@ BUGS
|
||||
have a go at a solution. You can optionally also post your bug/problem at
|
||||
curl's bug tracking system over at
|
||||
|
||||
http://sourceforge.net/bugs/?group_id=976
|
||||
https://sourceforge.net/p/curl/bugs/
|
||||
|
||||
(but please read the sections below first before doing that)
|
||||
Please read the rest of this document below first before doing that! Also,
|
||||
you need to login to your sourceforge account before being able to submit a
|
||||
bug report (necessary evil done to avoid spam).
|
||||
|
||||
If you feel you need to ask around first, find a suitable mailing list and
|
||||
post there. The lists are available on http://curl.haxx.se/mail/
|
||||
@@ -91,7 +93,7 @@ BUGS
|
||||
your problem and to work on a fix (if we agree it truly is a problem).
|
||||
|
||||
Lots of problems that appear to be libcurl problems are actually just abuses
|
||||
of the libcurl API or other malfunctions in your applications. It is adviced
|
||||
of the libcurl API or other malfunctions in your applications. It is advised
|
||||
that you run your problematic program using a memory debug tool like
|
||||
valgrind or similar before you post memory-related or "crashing" problems to
|
||||
us.
|
||||
|
@@ -79,9 +79,9 @@
|
||||
1.3 What To Read
|
||||
|
||||
Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the
|
||||
most recent CHANGES. Just lurking on the libcurl mailing list is gonna give
|
||||
you a lot of insights on what's going on right now. Asking there is a good
|
||||
idea too.
|
||||
most recent CHANGES. Just lurking on the curl-library mailing list is gonna
|
||||
give you a lot of insights on what's going on right now. Asking there is a
|
||||
good idea too.
|
||||
|
||||
2. cURL Coding Standards
|
||||
|
||||
@@ -98,12 +98,12 @@
|
||||
|
||||
2.2 Indenting
|
||||
|
||||
Please try using the same indenting levels and bracing method as all the
|
||||
other code already does. It makes the source code a lot easier to follow if
|
||||
all of it is written using the same style. We don't ask you to like it, we
|
||||
just ask you to follow the tradition! ;-) This mainly means: 2-level indents,
|
||||
using spaces only (no tabs) and having the opening brace ({) on the same line
|
||||
as the if() or while().
|
||||
Use the same indenting levels and bracing method as all the other code
|
||||
already does. It makes the source code easier to follow if all of it is
|
||||
written using the same style. We don't ask you to like it, we just ask you to
|
||||
follow the tradition! ;-) This mainly means: 2-level indents, using spaces
|
||||
only (no tabs) and having the opening brace ({) on the same line as the if()
|
||||
or while().
|
||||
|
||||
Also note that we use if() and while() with no space before the parenthesis.
|
||||
|
||||
@@ -151,6 +151,9 @@
|
||||
description exactly what they correct so that all patches can be selectively
|
||||
applied by the maintainer or other interested parties.
|
||||
|
||||
Also, separate patches enable bisecting much better when we track problems in
|
||||
the future.
|
||||
|
||||
2.9 Patch Against Recent Sources
|
||||
|
||||
Please try to get the latest available sources to make your patches
|
||||
@@ -178,6 +181,10 @@
|
||||
test case that verifies that it works as documented. If every submitter also
|
||||
posts a few test cases, it won't end up as a heavy burden on a single person!
|
||||
|
||||
If you don't have test cases or perhaps you have done something that is very
|
||||
hard to write tests for, do explain exactly how you have otherwise tested and
|
||||
verified your changes.
|
||||
|
||||
3. Pushing Out Your Changes
|
||||
|
||||
3.1 Write Access to git Repository
|
||||
@@ -212,7 +219,7 @@
|
||||
commit.
|
||||
|
||||
Now send those patches off to the curl-library list. You can of course opt to
|
||||
do that with the 'get send-email' command.
|
||||
do that with the 'git send-email' command.
|
||||
|
||||
3.3 How To Make a Patch without git
|
||||
|
||||
@@ -279,7 +286,7 @@
|
||||
|
||||
3.6 Please don't send pull requests
|
||||
|
||||
With git (and expecially github) it is easy and tempting to send a pull
|
||||
With git (and especially github) it is easy and tempting to send a pull
|
||||
request to one or more people in the curl project to have changes merged this
|
||||
way instead of mailing patches to the curl-library mailing list.
|
||||
|
||||
@@ -294,7 +301,7 @@
|
||||
|
||||
- Commit messages can be tweaked and changed if merged locally instead of
|
||||
using github. Merges directly on github requires the changes to be perfect
|
||||
already, which they seldomly are.
|
||||
already, which they seldom are.
|
||||
|
||||
- Merges on github prevents rebases and even enforces --no-ff which is a git
|
||||
style we don't otherwise use in the project
|
||||
|
306
docs/FAQ
306
docs/FAQ
@@ -1,4 +1,3 @@
|
||||
Updated: December 7, 2011 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -53,6 +52,7 @@ FAQ
|
||||
3.19 How do I get HTTP from a host using a specific IP address?
|
||||
3.20 How to SFTP from my user's home directory?
|
||||
3.21 Protocol xxx not supported or disabled in libcurl
|
||||
3.22 curl -X gives me HTTP problems
|
||||
|
||||
4. Running Problems
|
||||
4.1 Problems connecting to SSL servers.
|
||||
@@ -97,6 +97,8 @@ FAQ
|
||||
5.13 How do I stop an ongoing transfer?
|
||||
5.14 Using C++ non-static functions for callbacks?
|
||||
5.15 How do I get an FTP directory listing?
|
||||
5.16 I want a different time-out!
|
||||
5.17 Can I write a server with libcurl?
|
||||
|
||||
6. License Issues
|
||||
6.1 I have a GPL program, can I use the libcurl library?
|
||||
@@ -138,7 +140,7 @@ FAQ
|
||||
|
||||
libcurl is highly portable, it builds and works identically on numerous
|
||||
platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX,
|
||||
IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac
|
||||
IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOS, Mac
|
||||
OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS, Symbian, OSF,
|
||||
Android, Minix, IBM TPF and more...
|
||||
|
||||
@@ -200,27 +202,25 @@ FAQ
|
||||
better. We do however believe in a few rules when it comes to the future of
|
||||
curl:
|
||||
|
||||
* Curl -- the command line tool -- is to remain a non-graphical command line
|
||||
tool. If you want GUIs or fancy scripting capabilities, you should look
|
||||
for another tool that uses libcurl.
|
||||
Curl -- the command line tool -- is to remain a non-graphical command line
|
||||
tool. If you want GUIs or fancy scripting capabilities, you should look for
|
||||
another tool that uses libcurl.
|
||||
|
||||
* We do not add things to curl that other small and available tools already
|
||||
do very fine at the side. Curl's output is fine to pipe into another
|
||||
program or redirect to another file for the next program to interpret.
|
||||
We do not add things to curl that other small and available tools already do
|
||||
very fine at the side. Curl's output is fine to pipe into another program or
|
||||
redirect to another file for the next program to interpret.
|
||||
|
||||
* We focus on protocol related issues and improvements. If you wanna do more
|
||||
magic with the supported protocols than curl currently does, chances are
|
||||
big we will agree. If you wanna add more protocols, we may very well
|
||||
agree.
|
||||
We focus on protocol related issues and improvements. If you wanna do more
|
||||
magic with the supported protocols than curl currently does, chances are big
|
||||
we will agree. If you wanna add more protocols, we may very well agree.
|
||||
|
||||
* If you want someone else to make all the work while you wait for us to
|
||||
implement it for you, that is not a very friendly attitude. We spend a
|
||||
considerable time already on maintaining and developing curl. In order to
|
||||
get more out of us, you should consider trading in some of your time and
|
||||
efforts in return.
|
||||
If you want someone else to make all the work while you wait for us to
|
||||
implement it for you, that is not a very friendly attitude. We spend a
|
||||
considerable time already on maintaining and developing curl. In order to
|
||||
get more out of us, you should consider trading in some of your time and
|
||||
efforts in return.
|
||||
|
||||
* If you write the code, chances are bigger that it will get into curl
|
||||
faster.
|
||||
If you write the code, chances are bigger that it will get into curl faster.
|
||||
|
||||
1.5 Who makes curl?
|
||||
|
||||
@@ -243,10 +243,10 @@ FAQ
|
||||
supervised in any way by the project.
|
||||
|
||||
We still get help from companies. Haxx provides web site, bandwidth, mailing
|
||||
lists etc and sourceforge.net hosts project services we take advantage from,
|
||||
like the bug tracker. Also again, some companies have sponsored certain
|
||||
parts of the development in the past and I hope some will continue to do so
|
||||
in the future.
|
||||
lists etc, sourceforge.net hosts project services we take advantage from,
|
||||
like the bug tracker and github hosts the primary git repository. Also
|
||||
again, some companies have sponsored certain parts of the development in the
|
||||
past and I hope some will continue to do so in the future.
|
||||
|
||||
If you want to support our project, consider a donation or a banner-program
|
||||
or even better: by helping us coding, documenting, testing etc.
|
||||
@@ -261,7 +261,7 @@ FAQ
|
||||
|
||||
Our project name curl has been in effective use since 1998. We were not the
|
||||
first computer related project to use the name "curl" and do not claim any
|
||||
first-hand rights to the name.
|
||||
rights to the name.
|
||||
|
||||
We recognize that we will be living in parallel with curl.com and wish them
|
||||
every success.
|
||||
@@ -306,49 +306,17 @@ FAQ
|
||||
We don't know how many users that downloaded or installed curl and then
|
||||
never use it.
|
||||
|
||||
Some facts to use as input to the math:
|
||||
In May 2012 Daniel did a counting game and came up with a number that may
|
||||
be completely wrong or somewhat accurate. Over 500 million!
|
||||
|
||||
curl packages are downloaded from the curl.haxx.se and mirrors over a
|
||||
million times per year. curl is installed by default with most Linux
|
||||
distributions. curl is installed by default with Mac OS X. curl and libcurl
|
||||
as used by numerous applications that include libcurl binaries in their
|
||||
distribution packages (like Adobe Acrobat Reader and Google Earth).
|
||||
|
||||
More than a hundred known named companies use curl in commercial
|
||||
environments and products and more than a hundred known named open source
|
||||
projects depend on (lib)curl.
|
||||
|
||||
In a poll on the curl web site mid-2005, more than 50% of the 300+ answers
|
||||
estimated a user base of one million users or more.
|
||||
|
||||
In March 2005, the "Linux Counter project" estimated a total Linux user base
|
||||
of some 29 millions, while Netcraft detected some 4 million "active" Linux
|
||||
based web servers. A guess is that a fair amount of these Linux
|
||||
installations have curl installed.
|
||||
|
||||
The Debian project maintains statistics on packages installed by people
|
||||
who have voluntarily run their package counting application. In mid-2010,
|
||||
libcurl3 was installed on over 55000 such systems (62% of reporting systems)
|
||||
and was one of the 320 most popular installed packages (out of about 107000
|
||||
possible packages).
|
||||
|
||||
All this taken together, there is no doubt that there are millions of
|
||||
(lib)curl users.
|
||||
|
||||
http://curl.haxx.se/docs/companies.html
|
||||
http://curl.haxx.se/docs/programs.html
|
||||
http://curl.haxx.se/libcurl/using/apps.html
|
||||
http://counter.li.org/estimates.php
|
||||
http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html
|
||||
http://qa.debian.org/popcon.php?package=curl
|
||||
See http://daniel.haxx.se/blog/2012/05/16/300m-users/
|
||||
|
||||
1.11 Why don't you update ca-bundle.crt
|
||||
|
||||
The ca-bundle.crt file that used to be bundled with curl was very outdated
|
||||
(it being last modified year 2000 should tell) and must be replaced with a
|
||||
much more modern and up-to-date version by anyone who wants to verify peers
|
||||
anyway. It is no longer provided, the last curl release that shipped it was
|
||||
curl 7.18.0.
|
||||
The ca cert bundle that used to shipped with curl was very outdated and must
|
||||
be replaced with an up-to-date version by anyone who wants to verify
|
||||
peers. It is no longer provided by curl. The last curl release ever that
|
||||
shipped a ca cert bundle was curl 7.18.0.
|
||||
|
||||
In the cURL project we've decided not to attempt to keep this file updated
|
||||
(or even present anymore) since deciding what to add to a ca cert bundle is
|
||||
@@ -448,19 +416,24 @@ FAQ
|
||||
|
||||
2.2 Does curl work/build with other SSL libraries?
|
||||
|
||||
Curl has been written to use OpenSSL, GnuTLS, yassl, NSS, PolarSSL, axTLS or
|
||||
qssl, although there should not be many problems using a different
|
||||
library. If anyone does "port" curl to use a different SSL library, we are
|
||||
of course very interested in getting the patch!
|
||||
Curl has been written to use a generic SSL function layer internally, and
|
||||
that SSL functionality can then be provided by one out of many different SSL
|
||||
backends.
|
||||
|
||||
curl can be built to use one of the following SSL alternatives: OpenSSL,
|
||||
GnuTLS, yassl, NSS, PolarSSL, axTLS, Secure Transport (native iOS/OS X),
|
||||
schannel (native Windows) or qssl (native IBM i). They all have their pros
|
||||
and cons, and we try to maintain a comparison of them here:
|
||||
http://curl.haxx.se/docs/ssl-compared.html
|
||||
|
||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||
|
||||
That is an OpenSSL binary built for Windows.
|
||||
|
||||
Curl uses OpenSSL to do the SSL stuff. The LIBEAY32.DLL is what curl needs
|
||||
on a windows machine to do https://. Check out the curl web site to find
|
||||
accurate and up-to-date pointers to recent OpenSSL DLLs and other binary
|
||||
packages.
|
||||
Curl can be built with OpenSSL to do the SSL stuff. The LIBEAY32.DLL is then
|
||||
what curl needs on a windows machine to do https:// etc. Check out the curl
|
||||
web site to find accurate and up-to-date pointers to recent OpenSSL DLLs and
|
||||
other binary packages.
|
||||
|
||||
2.4 Does curl support SOCKS (RFC 1928) ?
|
||||
|
||||
@@ -496,9 +469,9 @@ FAQ
|
||||
3.3 Why doesn't my posting using -F work?
|
||||
|
||||
You can't simply use -F or -d at your choice. The web server that will
|
||||
receive your post assumes one of the formats. If the form you're trying to
|
||||
"fake" sets the type to 'multipart/form-data', then and only then you must
|
||||
use the -F type. In all the most common cases, you should use -d which then
|
||||
receive your post expects one of the formats. If the form you're trying to
|
||||
submit uses the type 'multipart/form-data', then and only then you must use
|
||||
the -F type. In all the most common cases, you should use -d which then
|
||||
causes a posting with the type 'application/x-www-form-urlencoded'.
|
||||
|
||||
This is described in some detail in the MANUAL and TheArtOfHttpScripting
|
||||
@@ -512,9 +485,10 @@ FAQ
|
||||
You can tell curl to perform optional commands both before and/or after a
|
||||
file transfer. Study the -Q/--quote option.
|
||||
|
||||
Since curl is used for file transfers, you don't use curl to just perform
|
||||
FTP commands without transferring anything. Therefore you must always specify
|
||||
a URL to transfer to/from even when doing custom FTP commands.
|
||||
Since curl is used for file transfers, you don't normally use curl to
|
||||
perform FTP commands without transferring anything. Therefore you must
|
||||
always specify a URL to transfer to/from even when doing custom FTP
|
||||
commands, or use -I which implies the "no body" option sent to libcurl.
|
||||
|
||||
3.5 How can I disable the Accept: */* header?
|
||||
|
||||
@@ -525,9 +499,9 @@ FAQ
|
||||
3.6 Does curl support ASP, XML, XHTML or HTML version Y?
|
||||
|
||||
To curl, all contents are alike. It doesn't matter how the page was
|
||||
generated. It may be ASP, PHP, Perl, shell-script, SSI or plain
|
||||
HTML-files. There's no difference to curl and it doesn't even know what kind
|
||||
of language that generated the page.
|
||||
generated. It may be ASP, PHP, Perl, shell-script, SSI or plain HTML
|
||||
files. There's no difference to curl and it doesn't even know what kind of
|
||||
language that generated the page.
|
||||
|
||||
See also item 3.14 regarding javascript.
|
||||
|
||||
@@ -644,15 +618,15 @@ FAQ
|
||||
|
||||
Some workarounds usually suggested to overcome this Javascript dependency:
|
||||
|
||||
- Depending on the Javascript complexity, write up a script that
|
||||
translates it to another language and execute that.
|
||||
Depending on the Javascript complexity, write up a script that translates it
|
||||
to another language and execute that.
|
||||
|
||||
- Read the Javascript code and rewrite the same logic in another language.
|
||||
Read the Javascript code and rewrite the same logic in another language.
|
||||
|
||||
- Implement a Javascript interpreter, people have successfully used the
|
||||
Mozilla Javascript engine in the past.
|
||||
Implement a Javascript interpreter, people have successfully used the
|
||||
Mozilla Javascript engine in the past.
|
||||
|
||||
- Ask your admins to stop this, for a static proxy setup or similar.
|
||||
Ask your admins to stop this, for a static proxy setup or similar.
|
||||
|
||||
3.15 Can I do recursive fetches with curl?
|
||||
|
||||
@@ -668,34 +642,38 @@ FAQ
|
||||
There are three different kinds of "certificates" to keep track of when we
|
||||
talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl.
|
||||
|
||||
- Client certificate. The server you communicate may require that you can
|
||||
provide this in order to prove that you actually are who you claim to be.
|
||||
If the server doesn't require this, you don't need a client certificate.
|
||||
CLIENT CERTIFICATE
|
||||
|
||||
A client certificate is always used together with a private key, and the
|
||||
private key has a pass phrase that protects it.
|
||||
The server you communicate may require that you can provide this in order to
|
||||
prove that you actually are who you claim to be. If the server doesn't
|
||||
require this, you don't need a client certificate.
|
||||
|
||||
- Server certificate. The server you communicate with has a server
|
||||
certificate. You can and should verify this certificate to make sure that
|
||||
you are truly talking to the real server and not a server impersonating
|
||||
it.
|
||||
A client certificate is always used together with a private key, and the
|
||||
private key has a pass phrase that protects it.
|
||||
|
||||
- Certificate Authority certificate ("CA cert"). You often have several CA
|
||||
certs in a CA cert bundle that can be used to verify a server certificate
|
||||
that was signed by one of the authorities in the bundle. curl does not
|
||||
come with a CA cert bundle but most curl installs provide one. You can
|
||||
also override the default.
|
||||
SERVER CERTIFICATE
|
||||
|
||||
The server certificate verification process is made by using a Certificate
|
||||
Authority certificate ("CA cert") that was used to sign the server
|
||||
certificate. Server certificate verification is enabled by default in curl
|
||||
and libcurl and is often the reason for problems as explained in FAQ entry
|
||||
4.12 and the SSLCERTS document
|
||||
(http://curl.haxx.se/docs/sslcerts.html). Server certificates that are
|
||||
"self-signed" or otherwise signed by a CA that you do not have a CA cert
|
||||
for, cannot be verified. If the verification during a connect fails, you
|
||||
are refused access. You then need to explicitly disable the verification
|
||||
to connect to the server.
|
||||
The server you communicate with has a server certificate. You can and should
|
||||
verify this certificate to make sure that you are truly talking to the real
|
||||
server and not a server impersonating it.
|
||||
|
||||
CERTIFICATE AUTHORITY CERTIFICATE ("CA cert")
|
||||
|
||||
You often have several CA certs in a CA cert bundle that can be used to
|
||||
verify a server certificate that was signed by one of the authorities in the
|
||||
bundle. curl does not come with a CA cert bundle but most curl installs
|
||||
provide one. You can also override the default.
|
||||
|
||||
The server certificate verification process is made by using a Certificate
|
||||
Authority certificate ("CA cert") that was used to sign the server
|
||||
certificate. Server certificate verification is enabled by default in curl
|
||||
and libcurl and is often the reason for problems as explained in FAQ entry
|
||||
4.12 and the SSLCERTS document
|
||||
(http://curl.haxx.se/docs/sslcerts.html). Server certificates that are
|
||||
"self-signed" or otherwise signed by a CA that you do not have a CA cert
|
||||
for, cannot be verified. If the verification during a connect fails, you are
|
||||
refused access. You then need to explicitly disable the verification to
|
||||
connect to the server.
|
||||
|
||||
3.17 How do I list the root dir of an FTP server?
|
||||
|
||||
@@ -752,7 +730,7 @@ FAQ
|
||||
When passing on a URL to curl to use, it may respond that the particular
|
||||
protocol is not supported or disabled. The particular way this error message
|
||||
is phrased is because curl doesn't make a distinction internally of whether
|
||||
a particular protocol is not supported (ie never got any code added that
|
||||
a particular protocol is not supported (i.e. never got any code added that
|
||||
knows how to speak that protocol) or if it was explicitly disabled. curl can
|
||||
be built to only support a given set of protocols, and the rest would then
|
||||
be disabled or not supported.
|
||||
@@ -761,6 +739,33 @@ FAQ
|
||||
part as in "htpt://example.com" or as in the less evident case if you prefix
|
||||
the protocol part with a space as in " http://example.com/".
|
||||
|
||||
3.22 curl -X gives me HTTP problems
|
||||
|
||||
In normal circumstances, -X should hardly ever be used.
|
||||
|
||||
By default you use curl without explicitly saying which request method to
|
||||
use when the URL identifies a HTTP transfer. If you just pass in a URL like
|
||||
"curl http://example.com" it will use GET. If you use -d or -F curl will use
|
||||
POST, -I will cause a HEAD and -T will make it a PUT.
|
||||
|
||||
If for whatever reason you're not happy with these default choices that curl
|
||||
does for you, you can override those request methods by specifying -X
|
||||
[WHATEVER]. This way you can for example send a DELETE by doing "curl -X
|
||||
DELETE [URL]".
|
||||
|
||||
It is thus pointless to do "curl -XGET [URL]" as GET would be used
|
||||
anyway. In the same vein it is pointless to do "curl -X POST -d data
|
||||
[URL]"... But you can make a fun and somewhat rare request that sends a
|
||||
request-body in a GET request with something like "curl -X GET -d data
|
||||
[URL]"
|
||||
|
||||
Note that -X doesn't change curl's behavior. It only modifies the actual
|
||||
string sent in the request.
|
||||
|
||||
Accordingly, by using -XPOST on a command line that for example would follow
|
||||
a 303 redirect, you will effectively prevent curl from behaving
|
||||
correctly. Be aware.
|
||||
|
||||
|
||||
4. Running Problems
|
||||
|
||||
@@ -791,12 +796,13 @@ FAQ
|
||||
|
||||
curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl'
|
||||
|
||||
In Windows, the standard DOS shell treats the %-symbol specially and you
|
||||
need to use TWO %-symbols for each single one you want to use in the URL.
|
||||
In Windows, the standard DOS shell treats the percent sign specially and you
|
||||
need to use TWO percent signs for each single one you want to use in the
|
||||
URL.
|
||||
|
||||
Also note that if you want the literal %-symbol to be part of the data you
|
||||
pass in a POST using -d/--data you must encode it as '%25' (which then also
|
||||
needs the %-symbol doubled on Windows machines).
|
||||
If you want a literal percent sign to be part of the data you pass in a POST
|
||||
using -d/--data you must encode it as '%25' (which then also needs the
|
||||
percent sign doubled on Windows machines).
|
||||
|
||||
4.3 How can I use {, }, [ or ] to specify multiple URLs?
|
||||
|
||||
@@ -838,7 +844,7 @@ FAQ
|
||||
|
||||
4.5.3 "403 Forbidden"
|
||||
|
||||
The server understood the request, but is refusing to fulfill it.
|
||||
The server understood the request, but is refusing to fulfil it.
|
||||
Authorization will not help and the request SHOULD NOT be repeated.
|
||||
|
||||
4.5.4 "404 Not Found"
|
||||
@@ -909,8 +915,8 @@ FAQ
|
||||
|
||||
4.9 Curl can't authenticate to the server that requires NTLM?
|
||||
|
||||
NTLM support requires OpenSSL, GnuTLS, NSS or Microsoft Windows libraries at
|
||||
build-time to provide this functionality.
|
||||
NTLM support requires OpenSSL, GnuTLS, NSS, Secure Transport, or Microsoft
|
||||
Windows libraries at build-time to provide this functionality.
|
||||
|
||||
NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You
|
||||
should not use such ones.
|
||||
@@ -965,13 +971,13 @@ FAQ
|
||||
4.14 Redirects work in browser but not with curl!
|
||||
|
||||
curl supports HTTP redirects fine (see item 3.8). Browsers generally support
|
||||
at least two other ways to perform directs that curl does not:
|
||||
at least two other ways to perform redirects that curl does not:
|
||||
|
||||
- Meta tags. You can write a HTML tag that will cause the browser to
|
||||
redirect to another given URL after a certain time.
|
||||
Meta tags. You can write a HTML tag that will cause the browser to redirect
|
||||
to another given URL after a certain time.
|
||||
|
||||
- Javascript. You can write a Javascript program embedded in a HTML page
|
||||
that redirects the browser to another given URL.
|
||||
Javascript. You can write a Javascript program embedded in a HTML page that
|
||||
redirects the browser to another given URL.
|
||||
|
||||
There is no way to make curl follow these redirects. You must either
|
||||
manually figure out what the page is set to do, or you write a script that
|
||||
@@ -1052,11 +1058,11 @@ FAQ
|
||||
|
||||
4.19 Why doesn't cURL return an error when the network cable is unplugged?
|
||||
|
||||
Unplugging the cable is not an error situation. The TCP/IP protocol stack
|
||||
Unplugging a cable is not an error situation. The TCP/IP protocol stack
|
||||
was designed to be fault tolerant, so even though there may be a physical
|
||||
break somewhere the connection shouldn't be affected, just possibly
|
||||
delayed. Eventually, the physical break will be fixed or the data will be
|
||||
re-routed around the physical problem.
|
||||
re-routed around the physical problem through another path.
|
||||
|
||||
In such cases, the TCP/IP stack is responsible for detecting when the
|
||||
network connection is irrevocably lost. Since with some protocols it is
|
||||
@@ -1074,6 +1080,12 @@ FAQ
|
||||
falls too low, and --connect-timeout and --max-time can be used to put an
|
||||
overall timeout on the connection phase or the entire transfer.
|
||||
|
||||
A libcurl-using application running in a known physical environment (e.g.
|
||||
an embedded device with only a single network connection) may want to act
|
||||
immediately if its lone network connection goes down. That can be achieved
|
||||
by having the application monitor the network connection on its own using an
|
||||
OS-specific mechanism, then signalling libcurl to abort (see also item 5.13).
|
||||
|
||||
|
||||
5. libcurl Issues
|
||||
|
||||
@@ -1083,7 +1095,9 @@ FAQ
|
||||
|
||||
We have written the libcurl code specifically adjusted for multi-threaded
|
||||
programs. libcurl will use thread-safe functions instead of non-safe ones if
|
||||
your system has such.
|
||||
your system has such. Note that you must never share the same handle in
|
||||
multiple threads.
|
||||
|
||||
|
||||
If you use a OpenSSL-powered libcurl in a multi-threaded environment, you
|
||||
need to provide one or two locking functions:
|
||||
@@ -1259,17 +1273,18 @@ FAQ
|
||||
|
||||
5.12 Can I make libcurl fake or hide my real IP address?
|
||||
|
||||
No. libcurl operates on a higher level than so. Besides, faking IP address
|
||||
would imply sending IP packages with a made-up source address, and then you
|
||||
normally get a problem with intercepting the packages sent back as they
|
||||
would then not be routed to you!
|
||||
No. libcurl operates on a higher level. Besides, faking IP address would
|
||||
imply sending IP packet with a made-up source address, and then you normally
|
||||
get a problem with receiving the packet sent back as they would then not be
|
||||
routed to you!
|
||||
|
||||
If you use a proxy to access remote sites, the sites will not see your local
|
||||
IP address but instead the address of the proxy.
|
||||
|
||||
Also note that on many networks NATs or other IP-munging techniques are used
|
||||
that makes you see and use a different IP address locally than what the
|
||||
remote server will see you coming from.
|
||||
remote server will see you coming from. You may also consider using
|
||||
http://www.torproject.org .
|
||||
|
||||
5.13 How do I stop an ongoing transfer?
|
||||
|
||||
@@ -1283,7 +1298,7 @@ FAQ
|
||||
|
||||
If you're using the multi interface, you can also stop a transfer by
|
||||
removing the particular easy handle from the multi stack at any moment you
|
||||
think the transfer is done.
|
||||
think the transfer is done or when you wish to abort the transfer.
|
||||
|
||||
5.14 Using C++ non-static functions for callbacks?
|
||||
|
||||
@@ -1325,6 +1340,31 @@ FAQ
|
||||
libcurl since 7.21.0 also provide the ability to specify a wildcard to
|
||||
download multiple files from one FTP directory.
|
||||
|
||||
5.16 I want a different time-out!
|
||||
|
||||
Time and time again users realize that CURLOPT_TIMEOUT and
|
||||
CURLOPT_CONNECTIMEOUT are not sufficiently advanced or flexible to cover all
|
||||
the various use cases and scenarios applications end up with.
|
||||
|
||||
libcurl offers many more ways to time-out operations. A common alternative
|
||||
is to use the CURLOPT_LOW_SPEED_LIMIT and CURLOPT_LOW_SPEED_TIME options to
|
||||
specify the lowest possible speed to accept before to consider the transfer
|
||||
timed out.
|
||||
|
||||
The most flexible way is by writing your own time-out logic and using
|
||||
CURLOPT_PROGRESSFUNCTION (perhaps in combination with other callbacks) and
|
||||
use that to figure out exactly when the right condition is met when the
|
||||
transfer should get stopped.
|
||||
|
||||
5.17 Can I write a server with libcurl?
|
||||
|
||||
No. libcurl offers no functions or building blocks to build any kind of
|
||||
internet protocol server. libcurl is only a client-side library. For server
|
||||
libraries, you need to continue your search elsewhere but there exist many
|
||||
good open source ones out there for most protocols you could possibly want a
|
||||
server for. And there are really good stand-alone ones that have been tested
|
||||
and proven for many years. There's no need for you to reinvent them!
|
||||
|
||||
|
||||
6. License Issues
|
||||
|
||||
|
@@ -13,27 +13,29 @@ curl tool
|
||||
- multiple file upload on a single command line
|
||||
- custom maximum transfer rate
|
||||
- redirectable stderr
|
||||
- metalink support (*13)
|
||||
|
||||
libcurl supports
|
||||
libcurl
|
||||
- full URL syntax with no length limit
|
||||
- custom maximum download time
|
||||
- custom least download speed acceptable
|
||||
- custom output result after completion
|
||||
- guesses protocol from host name unless specified
|
||||
- uses .netrc
|
||||
- progress bar/time specs while downloading
|
||||
- progress bar with time statistics while downloading
|
||||
- "standard" proxy environment variables support
|
||||
- compiles on win32 (reported builds on 40+ operating systems)
|
||||
- selectable network interface for outgoing traffic
|
||||
- IPv6 support on unix and Windows
|
||||
- persistant connections
|
||||
- persistent connections
|
||||
- socks5 support
|
||||
- supports user name + password in proxy environment variables
|
||||
- supports user name and password in proxy environment variables
|
||||
- operations through proxy "tunnel" (using CONNECT)
|
||||
- supports large files (>2GB and >4GB) both upload/download
|
||||
- replacable memory functions (malloc, free, realloc, etc)
|
||||
- support for large files (>2GB and >4GB) during upload and download
|
||||
- replaceable memory functions (malloc, free, realloc, etc)
|
||||
- asynchronous name resolving (*6)
|
||||
- both a push and a pull style interface
|
||||
- international domain names (*11)
|
||||
|
||||
HTTP
|
||||
- HTTP/1.1 compliant (optionally uses 1.0)
|
||||
@@ -43,7 +45,7 @@ HTTP
|
||||
- POST
|
||||
- Pipelining
|
||||
- multipart formpost (RFC1867-style)
|
||||
- authentication: Basic, Digest, NTLM(*9), GSS-Negotiate/Negotiate(*3) and
|
||||
- authentication: Basic, Digest, NTLM (*9), GSS-Negotiate/Negotiate (*3) and
|
||||
SPNEGO (*4) to server and proxy
|
||||
- resume (both GET and PUT)
|
||||
- follow redirects
|
||||
@@ -60,7 +62,8 @@ HTTP
|
||||
- via http-proxy
|
||||
- retrieve file modification date
|
||||
- Content-Encoding support for deflate and gzip
|
||||
- "Transfer-Encoding: chunked" support for "uploads"
|
||||
- "Transfer-Encoding: chunked" support in uploads
|
||||
- data compression (*12)
|
||||
|
||||
HTTPS (*1)
|
||||
- (all the HTTP features)
|
||||
@@ -68,12 +71,13 @@ HTTPS (*1)
|
||||
- verify server certificate
|
||||
- via http-proxy
|
||||
- select desired encryption
|
||||
- force usage of a specific SSL version (SSLv2(*7), SSLv3 or TLSv1)
|
||||
- force usage of a specific SSL version (SSLv2 (*7), SSLv3 (*10) or TLSv1)
|
||||
|
||||
FTP
|
||||
- download
|
||||
- authentication
|
||||
- kerberos4 (*5), kerberos5 (*3)
|
||||
- kerberos4 (*5)
|
||||
- kerberos5 (*3)
|
||||
- active/passive using PORT, EPRT, PASV or EPSV
|
||||
- single file size information (compare to HTTP HEAD)
|
||||
- 'type=' URL support
|
||||
@@ -93,7 +97,7 @@ FTP
|
||||
|
||||
FTPS (*1)
|
||||
- implicit ftps:// support that use SSL on both connections
|
||||
- explicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp://
|
||||
- explicit "AUTH TLS" and "AUTH SSL" usage to "upgrade" plain ftp://
|
||||
connection to use SSL for both or one of the connections
|
||||
|
||||
SCP (*8)
|
||||
@@ -104,7 +108,8 @@ SFTP (*8)
|
||||
- with custom commands sent before/after the transfer
|
||||
|
||||
TFTP
|
||||
- download / upload
|
||||
- download
|
||||
- upload
|
||||
|
||||
TELNET
|
||||
- connection negotiation
|
||||
@@ -119,18 +124,73 @@ DICT
|
||||
|
||||
FILE
|
||||
- URL support
|
||||
- "uploads"
|
||||
- upload
|
||||
- resume
|
||||
|
||||
SMTP
|
||||
- authentication: Plain, Login, CRAM-MD5, Digest-MD5 and NTLM (*9)
|
||||
- send e-mails
|
||||
- mail from support
|
||||
- mail size support
|
||||
- mail auth support for trusted server-to-server relaying
|
||||
- multiple recipients
|
||||
- via http-proxy
|
||||
|
||||
SMTPS (*1)
|
||||
- implicit smtps:// support
|
||||
- explicit "STARTTLS" usage to "upgrade" plain smtp:// connections to use SSL
|
||||
- via http-proxy
|
||||
|
||||
POP3
|
||||
- authentication: Clear Text, APOP and SASL
|
||||
- SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5 and
|
||||
NTLM (*9)
|
||||
- list e-mails
|
||||
- retrieve e-mails
|
||||
- enhanced command support for: CAPA, DELE, TOP, STAT, UIDL and NOOP via
|
||||
custom requests
|
||||
- via http-proxy
|
||||
|
||||
POP3S (*1)
|
||||
- implicit pop3s:// support
|
||||
- explicit "STLS" usage to "upgrade" plain pop3:// connections to use SSL
|
||||
- via http-proxy
|
||||
|
||||
IMAP
|
||||
- authentication: Clear Text and SASL
|
||||
- SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5 and
|
||||
NTLM (*9)
|
||||
- list the folders of a mailbox
|
||||
- select a mailbox with support for verifing the UIDVALIDITY
|
||||
- fetch e-mails with support for specifing the UID and SECTION
|
||||
- upload e-mails via the append command
|
||||
- enhanced command support for: EXAMINE, CREATE, DELETE, RENAME, STATUS,
|
||||
STORE, COPY and UID via custom requests
|
||||
- via http-proxy
|
||||
|
||||
IMAPS (*1)
|
||||
- implicit imaps:// support
|
||||
- explicit "STARTTLS" usage to "upgrade" plain imap:// connections to use SSL
|
||||
- via http-proxy
|
||||
|
||||
FOOTNOTES
|
||||
=========
|
||||
|
||||
*1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS or PolarSSL
|
||||
*1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, schannel (native
|
||||
Windows), Secure Transport (native iOS/OS X) or qssl (native IBM i)
|
||||
*2 = requires OpenLDAP
|
||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar
|
||||
*4 = requires FBopenssl
|
||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||
*5 = requires a krb4 library, such as the MIT one or similar
|
||||
*6 = requires c-ares
|
||||
*7 = requires OpenSSL or NSS, as GnuTLS only supports SSLv3 and TLSv1
|
||||
*7 = requires OpenSSL, NSS, qssl, schannel or Secure Transport; GnuTLS, for
|
||||
example, only supports SSLv3 and TLSv1
|
||||
*8 = requires libssh2
|
||||
*9 = requires OpenSSL, GnuTLS, NSS or yassl
|
||||
*9 = requires OpenSSL, GnuTLS, NSS, yassl, Secure Transport or SSPI (native
|
||||
Windows)
|
||||
*10 = requires any of the SSL libraries in (*1) above other than axTLS, which
|
||||
does not support SSLv3
|
||||
*11 = requires libidn or Windows
|
||||
*12 = requires libz
|
||||
*13 = requires libmetalink, and either an Apple or Microsoft operating
|
||||
system, or OpenSSL, or GnuTLS, or NSS
|
||||
|
14
docs/HISTORY
14
docs/HISTORY
@@ -7,19 +7,19 @@
|
||||
How cURL Became Like This
|
||||
|
||||
|
||||
In the second half of 1997, Daniel Stenberg came up with the idea to make
|
||||
Towards the end of 1996, Daniel Stenberg came up with the idea to make
|
||||
currency-exchange calculations available to Internet Relay Chat (IRC)
|
||||
users. All the necessary data are published on the Web; he just needed to
|
||||
automate their retrieval.
|
||||
|
||||
Daniel simply adopted an existing command-line open-source tool, httpget, that
|
||||
Brazilian Rafael Sagula had written. After a few minor adjustments, it did
|
||||
just what he needed.
|
||||
Brazilian Rafael Sagula had written and recently release version 0.1 of. After
|
||||
a few minor adjustments, it did just what he needed. HttpGet 1.0 was released
|
||||
on April 8th 1997 with brand new HTTP proxy support.
|
||||
|
||||
Soon, he found currencies on a GOPHER site, so support for that had to go in,
|
||||
and not before long FTP download support was added as well. The name of the
|
||||
project was changed to urlget to better fit what it actually did now, since
|
||||
the http-only days were already passed.
|
||||
We soon found and fixed support for getting currencies over GOPHER. Once FTP
|
||||
download support was added, the name of the project was changed and urlget 2.0
|
||||
was released in August 1997. The http-only days were already passed.
|
||||
|
||||
The project slowly grew bigger. When upload capabilities were added and the
|
||||
name once again was misleading, a second name change was made and on March 20,
|
||||
|
123
docs/HTTP-COOKIES
Normal file
123
docs/HTTP-COOKIES
Normal file
@@ -0,0 +1,123 @@
|
||||
Updated: July 3, 2012 (http://curl.haxx.se/docs/http-cookies.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
|
||||
HTTP Cookies
|
||||
|
||||
1. HTTP Cookies
|
||||
1.1 Cookie overview
|
||||
1.2 Cookies saved to disk
|
||||
1.3 Cookies with curl the command line tool
|
||||
1.4 Cookies with libcurl
|
||||
1.5 Cookies with javascript
|
||||
|
||||
==============================================================================
|
||||
|
||||
1. HTTP Cookies
|
||||
|
||||
1.1 Cookie overview
|
||||
|
||||
HTTP cookies are pieces of 'name=contents' snippets that a server tells the
|
||||
client to hold and then the client sends back those the server on subsequent
|
||||
requests to the same domains/paths for which the cookies were set.
|
||||
|
||||
Cookies are either "session cookies" which typically are forgotten when the
|
||||
session is over which is often translated to equal when browser quits, or
|
||||
the cookies aren't session cookies they have expiration dates after which
|
||||
the client will throw them away.
|
||||
|
||||
Cookies are set to the client with the Set-Cookie: header and are sent to
|
||||
servers with the Cookie: header.
|
||||
|
||||
For a very long time, the only spec explaining how to use cookies was the
|
||||
original Netscape spec from 1994: http://curl.haxx.se/rfc/cookie_spec.html
|
||||
|
||||
In 2011, RFC6265 (http://www.ietf.org/rfc/rfc6265.txt) was finally published
|
||||
and details how cookies work within HTTP.
|
||||
|
||||
1.2 Cookies saved to disk
|
||||
|
||||
Netscape once created a file format for storing cookies on disk so that they
|
||||
would survive browser restarts. curl adopted that file format to allow
|
||||
sharing the cookies with browsers, only to see browsers move away from that
|
||||
format. Modern browsers no longer use it, while curl still does.
|
||||
|
||||
The netscape cookie file format stores one cookie per physical line in the
|
||||
file with a bunch of associated meta data, each field separated with
|
||||
TAB. That file is called the cookiejar in curl terminology.
|
||||
|
||||
When libcurl saves a cookiejar, it creates a file header of its own in which
|
||||
there is a URL mention that will link to the web version of this document.
|
||||
|
||||
1.3 Cookies with curl the command line tool
|
||||
|
||||
curl has a full cookie "engine" built in. If you just activate it, you can
|
||||
have curl receive and send cookies exactly as mandated in the specs.
|
||||
|
||||
Command line options:
|
||||
|
||||
-b, --cookie
|
||||
|
||||
tell curl a file to read cookies from and start the cookie engine, or if
|
||||
it isn't a file it will pass on the given string. -b name=var works and so
|
||||
does -b cookiefile.
|
||||
|
||||
-j, --junk-session-cookies
|
||||
|
||||
when used in combination with -b, it will skip all "session cookies" on
|
||||
load so as to appear to start a new cookie session.
|
||||
|
||||
-c, --cookie-jar
|
||||
|
||||
tell curl to start the cookie engine and write cookies to the given file
|
||||
after the request(s)
|
||||
|
||||
1.4 Cookies with libcurl
|
||||
|
||||
libcurl offers several ways to enable and interface the cookie engine. These
|
||||
options are the ones provided by the native API. libcurl bindings may offer
|
||||
access to them using other means.
|
||||
|
||||
CURLOPT_COOKIE
|
||||
|
||||
Is used when you want to specify the exact contents of a cookie header to
|
||||
send to the server.
|
||||
|
||||
CURLOPT_COOKIEFILE
|
||||
|
||||
Tell libcurl to activate the cookie engine, and to read the initial set of
|
||||
cookies from the given file. Read-only.
|
||||
|
||||
CURLOPT_COOKIEJAR
|
||||
|
||||
Tell libcurl to activate the cookie engine, and when the easy handle is
|
||||
closed save all known cookies to the given cookiejar file. Write-only.
|
||||
|
||||
CURLOPT_COOKIELIST
|
||||
|
||||
Provide detailed information about a single cookie to add to the internal
|
||||
storage of cookies. Pass in the cookie as a HTTP header with all the
|
||||
details set, or pass in a line from a netscape cookie file. This option
|
||||
can also be used to flush the cookies etc.
|
||||
|
||||
CURLINFO_COOKIELIST
|
||||
|
||||
Extract cookie information from the internal cookie storage as a linked
|
||||
list.
|
||||
|
||||
1.5 Cookies with javascript
|
||||
|
||||
These days a lot of the web is built up by javascript. The webbrowser loads
|
||||
complete programs that render the page you see. These javascript programs
|
||||
can also set and access cookies.
|
||||
|
||||
Since curl and libcurl are plain HTTP clients without any knowledge of or
|
||||
capability to handle javascript, such cookies will not be detected or used.
|
||||
|
||||
Often, if you want to mimic what a browser does on such web sites, you can
|
||||
record web browser HTTP traffic when using such a site and then repeat the
|
||||
cookie operations using curl or libcurl.
|
137
docs/INSTALL
137
docs/INSTALL
@@ -135,21 +135,18 @@ UNIX
|
||||
default. But if you want to alter it, you can select how to deal with
|
||||
each individual library.
|
||||
|
||||
To build with GnuTLS support instead of OpenSSL for SSL/TLS, note that
|
||||
you need to use both --without-ssl and --with-gnutls.
|
||||
To build with GnuTLS for SSL/TLS, use both --without-ssl and
|
||||
--with-gnutls.
|
||||
|
||||
To build with yassl support instead of OpenSSL or GnuTLS, you must build
|
||||
yassl with its OpenSSL emulation enabled and point to that directory root
|
||||
with configure --with-ssl.
|
||||
To build with Cyassl for SSL/TLS, use both --without-ssl and
|
||||
--with-cyassl.
|
||||
|
||||
To build with NSS support instead of OpenSSL for SSL/TLS, note that
|
||||
you need to use both --without-ssl and --with-nss.
|
||||
To build with NSS for SSL/TLS, use both --without-ssl and --with-nss.
|
||||
|
||||
To build with PolarSSL support instead of OpenSSL for SSL/TLS, note that
|
||||
you need to use both --without-ssl and --with-polarssl.
|
||||
To build with PolarSSL for SSL/TLS, use both --without-ssl and
|
||||
--with-polarssl.
|
||||
|
||||
To build with axTLS support instead of OpenSSL for TLS, note that you
|
||||
need to use both --without-ssl and --with-axtls.
|
||||
To build with axTLS for SSL/TLS, use both --without-ssl and --with-axtls.
|
||||
|
||||
To get GSSAPI support, build with --with-gssapi and have the MIT or
|
||||
Heimdal Kerberos 5 packages installed.
|
||||
@@ -157,6 +154,9 @@ UNIX
|
||||
To get support for SCP and SFTP, build with --with-libssh2 and have
|
||||
libssh2 0.16 or later installed.
|
||||
|
||||
To get Metalink support, build with --with-libmetalink and have the
|
||||
libmetalink packages installed.
|
||||
|
||||
SPECIAL CASES
|
||||
-------------
|
||||
Some versions of uClibc require configuring with CPPFLAGS=-D_GNU_SOURCE=1
|
||||
@@ -197,6 +197,9 @@ Win32
|
||||
first to rebuild every single library your app uses as well as your
|
||||
app using the debug multithreaded dynamic C runtime.
|
||||
|
||||
If you get linkage errors read section 5.7 of the FAQ document.
|
||||
|
||||
|
||||
MingW32
|
||||
-------
|
||||
|
||||
@@ -217,9 +220,9 @@ Win32
|
||||
adjust as necessary. It is also possible to override these paths with
|
||||
environment variables, for example:
|
||||
|
||||
set ZLIB_PATH=c:\zlib-1.2.5
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8r
|
||||
set LIBSSH2_PATH=c:\libssh2-1.2.8
|
||||
set ZLIB_PATH=c:\zlib-1.2.8
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8y
|
||||
set LIBSSH2_PATH=c:\libssh2-1.4.3
|
||||
|
||||
ATTENTION: if you want to build with libssh2 support you have to use latest
|
||||
version 0.17 - previous versions will NOT work with 7.17.0 and later!
|
||||
@@ -320,7 +323,7 @@ Win32
|
||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||
variable to the location of zlib.h and zlib.lib, for example:
|
||||
|
||||
set ZLIB_PATH=c:\zlib-1.2.5
|
||||
set ZLIB_PATH=c:\zlib-1.2.8
|
||||
|
||||
Then run 'nmake vc-zlib' in curl's root directory.
|
||||
|
||||
@@ -334,7 +337,7 @@ Win32
|
||||
Before running nmake define the OPENSSL_PATH environment variable with
|
||||
the root/base directory of OpenSSL, for example:
|
||||
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8q
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8y
|
||||
|
||||
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
||||
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
||||
@@ -356,7 +359,7 @@ Win32
|
||||
source distribution archive to allow proper building of the two included
|
||||
projects, the libcurl library and the curl tool.
|
||||
|
||||
1) Open the vc6curl.dsw workspace with MSVC6's IDE.
|
||||
1) Open the vs/vc6/vc6curl.dsw workspace with MSVC6's IDE.
|
||||
2) Select 'Build' from top menu.
|
||||
3) Select 'Batch Build' from dropdown menu.
|
||||
4) Make sure that the eight project configurations are 'checked'.
|
||||
@@ -364,12 +367,12 @@ Win32
|
||||
6) Once the eight project configurations are built you are done.
|
||||
|
||||
Dynamic and static libcurl libraries are built in debug and release flavours,
|
||||
and can be located each one in its own subdirectory, DLL-Debug, DLL-Release,
|
||||
LIB-Debug and LIB-Release, all of them below the 'lib' subdirectory.
|
||||
and can be located each one in its own subdirectory, dll-debug, dll-release,
|
||||
lib-debug and lib-release, all of them below the 'vs/vc6/lib' subdirectory.
|
||||
|
||||
In the same way four curl executables are created, each using its respective
|
||||
library. The resulting curl executables are located in its own subdirectory,
|
||||
DLL-Debug, DLL-Release, LIB-Debug and LIB-Release, below the 'src' subdir.
|
||||
dll-debug, dll-release, lib-debug and lib-release, below 'vs/vc6/src' subdir.
|
||||
|
||||
These reference VC++ 6.0 configurations are generated using the dynamic CRT.
|
||||
|
||||
@@ -461,7 +464,7 @@ Win32
|
||||
possibilities:
|
||||
|
||||
- Modify lib/config-win32.h
|
||||
- Modify lib/setup.h
|
||||
- Modify lib/curl_setup.h
|
||||
- Modify lib/Makefile.vc6
|
||||
- Add defines to Project/Settings/C/C++/General/Preprocessor Definitions
|
||||
in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project.
|
||||
@@ -503,6 +506,38 @@ Win32
|
||||
dynamic import symbols.
|
||||
|
||||
|
||||
Apple iOS and Mac OS X
|
||||
======================
|
||||
On recent Apple operating systems, curl can be built to use Apple's
|
||||
SSL/TLS implementation, Secure Transport, instead of OpenSSL. To build with
|
||||
Secure Transport for SSL/TLS, use the configure option --with-darwinssl. (It
|
||||
is not necessary to use the option --without-ssl.) This feature requires iOS
|
||||
5.0 or later, or OS X 10.5 ("Leopard") or later.
|
||||
|
||||
When Secure Transport is in use, the curl options --cacert and --capath and
|
||||
their libcurl equivalents, will be ignored, because Secure Transport uses
|
||||
the certificates stored in the Keychain to evaluate whether or not to trust
|
||||
the server. This, of course, includes the root certificates that ship with
|
||||
the OS. The --cert and --engine options, and their libcurl equivalents, are
|
||||
currently unimplemented in curl with Secure Transport.
|
||||
|
||||
For OS X users: In OS X 10.8 ("Mountain Lion"), Apple made a major
|
||||
overhaul to the Secure Transport API that, among other things, added
|
||||
support for the newer TLS 1.1 and 1.2 protocols. To get curl to support
|
||||
TLS 1.1 and 1.2, you must build curl on Mountain Lion or later, or by
|
||||
using the equivalent SDK. If you set the MACOSX_DEPLOYMENT_TARGET
|
||||
environmental variable to an earlier version of OS X prior to building curl,
|
||||
then curl will use the new Secure Transport API on Mountain Lion and later,
|
||||
and fall back on the older API when the same curl binary is executed on
|
||||
older cats. For example, running these commands in curl's directory in the
|
||||
shell will build the code such that it will run on cats as old as OS X 10.6
|
||||
("Snow Leopard") (using bash):
|
||||
|
||||
export MACOSX_DEPLOYMENT_TARGET="10.6"
|
||||
./configure --with-darwinssl
|
||||
make
|
||||
|
||||
|
||||
IBM OS/2
|
||||
========
|
||||
Building under OS/2 is not much different from building under unix.
|
||||
@@ -540,7 +575,7 @@ VMS
|
||||
Curl seems to work with FTP & HTTP other protocols are not tested. (the
|
||||
perl http/ftp testing server supplied as testing too cannot work on VMS
|
||||
because vms has no concept of fork(). [ I tried to give it a whack, but
|
||||
thats of no use.
|
||||
that's of no use.
|
||||
|
||||
SSL stuff has not been ported.
|
||||
|
||||
@@ -673,7 +708,7 @@ NetWare
|
||||
you can find precompiled packages at:
|
||||
http://www.gknw.net/development/ossl/netware/
|
||||
for CLIB-based builds OpenSSL 0.9.8h or later is required - earlier versions
|
||||
dont support buildunf with CLIB BSD sockets.
|
||||
don't support building with CLIB BSD sockets.
|
||||
- optional SSH2 sources (version 0.17 or later);
|
||||
|
||||
Set a search path to your compiler, linker and tools; on Linux make
|
||||
@@ -840,7 +875,44 @@ VxWorks
|
||||
|
||||
Android
|
||||
=======
|
||||
See the build notes in the Android.mk file.
|
||||
Method using the static makefile:
|
||||
- see the build notes in the packages/Android/Android.mk file.
|
||||
|
||||
Method using a configure cross-compile (tested with Android NDK r7c, r8):
|
||||
- prepare the toolchain of the Android NDK for standalone use; this can
|
||||
be done by invoking the script:
|
||||
./build/tools/make-standalone-toolchain.sh
|
||||
which creates a usual cross-compile toolchain. Lets assume that you put
|
||||
this toolchain below /opt then invoke configure with something like:
|
||||
export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH
|
||||
./configure --host=arm-linux-androideabi [more configure options]
|
||||
make
|
||||
- if you want to compile directly from our GIT repo you might run into
|
||||
this issue with older automake stuff:
|
||||
checking host system type...
|
||||
Invalid configuration `arm-linux-androideabi':
|
||||
system `androideabi' not recognized
|
||||
configure: error: /bin/sh ./config.sub arm-linux-androideabi failed
|
||||
this issue can be fixed with using more recent versions of config.sub
|
||||
and config.guess which can be obtained here:
|
||||
http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree
|
||||
you need to replace your system-own versions which usually can be
|
||||
found in your automake folder:
|
||||
find /usr -name config.sub
|
||||
|
||||
Wrapper for pkg-config
|
||||
- In order to make proper use of pkg-config so that configure is able to
|
||||
find all dependencies you should create a wrapper script for pkg-config;
|
||||
file /opt/arm-linux-androideabi-4.4.3/bin/arm-linux-androideabi-pkg-config:
|
||||
|
||||
#!/bin/sh
|
||||
SYSROOT=$(dirname ${0%/*})/sysroot
|
||||
export PKG_CONFIG_DIR=
|
||||
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/local/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
|
||||
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
|
||||
exec pkg-config "$@"
|
||||
|
||||
also create a copy or symlink with name arm-unknown-linux-androideabi-pkg-config.
|
||||
|
||||
|
||||
CROSS COMPILE
|
||||
@@ -927,8 +999,9 @@ REDUCING SIZE
|
||||
The GNU compiler and linker have a number of options that can reduce the
|
||||
size of the libcurl dynamic libraries on some platforms even further.
|
||||
Specify them by providing appropriate CFLAGS and LDFLAGS variables on the
|
||||
configure command-line:
|
||||
CFLAGS="-ffunction-sections -fdata-sections" \
|
||||
configure command-line, e.g.
|
||||
CFLAGS="-Os -ffunction-sections -fdata-sections \
|
||||
-fno-unwind-tables -fno-asynchronous-unwind-tables" \
|
||||
LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections"
|
||||
|
||||
Be sure also to strip debugging symbols from your binaries after
|
||||
@@ -938,9 +1011,9 @@ REDUCING SIZE
|
||||
.comment section).
|
||||
|
||||
Using these techniques it is possible to create a basic HTTP-only shared
|
||||
libcurl library for i386 Linux platforms that is only 101 KiB in size, and
|
||||
an FTP-only library that is 105 KiB in size (as of libcurl version 7.21.5,
|
||||
using gcc 4.4.3).
|
||||
libcurl library for i386 Linux platforms that is only 106 KiB in size, and
|
||||
an FTP-only library that is 108 KiB in size (as of libcurl version 7.27.0,
|
||||
using gcc 4.6.3).
|
||||
|
||||
You may find that statically linking libcurl to your application will
|
||||
result in a lower total size than dynamically linking.
|
||||
@@ -972,9 +1045,9 @@ PORTS
|
||||
- Alpha OpenVMS V7.1-1H2
|
||||
- Alpha Tru64 v5.0 5.1
|
||||
- AVR32 Linux
|
||||
- ARM Android 1.5, 2.1
|
||||
- ARM Android 1.5, 2.1, 2.3, 3.2, 4.x
|
||||
- ARM INTEGRITY
|
||||
- ARM iPhone OS
|
||||
- ARM iOS
|
||||
- Cell Linux
|
||||
- Cell Cell OS
|
||||
- HP-PA HP-UX 9.X 10.X 11.X
|
||||
@@ -1012,6 +1085,7 @@ PORTS
|
||||
- i386 HURD
|
||||
- i386 Haiku OS
|
||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6
|
||||
- i386 Mac OS X
|
||||
- i386 MINIX 3.1
|
||||
- i386 NetBSD
|
||||
- i386 Novell NetWare
|
||||
@@ -1042,6 +1116,7 @@ GNU GSS http://www.gnu.org/software/gss/
|
||||
GnuTLS http://www.gnu.org/software/gnutls/
|
||||
Heimdal http://www.pdc.kth.se/heimdal/
|
||||
libidn http://www.gnu.org/software/libidn/
|
||||
libmetalink https://launchpad.net/libmetalink/
|
||||
libssh2 http://www.libssh2.org/
|
||||
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||
NSS http://www.mozilla.org/projects/security/pki/nss/
|
||||
|
@@ -11,13 +11,32 @@ Building with CMake
|
||||
This document describes how to compile, build and install curl and libcurl
|
||||
from source code using the CMake build tool. To build with CMake, you will
|
||||
of course have to first install CMake. The minimum required version of
|
||||
CMake is specifed in the file CMakeLists.txt found in the top of the curl
|
||||
CMake is specified in the file CMakeLists.txt found in the top of the curl
|
||||
source tree. Once the correct version of CMake is installed you can follow
|
||||
the instructions below for the platform you are building on.
|
||||
|
||||
CMake builds can be configured either from the command line, or from one
|
||||
of CMake's GUI's.
|
||||
|
||||
Current flaws in the curl CMake build
|
||||
=====================================
|
||||
|
||||
Missing features in the cmake build:
|
||||
|
||||
- Builds libcurl without large file support
|
||||
- It doesn't build src/tool_hugehelp.c which creates the --manual output
|
||||
- Can't select which SSL library to build with, only OpenSSL
|
||||
- Doesn't build with SCP and SFTP support (libssh2)
|
||||
- Doesn't allow different resolver backends (no c-ares build support)
|
||||
- No RTMP support built
|
||||
- Doesn't allow build curl and libcurl debug enabled
|
||||
- Doesn't allow a custom CA bundle path
|
||||
- Doesn't allow you to disable specific protocols from the build
|
||||
- Doesn't properly enable IPv6 support by default
|
||||
- Doesn't find or use krb4 or GSS
|
||||
- Rebuilds test files too eagerly, but still can't run the tests
|
||||
|
||||
|
||||
Important notice
|
||||
==================
|
||||
If you got your curl sources from a distribution tarball, make sure to
|
||||
@@ -31,27 +50,33 @@ Important notice
|
||||
|
||||
Command Line CMake
|
||||
==================
|
||||
A command line build of Curl is similar to the autotools build of Curl. It
|
||||
A CMake build of curl is similar to the autotools build of curl. It
|
||||
consists of the following steps after you have unpacked the source.
|
||||
# 1st create an out of source build tree parallel to the curl source
|
||||
# tree and change into that directory
|
||||
mkdir curl-build
|
||||
cd curl-build
|
||||
# now run CMake from the build tree, giving it the path to the top of
|
||||
# the Curl source tree. CMake will pick a compiler for you. If you
|
||||
# want to specifiy the compile, you can set the CC environment
|
||||
# variable prior to running CMake.
|
||||
cmake ../curl
|
||||
make
|
||||
# currently make test is not implemented
|
||||
#make test
|
||||
# Install to default location:
|
||||
make install
|
||||
|
||||
1. Create an out of source build tree parallel to the curl source
|
||||
tree and change into that directory
|
||||
|
||||
$ mkdir curl-build
|
||||
$ cd curl-build
|
||||
|
||||
2. Run CMake from the build tree, giving it the path to the top of
|
||||
the curl source tree. CMake will pick a compiler for you. If you
|
||||
want to specify the compile, you can set the CC environment
|
||||
variable prior to running CMake.
|
||||
|
||||
$ cmake ../curl
|
||||
$ make
|
||||
|
||||
3. Install to default location:
|
||||
|
||||
$ make install
|
||||
|
||||
(The teste suit does not work with the cmake build)
|
||||
|
||||
ccmake
|
||||
=========
|
||||
CMake comes with a curses based interface called ccmake. To run ccmake on
|
||||
a curl use the instructions for the command line cmake, but substitue
|
||||
a curl use the instructions for the command line cmake, but substitute
|
||||
ccmake ../curl for cmake ../curl. This will bring up a curses interface
|
||||
with instructions on the bottom of the screen. You can press the "c" key
|
||||
to configure the project, and the "g" key to generate the project. After
|
||||
@@ -65,7 +90,7 @@ cmake-gui
|
||||
the curl source tree.
|
||||
2. Fill in the "Where to build the binaries" combo box with the path
|
||||
to the directory for your build tree, ideally this should not be the
|
||||
same as the source tree, but a parallel diretory called curl-build or
|
||||
same as the source tree, but a parallel directory called curl-build or
|
||||
something similar.
|
||||
3. Once the source and binary directories are specified, press the
|
||||
"Configure" button.
|
||||
@@ -73,5 +98,5 @@ cmake-gui
|
||||
5. At this point you can change any of the options presented in the
|
||||
GUI. Once you have selected all the options you want, click the
|
||||
"Generate" button.
|
||||
6. Run the native build tool that you used CMake to genratate.
|
||||
6. Run the native build tool that you used CMake to generate.
|
||||
|
||||
|
@@ -26,7 +26,7 @@ exists for a Unix/linux command line environments. This is of little help when
|
||||
it comes to Windows O/S.
|
||||
|
||||
Secondly the help that does exist for the Windows O/S focused around mingw
|
||||
thru a command line argument environment.
|
||||
through a command line argument environment.
|
||||
|
||||
You may ask "Why is this a problem?"
|
||||
|
||||
|
130
docs/INTERNALS
130
docs/INTERNALS
@@ -42,20 +42,17 @@ Portability
|
||||
cyassl 2.0.0
|
||||
openldap 2.0
|
||||
MIT krb5 lib 1.2.4
|
||||
qsossl V5R2M0
|
||||
NSS 3.11.x
|
||||
qsossl V5R3M0
|
||||
NSS 3.12.x
|
||||
axTLS 1.2.7
|
||||
Heimdal ?
|
||||
|
||||
* = only partly functional, but that's due to bugs in the third party lib, not
|
||||
because of libcurl code
|
||||
|
||||
On systems where configure runs, we aim at working on them all - if they have
|
||||
a suitable C compiler. On systems that don't run configure, we strive to keep
|
||||
curl running fine on:
|
||||
|
||||
Windows 98
|
||||
AS/400 V5R2M0
|
||||
AS/400 V5R3M0
|
||||
Symbian 9.1
|
||||
Windows CE ?
|
||||
TPF ?
|
||||
@@ -104,9 +101,9 @@ Windows vs Unix
|
||||
Inside the source code, We make an effort to avoid '#ifdef [Your OS]'. All
|
||||
conditionals that deal with features *should* instead be in the format
|
||||
'#ifdef HAVE_THAT_WEIRD_FUNCTION'. Since Windows can't run configure scripts,
|
||||
we maintain two curl_config-win32.h files (one in lib/ and one in src/) that
|
||||
are supposed to look exactly as a curl_config.h file would have looked like on
|
||||
a Windows machine!
|
||||
we maintain a curl_config-win32.h file in lib directory that is supposed to
|
||||
look exactly as a curl_config.h file would have looked like on a Windows
|
||||
machine!
|
||||
|
||||
Generally speaking: always remember that this will be compiled on dozens of
|
||||
operating systems. Don't walk on the edge.
|
||||
@@ -114,6 +111,9 @@ Windows vs Unix
|
||||
Library
|
||||
=======
|
||||
|
||||
(See LIBCURL-STRUCTS for a separate document describing all major internal
|
||||
structs and their purposes.)
|
||||
|
||||
There are plenty of entry points to the library, namely each publicly defined
|
||||
function that libcurl offers to applications. All of those functions are
|
||||
rather small and easy-to-follow. All the ones prefixed with 'curl_easy' are
|
||||
@@ -138,16 +138,18 @@ Library
|
||||
options is documented in the man page. This function mainly sets things in
|
||||
the 'SessionHandle' struct.
|
||||
|
||||
curl_easy_perform() does a whole lot of things:
|
||||
curl_easy_perform() is just a wrapper function that makes use of the multi
|
||||
API. It basically curl_multi_init(), curl_multi_add_handle(),
|
||||
curl_multi_wait(), and curl_multi_perform() until the transfer is done and
|
||||
then returns.
|
||||
|
||||
It starts off in the lib/easy.c file by calling Curl_perform() and the main
|
||||
work then continues in lib/url.c. The flow continues with a call to
|
||||
Curl_connect() to connect to the remote site.
|
||||
Some of the most important key functions in url.c are called from multi.c
|
||||
when certain key steps are to be made in the transfer operation.
|
||||
|
||||
o Curl_connect()
|
||||
|
||||
... analyzes the URL, it separates the different components and connects to
|
||||
the remote host. This may involve using a proxy and/or using SSL. The
|
||||
Analyzes the URL, it separates the different components and connects to the
|
||||
remote host. This may involve using a proxy and/or using SSL. The
|
||||
Curl_resolv() function in lib/hostip.c is used for looking up host names
|
||||
(it does then use the proper underlying method, which may vary between
|
||||
platforms and builds).
|
||||
@@ -163,10 +165,7 @@ Library
|
||||
o Curl_do()
|
||||
|
||||
Curl_do() makes sure the proper protocol-specific function is called. The
|
||||
functions are named after the protocols they handle. Curl_ftp(),
|
||||
Curl_http(), Curl_dict(), etc. They all reside in their respective files
|
||||
(ftp.c, http.c and dict.c). HTTPS is handled by Curl_http() and FTPS by
|
||||
Curl_ftp().
|
||||
functions are named after the protocols they handle.
|
||||
|
||||
The protocol-specific functions of course deal with protocol-specific
|
||||
negotiations and setup. They have access to the Curl_sendf() (from
|
||||
@@ -185,10 +184,9 @@ Library
|
||||
be called with some basic info about the upcoming transfer: what socket(s)
|
||||
to read/write and the expected file transfer sizes (if known).
|
||||
|
||||
o Transfer()
|
||||
o Curl_readwrite()
|
||||
|
||||
Curl_perform() then calls Transfer() in lib/transfer.c that performs the
|
||||
entire file transfer.
|
||||
Called during the transfer of the actual protocol payload.
|
||||
|
||||
During transfer, the progress functions in lib/progress.c are called at a
|
||||
frequent interval (or at the user's choice, a specified callback might get
|
||||
@@ -210,33 +208,11 @@ Library
|
||||
used. This function is only used when we are certain that no more transfers
|
||||
is going to be made on the connection. It can be also closed by force, or
|
||||
it can be called to make sure that libcurl doesn't keep too many
|
||||
connections alive at the same time (there's a default amount of 5 but that
|
||||
can be changed with the CURLOPT_MAXCONNECTS option).
|
||||
connections alive at the same time.
|
||||
|
||||
This function cleans up all resources that are associated with a single
|
||||
connection.
|
||||
|
||||
Curl_perform() is the function that does the main "connect - do - transfer -
|
||||
done" loop. It loops if there's a Location: to follow.
|
||||
|
||||
When completed, the curl_easy_cleanup() should be called to free up used
|
||||
resources. It runs Curl_disconnect() on all open connectons.
|
||||
|
||||
A quick roundup on internal function sequences (many of these call
|
||||
protocol-specific function-pointers):
|
||||
|
||||
Curl_connect - connects to a remote site and does initial connect fluff
|
||||
This also checks for an existing connection to the requested site and uses
|
||||
that one if it is possible.
|
||||
|
||||
Curl_do - starts a transfer
|
||||
Curl_handler::do_it() - transfers data
|
||||
Curl_done - ends a transfer
|
||||
|
||||
Curl_disconnect - disconnects from a remote site. This is called when the
|
||||
disconnect is really requested, which doesn't necessarily have to be
|
||||
exactly after curl_done in case we want to keep the connection open for
|
||||
a while.
|
||||
|
||||
HTTP(S)
|
||||
|
||||
@@ -319,48 +295,38 @@ Persistent Connections
|
||||
hold connection-oriented data. It is meant to hold the root data as well as
|
||||
all the options etc that the library-user may choose.
|
||||
o The 'SessionHandle' struct holds the "connection cache" (an array of
|
||||
pointers to 'connectdata' structs). There's one connectdata struct
|
||||
allocated for each connection that libcurl knows about. Note that when you
|
||||
use the multi interface, the multi handle will hold the connection cache
|
||||
and not the particular easy handle. This of course to allow all easy handles
|
||||
in a multi stack to be able to share and re-use connections.
|
||||
pointers to 'connectdata' structs).
|
||||
o This enables the 'curl handle' to be reused on subsequent transfers.
|
||||
o When we are about to perform a transfer with curl_easy_perform(), we first
|
||||
check for an already existing connection in the cache that we can use,
|
||||
otherwise we create a new one and add to the cache. If the cache is full
|
||||
already when we add a new connection, we close one of the present ones. We
|
||||
select which one to close dependent on the close policy that may have been
|
||||
previously set.
|
||||
o When the transfer operation is complete, we try to leave the connection
|
||||
open. Particular options may tell us not to, and protocols may signal
|
||||
closure on connections and then we don't keep it open of course.
|
||||
o When libcurl is told to perform a transfer, it first checks for an already
|
||||
existing connection in the cache that we can use. Otherwise it creates a
|
||||
new one and adds that the cache. If the cache is full already when a new
|
||||
conncetion is added added, it will first close the oldest unused one.
|
||||
o When the transfer operation is complete, the connection is left
|
||||
open. Particular options may tell libcurl not to, and protocols may signal
|
||||
closure on connections and then they won't be kept open of course.
|
||||
o When curl_easy_cleanup() is called, we close all still opened connections,
|
||||
unless of course the multi interface "owns" the connections.
|
||||
|
||||
You do realize that the curl handle must be re-used in order for the
|
||||
persistent connections to work.
|
||||
The curl handle must be re-used in order for the persistent connections to
|
||||
work.
|
||||
|
||||
multi interface/non-blocking
|
||||
============================
|
||||
|
||||
We make an effort to provide a non-blocking interface to the library, the
|
||||
multi interface. To make that interface work as good as possible, no
|
||||
low-level functions within libcurl must be written to work in a blocking
|
||||
manner.
|
||||
The multi interface is a non-blocking interface to the library. To make that
|
||||
interface work as good as possible, no low-level functions within libcurl
|
||||
must be written to work in a blocking manner. (There are still a few spots
|
||||
violating this rule.)
|
||||
|
||||
One of the primary reasons we introduced c-ares support was to allow the name
|
||||
resolve phase to be perfectly non-blocking as well.
|
||||
|
||||
The ultimate goal is to provide the easy interface simply by wrapping the
|
||||
multi interface functions and thus treat everything internally as the multi
|
||||
interface is the single interface we have.
|
||||
|
||||
The FTP and the SFTP/SCP protocols are thus perfect examples of how we adapt
|
||||
and adjust the code to allow non-blocking operations even on multi-stage
|
||||
protocols. They are built around state machines that return when they could
|
||||
block waiting for data. The DICT, LDAP and TELNET protocols are crappy
|
||||
examples and they are subject for rewrite in the future to better fit the
|
||||
libcurl protocol family.
|
||||
The FTP and the SFTP/SCP protocols are examples of how we adapt and adjust
|
||||
the code to allow non-blocking operations even on multi-stage command-
|
||||
response protocols. They are built around state machines that return when
|
||||
they would otherwise block waiting for data. The DICT, LDAP and TELNET
|
||||
protocols are crappy examples and they are subject for rewrite in the future
|
||||
to better fit the libcurl protocol family.
|
||||
|
||||
SSL libraries
|
||||
=============
|
||||
@@ -411,12 +377,12 @@ API/ABI
|
||||
Client
|
||||
======
|
||||
|
||||
main() resides in src/main.c together with most of the client code.
|
||||
main() resides in src/tool_main.c.
|
||||
|
||||
src/hugehelp.c is automatically generated by the mkhelp.pl perl script to
|
||||
display the complete "manual" and the src/urlglob.c file holds the functions
|
||||
used for the URL-"globbing" support. Globbing in the sense that the {} and []
|
||||
expansion stuff is there.
|
||||
src/tool_hugehelp.c is automatically generated by the mkhelp.pl perl script
|
||||
to display the complete "manual" and the src/tool_urlglob.c file holds the
|
||||
functions used for the URL-"globbing" support. Globbing in the sense that the
|
||||
{} and [] expansion stuff is there.
|
||||
|
||||
The client mostly messes around to setup its 'config' struct properly, then
|
||||
it calls the curl_easy_*() functions of the library and when it gets back
|
||||
@@ -428,8 +394,8 @@ Client
|
||||
curl_easy_getinfo() function to extract useful information from the curl
|
||||
session.
|
||||
|
||||
Recent versions may loop and do all this several times if many URLs were
|
||||
specified on the command line or config file.
|
||||
It may loop and do all this several times if many URLs were specified on the
|
||||
command line or config file.
|
||||
|
||||
Memory Debugging
|
||||
================
|
||||
|
@@ -3,13 +3,45 @@ join in and help us correct one or more of these! Also be sure to check the
|
||||
changelog of the current development status, as one or more of these problems
|
||||
may have been fixed since this was written!
|
||||
|
||||
84. CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS
|
||||
backends, so relying on this information in a generic app is flaky.
|
||||
|
||||
83. curl is unable to load non-default openssl engines, because openssl isn't
|
||||
initialized properly. This seems to require OpenSSL_config() or
|
||||
CONF_modules_load_file() to be used by libcurl but the first seems to not
|
||||
work and we've gotten not reports from tests with the latter. Possibly we
|
||||
need to discuss with OpenSSL developers how this is supposed to be done. We
|
||||
need users with actual external openssl engines for testing to work on this.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1208
|
||||
|
||||
82. When building with the Windows Borland compiler, it fails because the
|
||||
"tlib" tool doesn't support hyphens (minus signs) in file names and we have
|
||||
such in the build.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1222
|
||||
|
||||
81. When using -J (with -O), automaticly resumed downloading together with "-C
|
||||
-" fails. Without -J the same command line works! This happens because the
|
||||
resume logic is worked out before the target file name (and thus its
|
||||
pre-transfer size) has been figured out!
|
||||
http://curl.haxx.se/bug/view.cgi?id=1169
|
||||
|
||||
80. Curl doesn't recognize certificates in DER format in keychain, but it
|
||||
works with PEM.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1065
|
||||
|
||||
79. SMTP. When sending data to multiple recipients, curl will abort and return
|
||||
failure if one of the recipients indicate failure (on the "RCPT TO"
|
||||
command). Ordinary mail programs would proceed and still send to the ones
|
||||
that can receive data. This is subject for change in the future.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1116
|
||||
|
||||
78. curl and libcurl don't always signal the client properly when "sending"
|
||||
zero bytes files - it makes for example the command line client not creating
|
||||
any file at all. Like when using FTP.
|
||||
http://curl.haxx.se/bug/view.cgi?id=3438362
|
||||
http://curl.haxx.se/bug/view.cgi?id=1063
|
||||
|
||||
77. CURLOPT_FORBID_REUSE on a handle prevents NTLM from working since it
|
||||
"absuses" the underlying connection re-use system and if connections are
|
||||
"abuses" the underlying connection re-use system and if connections are
|
||||
forced to close they break the NTLM support.
|
||||
|
||||
76. The SOCKET type in Win64 is 64 bits large (and thus so is curl_socket_t on
|
||||
@@ -17,16 +49,21 @@ may have been fixed since this was written!
|
||||
curl_easy_getinfo() to return a socket properly with the CURLINFO_LASTSOCKET
|
||||
option as for all other operating systems.
|
||||
|
||||
75. NTLM authentication involving unicode user name or password.
|
||||
75. NTLM authentication involving unicode user name or password only works
|
||||
properly if built with UNICODE defined together with the schannel/winssl
|
||||
backend. The original problem was mentioned in:
|
||||
http://curl.haxx.se/mail/lib-2009-10/0024.html
|
||||
http://curl.haxx.se/bug/view.cgi?id=2944325
|
||||
http://curl.haxx.se/bug/view.cgi?id=896
|
||||
|
||||
The schannel version verified to work as mentioned in
|
||||
http://curl.haxx.se/mail/lib-2012-07/0073.html
|
||||
|
||||
73. if a connection is made to a FTP server but the server then just never
|
||||
sends the 220 response or otherwise is dead slow, libcurl will not
|
||||
acknowledge the connection timeout during that phase but only the "real"
|
||||
timeout - which may surprise users as it is probably considered to be the
|
||||
connect phase to most people. Brought up (and is being misunderstood) in:
|
||||
http://curl.haxx.se/bug/view.cgi?id=2844077
|
||||
http://curl.haxx.se/bug/view.cgi?id=856
|
||||
|
||||
72. "Pausing pipeline problems."
|
||||
http://curl.haxx.se/mail/lib-2009-07/0214.html
|
||||
@@ -44,7 +81,7 @@ may have been fixed since this was written!
|
||||
http://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02
|
||||
|
||||
66. When using telnet, the time limitation options don't work.
|
||||
http://curl.haxx.se/bug/view.cgi?id=2818950
|
||||
http://curl.haxx.se/bug/view.cgi?id=846
|
||||
|
||||
65. When doing FTP over a socks proxy or CONNECT through HTTP proxy and the
|
||||
multi interface is used, libcurl will fail if the (passive) TCP connection
|
||||
@@ -70,19 +107,12 @@ may have been fixed since this was written!
|
||||
CURLOPT_FAILONERROR with FTP to detect if a file exists or not, but it is
|
||||
not working: http://curl.haxx.se/mail/lib-2008-07/0295.html
|
||||
|
||||
57. On VMS-Alpha: When using an http-file-upload the file is not sent to the
|
||||
Server with the correct content-length. Sending a file with 511 or less
|
||||
bytes, content-length 512 is used. Sending a file with 513 - 1023 bytes,
|
||||
content-length 1024 is used. Files with a length of a multiple of 512 Bytes
|
||||
show the correct content-length. Only these files work for upload.
|
||||
http://curl.haxx.se/bug/view.cgi?id=2057858
|
||||
|
||||
56. When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP
|
||||
server using the multi interface, the commands are not being sent correctly
|
||||
and instead the connection is "cancelled" (the operation is considered done)
|
||||
prematurely. There is a half-baked (busy-looping) patch provided in the bug
|
||||
report but it cannot be accepted as-is. See
|
||||
http://curl.haxx.se/bug/view.cgi?id=2006544
|
||||
http://curl.haxx.se/bug/view.cgi?id=748
|
||||
|
||||
55. libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's
|
||||
library header files exporting symbols/macros that should be kept private
|
||||
@@ -106,12 +136,12 @@ may have been fixed since this was written!
|
||||
protocol code. This should be very rare.
|
||||
|
||||
43. There seems to be a problem when connecting to the Microsoft telnet server.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1720605
|
||||
http://curl.haxx.se/bug/view.cgi?id=649
|
||||
|
||||
41. When doing an operation over FTP that requires the ACCT command (but not
|
||||
when logging in), the operation will fail since libcurl doesn't detect this
|
||||
and thus fails to issue the correct command:
|
||||
http://curl.haxx.se/bug/view.cgi?id=1693337
|
||||
http://curl.haxx.se/bug/view.cgi?id=635
|
||||
|
||||
39. Steffen Rumler's Race Condition in Curl_proxyCONNECT:
|
||||
http://curl.haxx.se/mail/lib-2007-01/0045.html
|
||||
@@ -119,19 +149,12 @@ may have been fixed since this was written!
|
||||
38. Kumar Swamy Bhatt's problem in ftp/ssl "LIST" operation:
|
||||
http://curl.haxx.se/mail/lib-2007-01/0103.html
|
||||
|
||||
37. Having more than one connection to the same host when doing NTLM
|
||||
authentication (with performs multiple "passes" and authenticates a
|
||||
connection rather than a HTTP request), and particularly when using the
|
||||
multi interface, there's a risk that libcurl will re-use a wrong connection
|
||||
when doing the different passes in the NTLM negotiation and thus fail to
|
||||
negotiate (in seemingly mysterious ways).
|
||||
|
||||
35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very
|
||||
bad when used with the multi interface.
|
||||
|
||||
34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
|
||||
Also see #12. According to bug #1556528, even the SOCKS5 connect code does
|
||||
not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528,
|
||||
not do it right: http://curl.haxx.se/bug/view.cgi?id=604
|
||||
|
||||
31. "curl-config --libs" will include details set in LDFLAGS when configure is
|
||||
run that might be needed only for building libcurl. Further, curl-config
|
||||
@@ -146,28 +169,20 @@ may have been fixed since this was written!
|
||||
IDs in URLs to get around the problem of percent signs being
|
||||
special. According to the reporter, Firefox deals with the URL _with_ a
|
||||
percent letter (which seems like a blatant URL spec violation).
|
||||
libcurl supports zone IDs where the percent sign is URL-escaped (i.e. %25).
|
||||
|
||||
See http://curl.haxx.se/bug/view.cgi?id=1371118
|
||||
libcurl supports zone IDs where the percent sign is URL-escaped (i.e. %25):
|
||||
http://curl.haxx.se/bug/view.cgi?id=555
|
||||
|
||||
26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in
|
||||
"system context" will make it use wrong(?) user name - at least when compared
|
||||
to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
|
||||
to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=535
|
||||
|
||||
23. SOCKS-related problems:
|
||||
A) libcurl doesn't support SOCKS for IPv6.
|
||||
B) libcurl doesn't support FTPS over a SOCKS proxy.
|
||||
E) libcurl doesn't support active FTP over a SOCKS proxy
|
||||
|
||||
We probably have even more bugs and lack of features when a SOCKS proxy is
|
||||
used.
|
||||
|
||||
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
||||
complaining on "unaligned file size" on completion. The problem is related
|
||||
to VMS file structures and the perceived file sizes stat() returns. A
|
||||
possible fix would involve sending a "STRU VMS" command.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1156287
|
||||
|
||||
21. FTP ASCII transfers do not follow RFC959. They don't convert the data
|
||||
accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1
|
||||
clearly describes how this should be done:
|
||||
@@ -205,7 +220,7 @@ may have been fixed since this was written!
|
||||
10. To get HTTP Negotiate authentication to work fine, you need to provide a
|
||||
(fake) user name (this concerns both curl and the lib) because the code
|
||||
wrongly only considers authentication if there's a user name provided.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1004841. How?
|
||||
http://curl.haxx.se/bug/view.cgi?id=440 How?
|
||||
http://curl.haxx.se/mail/lib-2004-08/0182.html
|
||||
|
||||
8. Doing resumed upload over HTTP does not work with '-C -', because curl
|
||||
|
245
docs/LIBCURL-STRUCTS
Normal file
245
docs/LIBCURL-STRUCTS
Normal file
@@ -0,0 +1,245 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
Structs in libcurl
|
||||
|
||||
This document should cover 7.32.0 pretty accurately, but will make sense even
|
||||
for older and later versions as things don't change drastically that often.
|
||||
|
||||
1. The main structs in libcurl
|
||||
1.1 SessionHandle
|
||||
1.2 connectdata
|
||||
1.3 Curl_multi
|
||||
1.4 Curl_handler
|
||||
1.5 conncache
|
||||
1.6 Curl_share
|
||||
1.7 CookieInfo
|
||||
|
||||
==============================================================================
|
||||
|
||||
1. The main structs in libcurl
|
||||
|
||||
1.1 SessionHandle
|
||||
|
||||
The SessionHandle handle struct is the one returned to the outside in the
|
||||
external API as a "CURL *". This is usually known as an easy handle in API
|
||||
documentations and examples.
|
||||
|
||||
Information and state that is related to the actual connection is in the
|
||||
'connectdata' struct. When a transfer is about to be made, libcurl will
|
||||
either create a new connection or re-use an existing one. The particular
|
||||
connectdata that is used by this handle is pointed out by
|
||||
SessionHandle->easy_conn.
|
||||
|
||||
Data and information that regard this particular single transfer is put in
|
||||
the SingleRequest sub-struct.
|
||||
|
||||
When the SessionHandle struct is added to a multi handle, as it must be in
|
||||
order to do any transfer, the ->multi member will point to the Curl_multi
|
||||
struct it belongs to. The ->prev and ->next members will then be used by the
|
||||
multi code to keep a linked list of SessionHandle structs that are added to
|
||||
that same multi handle. libcurl always uses multi so ->multi *will* point to
|
||||
a Curl_multi when a transfer is in progress.
|
||||
|
||||
->mstate is the multi state of this particular SessionHandle. When
|
||||
multi_runsingle() is called, it will act on this handle according to which
|
||||
state it is in. The mstate is also what tells which sockets to return for a
|
||||
speicific SessionHandle when curl_multi_fdset() is called etc.
|
||||
|
||||
The libcurl source code generally use the name 'data' for the variable that
|
||||
points to the SessionHandle.
|
||||
|
||||
|
||||
1.2 connectdata
|
||||
|
||||
A general idea in libcurl is to keep connections around in a connection
|
||||
"cache" after they have been used in case they will be used again and then
|
||||
re-use an existing one instead of creating a new as it creates a significant
|
||||
performance boost.
|
||||
|
||||
Each 'connectdata' identifies a single physical conncetion to a server. If
|
||||
the connection can't be kept alive, the connection will be closed after use
|
||||
and then this struct can be removed from the cache and freed.
|
||||
|
||||
Thus, the same SessionHandle can be used multiple times and each time select
|
||||
another connectdata struct to use for the connection. Keep this in mind, as
|
||||
it is then important to consider if options or choices are based on the
|
||||
connection or the SessionHandle.
|
||||
|
||||
Functions in libcurl will assume that connectdata->data points to the
|
||||
SessionHandle that uses this connection.
|
||||
|
||||
As a special complexity, some protocols supported by libcurl require a
|
||||
special disconnect procedure that is more than just shutting down the
|
||||
socket. It can involve sending one or more commands to the server before
|
||||
doing so. Since connections are kept in the connection cache after use, the
|
||||
original SessionHandle may no longer be around when the time comes to shut
|
||||
down a particular connection. For this purpose, libcurl holds a special
|
||||
dummy 'closure_handle' SessionHandle in the Curl_multi struct to
|
||||
|
||||
FTP uses two TCP connections for a typical transfer but it keeps both in
|
||||
this single struct and thus can be considered a single connection for most
|
||||
internal concerns.
|
||||
|
||||
The libcurl source code generally use the name 'conn' for the variable that
|
||||
points to the connectdata.
|
||||
|
||||
|
||||
1.3 Curl_multi
|
||||
|
||||
Internally, the easy interface is implemented as a wrapper around multi
|
||||
interface functions. This makes everything multi interface.
|
||||
|
||||
Curl_multi is the multi handle struct exposed as "CURLM *" in external APIs.
|
||||
|
||||
This struct holds a list of SessionHandle structs that have been added to
|
||||
this handle with curl_multi_add_handle(). The start of the list is ->easyp
|
||||
and ->num_easy is a counter of added SessionHandles.
|
||||
|
||||
->msglist is a linked list of messages to send back when
|
||||
curl_multi_info_read() is called. Basically a node is added to that list
|
||||
when an individual SessionHandle's transfer has completed.
|
||||
|
||||
->hostcache points to the name cache. It is a hash table for looking up name
|
||||
to IP. The nodes have a limited life time in there and this cache is meant
|
||||
to reduce the time for when the same name is wanted within a short period of
|
||||
time.
|
||||
|
||||
->timetree points to a tree of SessionHandles, sorted by the remaining time
|
||||
until it should be checked - normally some sort of timeout. Each
|
||||
SessionHandle has one node in the tree.
|
||||
|
||||
->sockhash is a hash table to allow fast lookups of socket descriptor to
|
||||
which SessionHandle that uses that descriptor. This is necessary for the
|
||||
multi_socket API.
|
||||
|
||||
->conn_cache points to the connection cache. It keeps track of all
|
||||
connections that are kept after use. The cache has a maximum size.
|
||||
|
||||
->closure_handle is described in the 'connectdata' section.
|
||||
|
||||
The libcurl source code generally use the name 'multi' for the variable that
|
||||
points to the Curl_multi struct.
|
||||
|
||||
|
||||
1.4 Curl_handler
|
||||
|
||||
Each unique protocol that is supported by libcurl needs to provide at least
|
||||
one Curl_handler struct. It defines what the protocol is called and what
|
||||
functions the main code should call to deal with protocol specific issues.
|
||||
In general, there's a source file named [protocol].c in which there's a
|
||||
"struct Curl_handler Curl_handler_[protocol]" declared. In url.c there's
|
||||
then the main array with all individual Curl_handler structs pointed to from
|
||||
a single array which is scanned through when a URL is given to libcurl to
|
||||
work with.
|
||||
|
||||
->scheme is the URL scheme name, usually spelled out in uppercase. That's
|
||||
"HTTP" or "FTP" etc. SSL versions of the protcol need its own Curl_handler
|
||||
setup so HTTPS separate from HTTP.
|
||||
|
||||
->setup_connection is called to allow the protocol code to allocate protocol
|
||||
specific data that then gets associated with that SessionHandle for the rest
|
||||
of this transfer. It gets freed again at the end of the transfer. It will be
|
||||
called before the 'connectdata' for the transfer has been selected/created.
|
||||
Most protocols will allocate its private 'struct [PROTOCOL]' here and assign
|
||||
SessionHandle->req.protop to point to it.
|
||||
|
||||
->connect_it allows a protocol to do some specific actions after the TCP
|
||||
connect is done, that can still be considered part of the connection phase.
|
||||
|
||||
Some protocols will alter the connectdata->recv[] and connectdata->send[]
|
||||
function pointers in this function.
|
||||
|
||||
->connecting is similarly a function that keeps getting called as long as the
|
||||
protocol considers itself still in the connecting phase.
|
||||
|
||||
->do_it is the function called to issue the transfer request. What we call
|
||||
the DO action internally. If the DO is not enough and things need to be kept
|
||||
getting done for the entier DO sequence to complete, ->doing is then usually
|
||||
also provided. Each protocol that needs to do multiple commands or similar
|
||||
for do/doing need to implement their own state machines (see SCP, SFTP,
|
||||
FTP). Some protocols (only FTP and only due to historical reasons) has a
|
||||
separate piece of the DO state called DO_MORE.
|
||||
|
||||
->doing keeps getting called while issudeing the transfer request command(s)
|
||||
|
||||
->done gets called when the transfer is complete and DONE. That's after the
|
||||
main data has been transferred.
|
||||
|
||||
->do_more gets called doring the DO_MORE state. The FTP protocol uses this
|
||||
state when setting up the second connection.
|
||||
|
||||
->proto_getsock
|
||||
->doing_getsock
|
||||
->domore_getsock
|
||||
->perform_getsock
|
||||
Functions that return socket information. Which socket(s) to wait for which
|
||||
action(s) during the particular multi state.
|
||||
|
||||
->disconnect is called immediately before the TCP connection is shutdown.
|
||||
|
||||
->readwrite gets called during transfer to allow the protocol to do extra
|
||||
reads/writes
|
||||
|
||||
->defport is the default report TCP or UDP port this protocol uses
|
||||
|
||||
->protocol is one or more bits in the CURLPROTO_* set. The SSL versions have
|
||||
their "base" protocol set and then the SSL variation. Like "HTTP|HTTPS".
|
||||
|
||||
->flags is a bitmask with additional information about the protocol that will
|
||||
make it get treated differently by the generic engine:
|
||||
|
||||
PROTOPT_SSL - will make it connect and negotiate SSL
|
||||
|
||||
PROTOPT_DUAL - this protocol uses two connections
|
||||
|
||||
PROTOPT_CLOSEACTION - this protocol has actions to do before closing the
|
||||
connection. This flag is no longer used by code, yet still set for a bunch
|
||||
protocol handlers.
|
||||
|
||||
PROTOPT_DIRLOCK - "direction lock". The SSH protocols set this bit to
|
||||
limit which "direction" of socket actions that the main engine will
|
||||
concern itself about.
|
||||
|
||||
PROTOPT_NONETWORK - a protocol that doesn't use network (read file:)
|
||||
|
||||
PROTOPT_NEEDSPWD - this protocol needs a password and will use a default
|
||||
one unless one is provided
|
||||
|
||||
PROTOPT_NOURLQUERY - this protocol can't handle a query part on the URL
|
||||
(?foo=bar)
|
||||
|
||||
|
||||
1.5 conncache
|
||||
|
||||
Is a hash table with connections for later re-use. Each SessionHandle has
|
||||
a pointer to its connection cache. Each multi handle sets up a connection
|
||||
cache that all added SessionHandles share by default.
|
||||
|
||||
|
||||
1.6 Curl_share
|
||||
|
||||
The libcurl share API allocates a Curl_share struct, exposed to the external
|
||||
API as "CURLSH *".
|
||||
|
||||
The idea is that the struct can have a set of own versions of caches and
|
||||
pools and then by providing this struct in the CURLOPT_SHARE option, those
|
||||
specific SessionHandles will use the caches/pools that this share handle
|
||||
holds.
|
||||
|
||||
Then individual SessionHandle structs can be made to share specific things
|
||||
that they otherwise wouldn't, such as cookies.
|
||||
|
||||
The Curl_share struct can currently hold cookies, DNS cache and the SSL
|
||||
session cache.
|
||||
|
||||
|
||||
1.7 CookieInfo
|
||||
|
||||
This is the main cookie struct. It holds all known cookies and related
|
||||
information. Each SessionHandle has its own private CookieInfo even when
|
||||
they are added to a multi handle. They can be made to share cookies by using
|
||||
the share API.
|
@@ -13,6 +13,7 @@ MAIL ETIQUETTE
|
||||
1.4 Subscription Required
|
||||
1.5 Moderation of new posters
|
||||
1.6 Handling trolls and spam
|
||||
1.7 How to unsubscribe
|
||||
|
||||
2. Sending mail
|
||||
2.1 Reply or New Mail
|
||||
@@ -58,7 +59,7 @@ MAIL ETIQUETTE
|
||||
no way to read the reply, but to ask the one person the question. The one
|
||||
person consequently gets overloaded with mail.
|
||||
|
||||
If you really want to contact an individual and perhaps pay for his or her's
|
||||
If you really want to contact an individual and perhaps pay for his or her
|
||||
services, by all means go ahead, but if it's just another curl question,
|
||||
take it to a suitable list instead.
|
||||
|
||||
@@ -91,7 +92,7 @@ MAIL ETIQUETTE
|
||||
|
||||
1.6 Handling trolls and spam
|
||||
|
||||
Despite our good intensions and hard work to keep spam off the lists and to
|
||||
Despite our good intentions and hard work to keep spam off the lists and to
|
||||
maintain a friendly and positive atmosphere, there will be times when spam
|
||||
and or trolls get through.
|
||||
|
||||
@@ -110,6 +111,20 @@ MAIL ETIQUETTE
|
||||
|
||||
Don't feed the trolls!
|
||||
|
||||
1.7 How to unsubscribe
|
||||
|
||||
You unsubscribe the same way you subscribed in the first place. You go to
|
||||
the page for the particular mailing list you're subscribed to and you enter
|
||||
your email address and password and press the unsubscribe button.
|
||||
|
||||
Also, this information is included in the headers of every mail that is sent
|
||||
out to all curl related mailing lists and there's footer in each mail that
|
||||
links to the "admin" page on which you can unsubscribe and change other
|
||||
options.
|
||||
|
||||
You NEVER EVER email the mailing list requesting someone else to get you off
|
||||
the list.
|
||||
|
||||
|
||||
2. Sending mail
|
||||
|
||||
@@ -155,8 +170,8 @@ MAIL ETIQUETTE
|
||||
Q: What is the most annoying thing in e-mail?
|
||||
|
||||
Apart from the screwed up read order (especially when mixed together in a
|
||||
thread when some responds doing the mandaded bottom-posting style), it also
|
||||
makes it impossible to quote only parts of the original mail.
|
||||
thread when someone responds using the mandated bottom-posting style), it
|
||||
also makes it impossible to quote only parts of the original mail.
|
||||
|
||||
When you reply to a mail. You let the mail client insert the previous mail
|
||||
quoted. Then you put the cursor on the first line of the mail and you move
|
||||
|
112
docs/MANUAL
112
docs/MANUAL
@@ -19,7 +19,7 @@ SIMPLE USAGE
|
||||
|
||||
curl http://www.weirdserver.com:8000/
|
||||
|
||||
Get a list of a directory of an FTP site:
|
||||
Get a directory listing of an FTP site:
|
||||
|
||||
curl ftp://cool.haxx.se/
|
||||
|
||||
@@ -54,7 +54,7 @@ SIMPLE USAGE
|
||||
|
||||
DOWNLOAD TO A FILE
|
||||
|
||||
Get a web page and store in a local file:
|
||||
Get a web page and store in a local file with a specific name:
|
||||
|
||||
curl -o thatpage.html http://www.netscape.com/
|
||||
|
||||
@@ -113,9 +113,10 @@ USING PASSWORDS
|
||||
ones out of the ones that the server accepts for the given URL, by using
|
||||
--anyauth.
|
||||
|
||||
NOTE! Since HTTP URLs don't support user and password, you can't use that
|
||||
style when using Curl via a proxy. You _must_ use the -u style fetch
|
||||
during such circumstances.
|
||||
NOTE! According to the URL specification, HTTP URLs can not contain a user
|
||||
and password, so that style will not work when using curl via a proxy, even
|
||||
though curl allows it at other times. When using a proxy, you _must_ use
|
||||
the -u style for user and password.
|
||||
|
||||
HTTPS
|
||||
|
||||
@@ -133,7 +134,7 @@ PROXY
|
||||
|
||||
curl -x my-proxy:888 ftp://ftp.leachsite.com/README
|
||||
|
||||
Get a file from a HTTP server that requires user and password, using the
|
||||
Get a file from an HTTP server that requires user and password, using the
|
||||
same proxy as above:
|
||||
|
||||
curl -u user:passwd -x my-proxy:888 http://www.get.this/
|
||||
@@ -171,7 +172,7 @@ PROXY
|
||||
|
||||
RANGES
|
||||
|
||||
With HTTP 1.1 byte-ranges were introduced. Using this, a client can request
|
||||
HTTP 1.1 introduced byte-ranges. Using this, a client can request
|
||||
to get only one or more subparts of a specified document. Curl supports
|
||||
this with the -r flag.
|
||||
|
||||
@@ -202,8 +203,8 @@ UPLOADING
|
||||
|
||||
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile
|
||||
|
||||
Upload a local file to the remote site, and use the local file name remote
|
||||
too:
|
||||
Upload a local file to the remote site, and use the local file name at the remote
|
||||
site too:
|
||||
|
||||
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
|
||||
|
||||
@@ -219,14 +220,14 @@ UPLOADING
|
||||
|
||||
HTTP
|
||||
|
||||
Upload all data on stdin to a specified http site:
|
||||
Upload all data on stdin to a specified HTTP site:
|
||||
|
||||
curl -T - http://www.upload.com/myfile
|
||||
|
||||
Note that the http server must have been configured to accept PUT before
|
||||
Note that the HTTP server must have been configured to accept PUT before
|
||||
this can be done successfully.
|
||||
|
||||
For other ways to do http data upload, see the POST section below.
|
||||
For other ways to do HTTP data upload, see the POST section below.
|
||||
|
||||
VERBOSE / DEBUG
|
||||
|
||||
@@ -289,7 +290,7 @@ POST (HTTP)
|
||||
The 'variable' names are the names set with "name=" in the <input> tags, and
|
||||
the data is the contents you want to fill in for the inputs. The data *must*
|
||||
be properly URL encoded. That means you replace space with + and that you
|
||||
write weird letters with %XX where XX is the hexadecimal representation of
|
||||
replace weird letters with %XX where XX is the hexadecimal representation of
|
||||
the letter's ASCII code.
|
||||
|
||||
Example:
|
||||
@@ -361,8 +362,8 @@ POST (HTTP)
|
||||
|
||||
REFERRER
|
||||
|
||||
A HTTP request has the option to include information about which address
|
||||
that referred to actual page. Curl allows you to specify the
|
||||
An HTTP request has the option to include information about which address
|
||||
referred it to the actual page. Curl allows you to specify the
|
||||
referrer to be used on the command line. It is especially useful to
|
||||
fool or trick stupid servers or CGI scripts that rely on that information
|
||||
being available or contain certain data.
|
||||
@@ -373,7 +374,7 @@ REFERRER
|
||||
|
||||
USER AGENT
|
||||
|
||||
A HTTP request has the option to include information about the browser
|
||||
An HTTP request has the option to include information about the browser
|
||||
that generated the request. Curl allows it to be specified on the command
|
||||
line. It is especially useful to fool or trick stupid servers or CGI
|
||||
scripts that only accept certain browsers.
|
||||
@@ -613,21 +614,21 @@ SFTP and SCP and PATH NAMES
|
||||
FTP and firewalls
|
||||
|
||||
The FTP protocol requires one of the involved parties to open a second
|
||||
connection as soon as data is about to get transfered. There are two ways to
|
||||
connection as soon as data is about to get transferred. There are two ways to
|
||||
do this.
|
||||
|
||||
The default way for curl is to issue the PASV command which causes the
|
||||
server to open another port and await another connection performed by the
|
||||
client. This is good if the client is behind a firewall that don't allow
|
||||
client. This is good if the client is behind a firewall that doesn't allow
|
||||
incoming connections.
|
||||
|
||||
curl ftp.download.com
|
||||
|
||||
If the server for example, is behind a firewall that don't allow connections
|
||||
on other ports than 21 (or if it just doesn't support the PASV command), the
|
||||
If the server, for example, is behind a firewall that doesn't allow connections
|
||||
on ports other than 21 (or if it just doesn't support the PASV command), the
|
||||
other way to do it is to use the PORT command and instruct the server to
|
||||
connect to the client on the given (as parameters to the PORT command) IP
|
||||
number and port.
|
||||
connect to the client on the given IP number and port (as parameters to the
|
||||
PORT command).
|
||||
|
||||
The -P flag to curl supports a few different options. Your machine may have
|
||||
several IP-addresses and/or network interfaces and curl allows you to select
|
||||
@@ -685,8 +686,8 @@ HTTPS
|
||||
If you neglect to specify the password on the command line, you will be
|
||||
prompted for the correct password before any data can be received.
|
||||
|
||||
Many older SSL-servers have problems with SSLv3 or TLS, that newer versions
|
||||
of OpenSSL etc is using, therefore it is sometimes useful to specify what
|
||||
Many older SSL-servers have problems with SSLv3 or TLS, which newer versions
|
||||
of OpenSSL etc use, therefore it is sometimes useful to specify what
|
||||
SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL
|
||||
version to use (for SSLv3, SSLv2 or TLSv1 respectively):
|
||||
|
||||
@@ -695,14 +696,13 @@ HTTPS
|
||||
Otherwise, curl will first attempt to use v3 and then v2.
|
||||
|
||||
To use OpenSSL to convert your favourite browser's certificate into a PEM
|
||||
formatted one that curl can use, do something like this (assuming netscape,
|
||||
but IE is likely to work similarly):
|
||||
formatted one that curl can use, do something like this:
|
||||
|
||||
You start with hitting the 'security' menu button in netscape.
|
||||
In Netscape, you start with hitting the 'Security' menu button.
|
||||
|
||||
Select 'certificates->yours' and then pick a certificate in the list
|
||||
|
||||
Press the 'export' button
|
||||
Press the 'Export' button
|
||||
|
||||
enter your PIN code for the certs
|
||||
|
||||
@@ -713,11 +713,21 @@ HTTPS
|
||||
|
||||
# ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile]
|
||||
|
||||
In Firefox, select Options, then Advanced, then the Encryption tab,
|
||||
View Certificates. This opens the Certificate Manager, where you can
|
||||
Export. Be sure to select PEM for the Save as type.
|
||||
|
||||
In Internet Explorer, select Internet Options, then the Content tab, then
|
||||
Certificates. Then you can Export, and depending on the format you may
|
||||
need to convert to PEM.
|
||||
|
||||
In Chrome, select Settings, then Show Advanced Settings. Under HTTPS/SSL
|
||||
select Manage Certificates.
|
||||
|
||||
RESUMING FILE TRANSFERS
|
||||
|
||||
To continue a file transfer where it was previously aborted, curl supports
|
||||
resume on http(s) downloads as well as ftp uploads and downloads.
|
||||
resume on HTTP(S) downloads as well as FTP uploads and downloads.
|
||||
|
||||
Continue downloading a document:
|
||||
|
||||
@@ -731,7 +741,7 @@ RESUMING FILE TRANSFERS
|
||||
|
||||
curl -C - -o file http://www.server.com/
|
||||
|
||||
(*1) = This requires that the ftp server supports the non-standard command
|
||||
(*1) = This requires that the FTP server supports the non-standard command
|
||||
SIZE. If it doesn't, curl will say so.
|
||||
|
||||
(*2) = This requires that the web server supports at least HTTP/1.1. If it
|
||||
@@ -740,7 +750,7 @@ RESUMING FILE TRANSFERS
|
||||
TIME CONDITIONS
|
||||
|
||||
HTTP allows a client to specify a time condition for the document it
|
||||
requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to
|
||||
requests. It is If-Modified-Since or If-Unmodified-Since. Curl allows you to
|
||||
specify them with the -z/--time-cond flag.
|
||||
|
||||
For example, you can easily make a download that only gets performed if the
|
||||
@@ -788,7 +798,7 @@ LDAP
|
||||
and offer ldap:// support.
|
||||
|
||||
LDAP is a complex thing and writing an LDAP query is not an easy task. I do
|
||||
advice you to dig up the syntax description for that elsewhere. Two places
|
||||
advise you to dig up the syntax description for that elsewhere. Two places
|
||||
that might suit you are:
|
||||
|
||||
Netscape's "Netscape Directory SDK 3.0 for C Programmer's Guide Chapter 10:
|
||||
@@ -797,7 +807,7 @@ LDAP
|
||||
|
||||
RFC 2255, "The LDAP URL Format" http://curl.haxx.se/rfc/rfc2255.txt
|
||||
|
||||
To show you an example, this is now I can get all people from my local LDAP
|
||||
To show you an example, this is how I can get all people from my local LDAP
|
||||
server that has a certain sub-domain in their email address:
|
||||
|
||||
curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"
|
||||
@@ -831,15 +841,15 @@ ENVIRONMENT VARIABLES
|
||||
NETRC
|
||||
|
||||
Unix introduced the .netrc concept a long time ago. It is a way for a user
|
||||
to specify name and password for commonly visited ftp sites in a file so
|
||||
to specify name and password for commonly visited FTP sites in a file so
|
||||
that you don't have to type them in each time you visit those sites. You
|
||||
realize this is a big security risk if someone else gets hold of your
|
||||
passwords, so therefore most unix programs won't read this file unless it is
|
||||
only readable by yourself (curl doesn't care though).
|
||||
|
||||
Curl supports .netrc files if told so (using the -n/--netrc and
|
||||
--netrc-optional options). This is not restricted to only ftp,
|
||||
but curl can use it for all protocols where authentication is used.
|
||||
Curl supports .netrc files if told to (using the -n/--netrc and
|
||||
--netrc-optional options). This is not restricted to just FTP,
|
||||
so curl can use it for all protocols where authentication is used.
|
||||
|
||||
A very simple .netrc file could look something like:
|
||||
|
||||
@@ -860,7 +870,7 @@ KERBEROS FTP TRANSFER
|
||||
|
||||
Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need
|
||||
the kerberos package installed and used at curl build time for it to be
|
||||
used.
|
||||
available.
|
||||
|
||||
First, get the krb-ticket the normal way, like with the kinit/kauth tool.
|
||||
Then use curl in way similar to:
|
||||
@@ -895,7 +905,7 @@ TELNET
|
||||
|
||||
- NEW_ENV=<var,val> Sets an environment variable.
|
||||
|
||||
NOTE: the telnet protocol does not specify any way to login with a specified
|
||||
NOTE: The telnet protocol does not specify any way to login with a specified
|
||||
user and password so curl can't do that automatically. To do that, you need
|
||||
to track when the login prompt is received and send the username and
|
||||
password accordingly.
|
||||
@@ -914,7 +924,7 @@ PERSISTENT CONNECTIONS
|
||||
Note that curl cannot use persistent connections for transfers that are used
|
||||
in subsequence curl invokes. Try to stuff as many URLs as possible on the
|
||||
same command line if they are using the same host, as that'll make the
|
||||
transfers faster. If you use a http proxy for file transfers, practically
|
||||
transfers faster. If you use an HTTP proxy for file transfers, practically
|
||||
all transfers will be persistent.
|
||||
|
||||
MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE
|
||||
@@ -955,6 +965,28 @@ IPv6
|
||||
IPv6 addresses provided other than in URLs (e.g. to the --proxy, --interface
|
||||
or --ftp-port options) should not be URL encoded.
|
||||
|
||||
METALINK
|
||||
|
||||
Curl supports Metalink (both version 3 and 4 (RFC 5854) are supported), a way
|
||||
to list multiple URIs and hashes for a file. Curl will make use of the mirrors
|
||||
listed within for failover if there are errors (such as the file or server not
|
||||
being available). It will also verify the hash of the file after the download
|
||||
completes. The Metalink file itself is downloaded and processed in memory and
|
||||
not stored in the local file system.
|
||||
|
||||
Example to use a remote Metalink file:
|
||||
|
||||
curl --metalink http://www.example.com/example.metalink
|
||||
|
||||
To use a Metalink file in the local file system, use FILE protocol (file://):
|
||||
|
||||
curl --metalink file://example.metalink
|
||||
|
||||
Please note that if FILE protocol is disabled, there is no way to use a local
|
||||
Metalink file at the time of this writing. Also note that if --metalink and
|
||||
--include are used together, --include will be ignored. This is because including
|
||||
headers in the response will break Metalink parser and if the headers are included
|
||||
in the file described in Metalink file, hash check will fail.
|
||||
|
||||
MAILING LISTS
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -23,8 +23,9 @@
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
man_MANS = curl.1 curl-config.1
|
||||
GENHTMLPAGES = curl.html curl-config.html
|
||||
PDFPAGES = curl.pdf curl-config.pdf
|
||||
noinst_man_MANS = mk-ca-bundle.1
|
||||
GENHTMLPAGES = curl.html curl-config.html mk-ca-bundle.html
|
||||
PDFPAGES = curl.pdf curl-config.pdf mk-ca-bundle.pdf
|
||||
|
||||
HTMLPAGES = $(GENHTMLPAGES) index.html
|
||||
|
||||
@@ -36,7 +37,7 @@ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \
|
||||
MAIL-ETIQUETTE
|
||||
MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS
|
||||
|
||||
MAN2HTML= roffit < $< >$@
|
||||
|
||||
|
@@ -1,6 +1,12 @@
|
||||
Peer SSL Certificate Verification
|
||||
=================================
|
||||
|
||||
(NOTE: If libcurl was built with Schannel or Secure Transport support, then
|
||||
this does not apply to you. Scroll down for details on how the OS-native
|
||||
engines handle SSL certificates. If you're not sure, then run "curl -V" and
|
||||
read the results. If the version string says "WinSSL" in it, then it was built
|
||||
with Schannel support.)
|
||||
|
||||
libcurl performs peer SSL certificate verification by default. This is done
|
||||
by using CA cert bundle that the SSL library can use to make sure the peer's
|
||||
server certificate is valid.
|
||||
@@ -93,24 +99,40 @@ server.
|
||||
Peer SSL Certificate Verification with NSS
|
||||
==========================================
|
||||
|
||||
If libcurl is build with NSS support then depending on the OS distribution it
|
||||
is probably required to take some additional steps to use the system-wide CA
|
||||
cert db. RedHat ships with an additional module libnsspem.so which enables NSS
|
||||
to read the OpenSSL PEM CA bundle. With OpenSuSE this lib is missing, and NSS
|
||||
can only work with its own internal formats. Also NSS got a new database
|
||||
format:
|
||||
https://wiki.mozilla.org/NSS_Shared_DB
|
||||
Starting with version 7.19.7 libcurl will check for the NSS version it runs,
|
||||
and add automatically the 'sql:' prefix to the certdb directory (either the
|
||||
If libcurl was built with NSS support, then depending on the OS distribution,
|
||||
it is probably required to take some additional steps to use the system-wide CA
|
||||
cert db. RedHat ships with an additional module, libnsspem.so, which enables
|
||||
NSS to read the OpenSSL PEM CA bundle. This library is missing in OpenSuSE, and
|
||||
without it, NSS can only work with its own internal formats. NSS also has a new
|
||||
database format: https://wiki.mozilla.org/NSS_Shared_DB
|
||||
|
||||
Starting with version 7.19.7, libcurl will check for the NSS version it runs,
|
||||
and automatically add the 'sql:' prefix to the certdb directory (either the
|
||||
hardcoded default /etc/pki/nssdb or the directory configured with SSL_DIR
|
||||
environment variable) if a version 3.12.0 or later is detected.
|
||||
To check which certdb format your distribution provides examine the default
|
||||
certdb location /etc/pki/nssdb; the new certdb format can be identified by
|
||||
environment variable) if version 3.12.0 or later is detected. To check which
|
||||
ertdb format your distribution provides, examine the default
|
||||
certdb location: /etc/pki/nssdb; the new certdb format can be identified by
|
||||
the filenames cert9.db, key4.db, pkcs11.txt; filenames of older versions are
|
||||
cert8.db, key3.db, modsec.db.
|
||||
Usually these cert databases are empty; but NSS also has built-in CAs which are
|
||||
provided through a shared library libnssckbi.so; if you want to use these
|
||||
built-in CAs then create a symlink to libnssckbi.so in /etc/pki/nssdb:
|
||||
|
||||
Usually these cert databases are empty, but NSS also has built-in CAs which are
|
||||
provided through a shared library, libnssckbi.so; if you want to use these
|
||||
built-in CAs, then create a symlink to libnssckbi.so in /etc/pki/nssdb:
|
||||
ln -s /usr/lib[64]/libnssckbi.so /etc/pki/nssdb/libnssckbi.so
|
||||
|
||||
Peer SSL Certificate Verification with Schannel and Secure Transport
|
||||
====================================================================
|
||||
|
||||
If libcurl was built with Schannel (Microsoft's TLS/SSL engine) or Secure
|
||||
Transport (Apple's TLS/SSL engine) support, then libcurl will still perform
|
||||
peer certificate verification, but instead of using a CA cert bundle, it will
|
||||
use the certificates that are built into the OS. These are the same
|
||||
certificates that appear in the Internet Options control panel (under Windows)
|
||||
or Keychain Access application (under OS X). Any custom security rules for
|
||||
certificates will be honored.
|
||||
|
||||
Schannel will run CRL checks on certificates unless peer verification is
|
||||
disabled. Secure Transport on iOS will run OCSP checks on certificates unless
|
||||
peer verification is disabled. Secure Transport on OS X will run either OCSP
|
||||
or CRL checks on certificates if those features are enabled, and this behavior
|
||||
can be adjusted in the preferences of Keychain Access.
|
||||
|
166
docs/THANKS
166
docs/THANKS
@@ -12,23 +12,27 @@ Adam Piggott
|
||||
Adam Tkac
|
||||
Adrian Schuur
|
||||
Adriano Meirelles
|
||||
Ajit Dhumale
|
||||
Aki Koskinen
|
||||
Akos Pasztory
|
||||
Alan Pinstein
|
||||
Albert Chin
|
||||
Albert Chin-A-Young
|
||||
Albert Choy
|
||||
Ale Vesely
|
||||
Alejandro Alvarez
|
||||
Aleksandar Milivojevic
|
||||
Aleksey Tulinov
|
||||
Alessandro Ghedini
|
||||
Alessandro Vesely
|
||||
Alex Bligh
|
||||
Alex Fishman
|
||||
Alex Gruz
|
||||
Alex Neblett
|
||||
Alex Suykov
|
||||
Alex Vinnik
|
||||
Alex aka WindEagle
|
||||
Alexander Beedie
|
||||
Alexander Klauer
|
||||
Alexander Kourakos
|
||||
Alexander Krasnostavsky
|
||||
Alexander Lazic
|
||||
@@ -44,37 +48,46 @@ Amol Pattekar
|
||||
Amr Shahin
|
||||
Anatoli Tubman
|
||||
Anders Gustafsson
|
||||
Anders Havn
|
||||
Andi Jahja
|
||||
Andre Guibert de Bruet
|
||||
Andreas Damm
|
||||
Andreas Faerber
|
||||
Andreas Farber
|
||||
Andreas Malzahn
|
||||
Andreas Ntaflos
|
||||
Andreas Olsson
|
||||
Andreas Rieke
|
||||
Andreas Schuldei
|
||||
Andreas Wurf
|
||||
Andrei Benea
|
||||
Andrei Cipu
|
||||
Andres Garcia
|
||||
Andrew Benham
|
||||
Andrew Biggs
|
||||
Andrew Bushnell
|
||||
Andrew Francis
|
||||
Andrew Fuller
|
||||
Andrew Kurushin
|
||||
Andrew Moise
|
||||
Andrew Wansink
|
||||
Andrew de los Reyes
|
||||
Andr<EFBFBD>s Garc<72>a
|
||||
Andrii Moiseiev
|
||||
Andrés García
|
||||
Andy Cedilnik
|
||||
Andy Serpa
|
||||
Andy Tsouladze
|
||||
Angus Mackay
|
||||
Anthony Bryan
|
||||
Anthony G. Basile
|
||||
Antoine Calando
|
||||
Anton Bychkov
|
||||
Anton Kalmykov
|
||||
Anton Malov
|
||||
Anton Yabchinskiy
|
||||
Arkadiusz Miskiewicz
|
||||
Armel Asselin
|
||||
Arnaud Compan
|
||||
Arnaud Ebalard
|
||||
Arthur Murray
|
||||
Arve Knudsen
|
||||
@@ -82,6 +95,7 @@ Ates Goral
|
||||
Augustus Saunders
|
||||
Avery Fay
|
||||
Axel Tillequin
|
||||
Balaji Parasuram
|
||||
Balint Szilakszi
|
||||
Bart Whiteley
|
||||
Bas Mevissen
|
||||
@@ -93,15 +107,20 @@ Ben Van Hof
|
||||
Ben Winslow
|
||||
Benbuck Nason
|
||||
Benjamin Gerard
|
||||
Benjamin Gilbert
|
||||
Benjamin Johnson
|
||||
Bernard Leak
|
||||
Bernhard Reutner-Fischer
|
||||
Bertrand Demiddelaer
|
||||
Bill Egert
|
||||
Bill Hoffman
|
||||
Bill Middlecamp
|
||||
Bjoern Sikora
|
||||
Bjorn Augustsson
|
||||
Bjorn Reese
|
||||
Bj<EFBFBD>rn Stenberg
|
||||
Björn Stenberg
|
||||
Blaise Potard
|
||||
Bob Relyea
|
||||
Bob Richmond
|
||||
Bob Schader
|
||||
Bogdan Nicula
|
||||
@@ -119,8 +138,10 @@ Brian R Duffy
|
||||
Brian Ulm
|
||||
Brock Noland
|
||||
Bruce Mitchener
|
||||
Bruno de Carvalho
|
||||
Bryan Henderson
|
||||
Bryan Kemp
|
||||
Byrial Jensen
|
||||
Cameron Kaiser
|
||||
Camille Moncelier
|
||||
Caolan McNamara
|
||||
@@ -128,6 +149,7 @@ Carsten Lange
|
||||
Casey O'Donnell
|
||||
Cedric Deltheil
|
||||
Chad Monroe
|
||||
Chandrakant Bagul
|
||||
Charles Kerr
|
||||
Chih-Chung Chang
|
||||
Chris "Bob Bob"
|
||||
@@ -140,12 +162,13 @@ Chris Maltby
|
||||
Chris Mumford
|
||||
Chris Smowton
|
||||
Christian Grothoff
|
||||
Christian Hagele
|
||||
Christian Hägele
|
||||
Christian Krause
|
||||
Christian Kurz
|
||||
Christian Robottom Reis
|
||||
Christian Schmitz
|
||||
Christian Vogt
|
||||
Christian Weisgerber
|
||||
Christophe Demory
|
||||
Christophe Legry
|
||||
Christopher Conroy
|
||||
@@ -155,6 +178,7 @@ Christopher Stone
|
||||
Ciprian Badescu
|
||||
Claes Jakobsson
|
||||
Clarence Gardner
|
||||
Clemens Gruber
|
||||
Clifford Wolf
|
||||
Cody Jones
|
||||
Colin Hogben
|
||||
@@ -166,9 +190,11 @@ Craig A West
|
||||
Craig Davison
|
||||
Craig Markwardt
|
||||
Cris Bailiff
|
||||
Cristian Rodriguez
|
||||
Cristian Rodríguez
|
||||
Curt Bogmine
|
||||
Cyrill Osterwalder
|
||||
Cédric Deltheil
|
||||
Dag Ekengren
|
||||
Dagobert Michelsen
|
||||
Damien Adant
|
||||
Dan Becker
|
||||
@@ -182,11 +208,11 @@ Dan Zitter
|
||||
Daniel Black
|
||||
Daniel Cater
|
||||
Daniel Egger
|
||||
Daniel Fandrich
|
||||
Daniel Johnson
|
||||
Daniel Mentz
|
||||
Daniel Steinberg
|
||||
Daniel Stenberg
|
||||
Daniel Theron
|
||||
Daniel at touchtunes
|
||||
Darryl House
|
||||
Darshan Mody
|
||||
@@ -198,6 +224,7 @@ Dave Reisner
|
||||
Dave Vasilevsky
|
||||
David Bau
|
||||
David Binderman
|
||||
David Blaikie
|
||||
David Byron
|
||||
David Cohen
|
||||
David Eriksson
|
||||
@@ -214,6 +241,7 @@ David Odin
|
||||
David Phillips
|
||||
David Rosenstrauch
|
||||
David Shaw
|
||||
David Strauss
|
||||
David Tarendash
|
||||
David Thiel
|
||||
David Wright
|
||||
@@ -246,6 +274,7 @@ Douglas R. Horner
|
||||
Douglas Steinwand
|
||||
Dov Murik
|
||||
Duane Cathey
|
||||
Duncan
|
||||
Duncan Mac-Vicar Prett
|
||||
Dustin Boswell
|
||||
Dylan Ellicott
|
||||
@@ -254,7 +283,11 @@ Early Ehlinger
|
||||
Ebenezer Ikonne
|
||||
Edin Kadribasic
|
||||
Eduard Bloch
|
||||
Edward Rudd
|
||||
Edward Sheldrake
|
||||
Eelco Dolstra
|
||||
Eetu Ojanen
|
||||
Eldar Zaitov
|
||||
Ellis Pritchard
|
||||
Emanuele Bovisio
|
||||
Emil Romanus
|
||||
@@ -268,15 +301,18 @@ Eric Lavigne
|
||||
Eric Melville
|
||||
Eric Mertens
|
||||
Eric Rautman
|
||||
Eric S. Raymond
|
||||
Eric Thelin
|
||||
Eric Vergnaud
|
||||
Eric Wong
|
||||
Eric Young
|
||||
Erick Nuwendam
|
||||
Erik Johansson
|
||||
Erwan Legrand
|
||||
Erwin Authried
|
||||
Eugene Kotlyarov
|
||||
Evan Jordan
|
||||
Evgeny Turnaev
|
||||
Eygene Ryabinkin
|
||||
Fabian Hiernaux
|
||||
Fabian Keil
|
||||
@@ -292,11 +328,14 @@ Frank McGeough
|
||||
Frank Meier
|
||||
Frank Ticheler
|
||||
Frank Van Uffelen
|
||||
František Kučera
|
||||
Fred Machado
|
||||
Fred New
|
||||
Fred Noz
|
||||
Frederic Lepied
|
||||
Fredrik Thulin
|
||||
Gabriel Kuri
|
||||
Gabriel Sjoberg
|
||||
Garrett Holmstrom
|
||||
Gary Maxwell
|
||||
Gautam Kachroo
|
||||
@@ -309,7 +348,8 @@ Georg Lippitsch
|
||||
Georg Wicherski
|
||||
Gerd v. Egidy
|
||||
Gerhard Herre
|
||||
Gerrit Bruchh<EFBFBD>user
|
||||
Gerrit Bruchhäuser
|
||||
Ghennadi Procopciuc
|
||||
Giancarlo Formicuccia
|
||||
Giaslas Georgios
|
||||
Gil Weber
|
||||
@@ -330,12 +370,14 @@ Greg Zavertnik
|
||||
Grigory Entin
|
||||
Guenole Bescon
|
||||
Guenter Knauf
|
||||
Guido Berhoerster
|
||||
Guillaume Arluison
|
||||
Gustaf Hui
|
||||
Gwenole Beauchesne
|
||||
G<EFBFBD>tz Babin-Ebell
|
||||
Götz Babin-Ebell
|
||||
Hamish Mackenzie
|
||||
Hang Kin Lau
|
||||
Hang Su
|
||||
Hanno Kranzhoff
|
||||
Hans Steegers
|
||||
Hans-Jurgen May
|
||||
@@ -349,6 +391,7 @@ Henrik Storner
|
||||
Henry Ludemann
|
||||
Herve Amblard
|
||||
Hidemoto Nakada
|
||||
Ho-chi Chen
|
||||
Hoi-Ho Chan
|
||||
Hongli Lai
|
||||
Howard Chu
|
||||
@@ -369,6 +412,7 @@ Immanuel Gregoire
|
||||
Ingmar Runge
|
||||
Ingo Ralf Blum
|
||||
Ingo Wilken
|
||||
Ishan SinghLevett
|
||||
Jack Zhang
|
||||
Jacky Lam
|
||||
Jacob Meuser
|
||||
@@ -385,8 +429,12 @@ James MacMillan
|
||||
Jamie Lokier
|
||||
Jamie Newton
|
||||
Jamie Wilkinson
|
||||
Jan Ehrhardt
|
||||
Jan Koen Annot
|
||||
Jan Kunder
|
||||
Jan Schaumann
|
||||
Jan Van Boghout
|
||||
Jared Jennings
|
||||
Jared Lundell
|
||||
Jari Sundell
|
||||
Jason Glasgow
|
||||
@@ -401,7 +449,9 @@ Jean-Claude Chauve
|
||||
Jean-Francois Bertrand
|
||||
Jean-Louis Lemaire
|
||||
Jean-Marc Ranger
|
||||
Jean-Noel Rouvignac
|
||||
Jean-Philippe Barrette-LaPierre
|
||||
Jeff Connelly
|
||||
Jeff Johnson
|
||||
Jeff Lawson
|
||||
Jeff Phillips
|
||||
@@ -409,19 +459,24 @@ Jeff Pohlmeyer
|
||||
Jeff Weber
|
||||
Jeffrey Pohlmeyer
|
||||
Jeremy Friesner
|
||||
Jeremy Huddleston
|
||||
Jerome Muffat-Meridol
|
||||
Jerome Vouillon
|
||||
Jerry Wu
|
||||
Jes Badwal
|
||||
Jesper Jensen
|
||||
Jesse Noller
|
||||
Jie He
|
||||
Jim Drash
|
||||
Jim Freeman
|
||||
Jim Hollinger
|
||||
Jim Meyering
|
||||
Jiri Hruska
|
||||
Jiri Jaburek
|
||||
Jocelyn Jaubert
|
||||
Joe Halpin
|
||||
Joe Malicki
|
||||
Joe Mason
|
||||
Joel Chen
|
||||
Jofell Gallardo
|
||||
Johan Anderson
|
||||
@@ -432,12 +487,16 @@ John Bradshaw
|
||||
John Crow
|
||||
John Dennis
|
||||
John E. Malmberg
|
||||
John Gardiner Myers
|
||||
John Janssen
|
||||
John Joseph Bachir
|
||||
John Kelly
|
||||
John Lask
|
||||
John Lightsey
|
||||
John Marino
|
||||
John McGowan
|
||||
John P. McCaskey
|
||||
John Suprock
|
||||
John Wilkinson
|
||||
John-Mark Bell
|
||||
Johnny Luong
|
||||
@@ -450,25 +509,30 @@ Jonas Forsman
|
||||
Jonas Schnelli
|
||||
Jonatan Lander
|
||||
Jonathan Hseu
|
||||
Jonathan Nieder
|
||||
Jongki Suwandi
|
||||
Jose Kahan
|
||||
Josef Wolf
|
||||
Josh Kapell
|
||||
Joshua Kwan
|
||||
Josue Andrade Gomes
|
||||
Juan Barreto
|
||||
Juan F. Codagnone
|
||||
Juan Ignacio Herv<EFBFBD>s
|
||||
Juan Ignacio Hervás
|
||||
Judson Bishop
|
||||
Juergen Wilke
|
||||
Jukka Pihl
|
||||
Julian Noble
|
||||
Julian Taylor
|
||||
Julien Chaffraix
|
||||
Julien Royer
|
||||
Jun-ichiro itojun Hagino
|
||||
Jurij Smakov
|
||||
Justin Fletcher
|
||||
J<EFBFBD>rg Mueller-Tolk
|
||||
J<EFBFBD>rn Hartroth
|
||||
Justin Karneges
|
||||
Jörg Mueller-Tolk
|
||||
Jörn Hartroth
|
||||
Kai Engert
|
||||
Kai Sommerfeld
|
||||
Kai-Uwe Rommel
|
||||
Kalle Vahlman
|
||||
@@ -494,21 +558,25 @@ Kevin Lussier
|
||||
Kevin Reed
|
||||
Kevin Roth
|
||||
Kim Rinnewitz
|
||||
Kim Vandry
|
||||
Kimmo Kinnunen
|
||||
Kjell Ericson
|
||||
Kjetil Jacobsen
|
||||
Klevtsov Vadim
|
||||
Konstantin Isakov
|
||||
Kris Kennaway
|
||||
Krishnendu Majumdar
|
||||
Krister Johansen
|
||||
Kristian Gunstone
|
||||
Kristian K<EFBFBD>hntopp
|
||||
Kristian Köhntopp
|
||||
Kyle Sallee
|
||||
Lachlan O'Dea
|
||||
Larry Campbell
|
||||
Larry Fahnoe
|
||||
Lars Buitinck
|
||||
Lars Gustafsson
|
||||
Lars J. Aas
|
||||
Lars Johannesen
|
||||
Lars Nilsson
|
||||
Lars Torben Wilson
|
||||
Lau Hang Kin
|
||||
@@ -519,16 +587,19 @@ Len Krause
|
||||
Lenaic Lefever
|
||||
Lenny Rachitsky
|
||||
Liam Healy
|
||||
Lijo Antony
|
||||
Linas Vepstas
|
||||
Ling Thio
|
||||
Linus Nielsen Feltzing
|
||||
Lisa Xu
|
||||
Liza Alenchery
|
||||
Lluís Batlle i Rossell
|
||||
Loic Dachary
|
||||
Loren Kirkby
|
||||
Luca Altea
|
||||
Luca Alteas
|
||||
Lucas Adamski
|
||||
Ludovico Cavedon
|
||||
Lukasz Czekierda
|
||||
Luke Amery
|
||||
Luke Call
|
||||
@@ -540,7 +611,10 @@ Mandy Wu
|
||||
Manfred Schwarb
|
||||
Manuel Massing
|
||||
Marc Boucher
|
||||
Marc Doughty
|
||||
Marc Hoersken
|
||||
Marc Kleine-Budde
|
||||
Marcel Raad
|
||||
Marcel Roelofs
|
||||
Marcelo Juchem
|
||||
Marcin Adamski
|
||||
@@ -557,6 +631,9 @@ Mark Eichin
|
||||
Mark Incley
|
||||
Mark Karpeles
|
||||
Mark Lentczner
|
||||
Mark Salisbury
|
||||
Mark Snelling
|
||||
Mark Tully
|
||||
Markus Duft
|
||||
Markus Koetter
|
||||
Markus Moeller
|
||||
@@ -566,6 +643,7 @@ Martin C. Martin
|
||||
Martin Drasar
|
||||
Martin Hager
|
||||
Martin Hedenfalk
|
||||
Martin Jansen
|
||||
Martin Lemke
|
||||
Martin Skinner
|
||||
Martin Storsjo
|
||||
@@ -576,6 +654,7 @@ Massimo Callegari
|
||||
Mateusz Loskot
|
||||
Mathias Axelsson
|
||||
Mats Lidell
|
||||
Matt Arsenault
|
||||
Matt Kraai
|
||||
Matt Veenstra
|
||||
Matt Witherspoon
|
||||
@@ -589,6 +668,8 @@ Mauro Iorio
|
||||
Max Katsev
|
||||
Maxim Ivanov
|
||||
Maxim Perenesenko
|
||||
Maxim Prohorov
|
||||
Maxime Larocque
|
||||
Mehmet Bozkurt
|
||||
Mekonikum
|
||||
Mettgut Jamalla
|
||||
@@ -596,6 +677,7 @@ Michael Benedict
|
||||
Michael Calmer
|
||||
Michael Cronenworth
|
||||
Michael Curtis
|
||||
Michael Day
|
||||
Michael Goffioul
|
||||
Michael Jahn
|
||||
Michael Jerris
|
||||
@@ -606,14 +688,17 @@ Michael Stillwell
|
||||
Michael Wallner
|
||||
Michal Bonino
|
||||
Michal Gorny
|
||||
Michal Kowalczyk
|
||||
Michal Marek
|
||||
Michele Bini
|
||||
Miguel Angel
|
||||
Mihai Ionescu
|
||||
Mikael Johansson
|
||||
Mikael Sennerholm
|
||||
Mike Bytnar
|
||||
Mike Crowe
|
||||
Mike Dobbs
|
||||
Mike Giancola
|
||||
Mike Hommey
|
||||
Mike Power
|
||||
Mike Protts
|
||||
@@ -623,11 +708,14 @@ Mitz Wark
|
||||
Mohamed Lrhazi
|
||||
Mohun Biswas
|
||||
Moonesamy
|
||||
Myk Taylor
|
||||
Nach M. S.
|
||||
Nathan Coulter
|
||||
Nathan O'Sullivan
|
||||
Nathanael Nerode
|
||||
Naveen Chandran
|
||||
Naveen Noel
|
||||
Neil Bowers
|
||||
Neil Dunbar
|
||||
Neil Spring
|
||||
Nic Roets
|
||||
@@ -638,7 +726,7 @@ Nick Zitzmann
|
||||
Nico Baggus
|
||||
Nicolas Berloquin
|
||||
Nicolas Croiset
|
||||
Nicolas Fran<EFBFBD>ois
|
||||
Nicolas François
|
||||
Niels van Tongeren
|
||||
Nikita Schmidt
|
||||
Nikitinskit Dmitriy
|
||||
@@ -652,16 +740,22 @@ Nodak Sodak
|
||||
Norbert Frese
|
||||
Norbert Novotny
|
||||
Ofer
|
||||
Olaf Flebbe
|
||||
Olaf Stueben
|
||||
Olaf St<EFBFBD>ben
|
||||
Olaf Stüben
|
||||
Oliver Gondža
|
||||
Olivier Berger
|
||||
Oren Tirosh
|
||||
Ori Avtalion
|
||||
Oscar Koeroo
|
||||
Oscar Norlander
|
||||
P R Schaffner
|
||||
Paolo Piacentini
|
||||
Pascal Terjan
|
||||
Pasha Kuznetsov
|
||||
Pat Ray
|
||||
Patrice Guerin
|
||||
Patricia Muscalu
|
||||
Patrick Bihan-Faou
|
||||
Patrick Monnerat
|
||||
Patrick Scott
|
||||
@@ -684,6 +778,7 @@ Pedro Neves
|
||||
Pete Su
|
||||
Peter Bray
|
||||
Peter Forret
|
||||
Peter Gal
|
||||
Peter Heuchert
|
||||
Peter Hjalmarsson
|
||||
Peter Korsgaard
|
||||
@@ -701,6 +796,7 @@ Phil Blundell
|
||||
Phil Karn
|
||||
Phil Lisiecki
|
||||
Phil Pellouchoud
|
||||
Philip Craig
|
||||
Philip Gladstone
|
||||
Philip Langdale
|
||||
Philippe Hameau
|
||||
@@ -708,7 +804,9 @@ Philippe Raoult
|
||||
Philippe Vaucher
|
||||
Pierre
|
||||
Pierre Brico
|
||||
Pierre Chapuis
|
||||
Pierre Joye
|
||||
Pierre Ynard
|
||||
Pooyan McSporran
|
||||
Pramod Sharma
|
||||
Puneet Pawaia
|
||||
@@ -718,6 +816,7 @@ Quinn Slack
|
||||
Rafa Muyo
|
||||
Rafael Sagula
|
||||
Rainer Canavan
|
||||
Rainer Jung
|
||||
Rainer Koenig
|
||||
Rajesh Naganathan
|
||||
Ralf S. Engelschall
|
||||
@@ -732,6 +831,7 @@ Reinout van Schouwen
|
||||
Renato Botelho
|
||||
Renaud Chaillat
|
||||
Renaud Duhaut
|
||||
Renaud Guillard
|
||||
Rene Bernhardt
|
||||
Rene Rebe
|
||||
Reuven Wachtfogel
|
||||
@@ -745,6 +845,7 @@ Richard Bramante
|
||||
Richard Clayton
|
||||
Richard Cooper
|
||||
Richard Gorton
|
||||
Richard Michael
|
||||
Richard Prescott
|
||||
Richard Silverman
|
||||
Rick Jones
|
||||
@@ -754,22 +855,26 @@ Rob Jones
|
||||
Rob Stanzel
|
||||
Rob Ward
|
||||
Robert A. Monat
|
||||
Robert B. Harris
|
||||
Robert D. Young
|
||||
Robert Foreman
|
||||
Robert Iakobashvili
|
||||
Robert Olson
|
||||
Robert Schumann
|
||||
Robert Weaver
|
||||
Robert Wruck
|
||||
Robin Cornelius
|
||||
Robin Johnson
|
||||
Robin Kay
|
||||
Robson Braga Araujo
|
||||
Rodney Simmons
|
||||
Rodrigo Silva
|
||||
Roland Blom
|
||||
Roland Krikava
|
||||
Roland Zimmermann
|
||||
Rolland Dudemaine
|
||||
Roman Koifman
|
||||
Roman Mamedov
|
||||
Ron Zapp
|
||||
Rosimildo da Silva
|
||||
Roy Shan
|
||||
@@ -780,23 +885,30 @@ Ryan Chan
|
||||
Ryan Nelson
|
||||
Ryan Schmidt
|
||||
S. Moonesamy
|
||||
Salvador D<EFBFBD>vila
|
||||
Salvador Dávila
|
||||
Salvatore Sorrentino
|
||||
Sam Deane
|
||||
Sam Listopad
|
||||
Sampo Kellomaki
|
||||
Samuel D<EFBFBD>az Garc<EFBFBD>a
|
||||
Samuel Díaz García
|
||||
Samuel Listopad
|
||||
Samuel Thibault
|
||||
Sander Gates
|
||||
Sandor Feldi
|
||||
Santhana Todatry
|
||||
Saqib Ali
|
||||
Sara Golemon
|
||||
Saran Neti
|
||||
Saul good
|
||||
Scott Bailey
|
||||
Scott Barrett
|
||||
Scott Cantor
|
||||
Scott Davis
|
||||
Scott McCreary
|
||||
Sebastian Rasmussen
|
||||
Sebastien Willemijns
|
||||
Senthil Raja Velu
|
||||
Sergei Nikulov
|
||||
Sergio Ballestrero
|
||||
Seshubabu Pasam
|
||||
Sh Diao
|
||||
@@ -816,8 +928,10 @@ Spacen Jasset
|
||||
Spiridonoff A.V
|
||||
Stadler Stephan
|
||||
Stan van de Burgt
|
||||
Stanislav Ivochkin
|
||||
Stefan Esser
|
||||
Stefan Krause
|
||||
Stefan Neis
|
||||
Stefan Teleman
|
||||
Stefan Tomanek
|
||||
Stefan Ulrich
|
||||
@@ -836,17 +950,19 @@ Steve Oliphant
|
||||
Steve Roskowski
|
||||
Steven Bazyl
|
||||
Steven G. Johnson
|
||||
Steven Gu
|
||||
Steven M. Schweda
|
||||
Steven Parkes
|
||||
Stoned Elipot
|
||||
Sven Anders
|
||||
Sven Neuhaus
|
||||
Sven Wegener
|
||||
S<EFBFBD>bastien Willemijns
|
||||
Sébastien Willemijns
|
||||
T. Bharath
|
||||
T. Yamada
|
||||
Taneli Vahakangas
|
||||
Tanguy Fautre
|
||||
Tatsuhiro Tsujikawa
|
||||
Temprimus
|
||||
Thomas J. Moore
|
||||
Thomas Klausner
|
||||
@@ -860,16 +976,20 @@ Tim Bartley
|
||||
Tim Chen
|
||||
Tim Costello
|
||||
Tim Harder
|
||||
Tim Heckman
|
||||
Tim Newsome
|
||||
Tim Sneddon
|
||||
Timo Sirainen
|
||||
Tinus van den Berg
|
||||
Tobias Rundstr<EFBFBD>m
|
||||
Tobias Rundström
|
||||
Toby Peterson
|
||||
Todd A Ouska
|
||||
Todd Kulesza
|
||||
Todd Ouska
|
||||
Todd Vierling
|
||||
Tom Benoist
|
||||
Tom Donovan
|
||||
Tom Grace
|
||||
Tom Lee
|
||||
Tom Mattison
|
||||
Tom Moers
|
||||
@@ -877,6 +997,7 @@ Tom Mueller
|
||||
Tom Regner
|
||||
Tom Wright
|
||||
Tom Zerucha
|
||||
Tomas Mlcoch
|
||||
Tomas Pospisek
|
||||
Tomas Szepe
|
||||
Tomasz Lacki
|
||||
@@ -893,7 +1014,8 @@ Traian Nicolescu
|
||||
Troels Walsted Hansen
|
||||
Troy Engel
|
||||
Tupone Alfredo
|
||||
Ulf H<EFBFBD>rnhammar
|
||||
Ulf Härnhammar
|
||||
Ulrich Doehner
|
||||
Ulrich Zadow
|
||||
Venkat Akella
|
||||
Victor Snezhko
|
||||
@@ -919,15 +1041,21 @@ Wesley Laxton
|
||||
Wesley Miaw
|
||||
Wez Furlong
|
||||
Wilfredo Sanchez
|
||||
Willem Sparreboom
|
||||
Wojciech Zwiefka
|
||||
Wouter Van Rooy
|
||||
Wu Yongzheng
|
||||
Xavier Bouchoux
|
||||
Yamada Yasuharu
|
||||
Yang Tse
|
||||
Yarram Sunil
|
||||
Yehoshua Hershberg
|
||||
Yukihiro Kawada
|
||||
Yuriy Sosov
|
||||
Yves Arrouye
|
||||
Yves Lejeune
|
||||
Zdenek Pavlas
|
||||
Zekun Ni
|
||||
Zmey Petroff
|
||||
Zvi Har'El
|
||||
nk
|
||||
|
393
docs/TODO
393
docs/TODO
@@ -16,13 +16,12 @@
|
||||
1.3 struct lifreq
|
||||
1.4 signal-based resolver timeouts
|
||||
1.5 get rid of PATH_MAX
|
||||
1.6 progress callback without doubles
|
||||
1.7 Happy Eyeball dual stack connect
|
||||
1.6 Happy Eyeball dual stack connect
|
||||
1.7 Modified buffer size approach
|
||||
|
||||
2. libcurl - multi interface
|
||||
2.1 More non-blocking
|
||||
2.2 Remove easy interface internally
|
||||
2.4 Fix HTTP Pipelining for PUT
|
||||
2.2 Fix HTTP Pipelining for PUT
|
||||
|
||||
3. Documentation
|
||||
3.1 More and better
|
||||
@@ -39,6 +38,7 @@
|
||||
5.1 Better persistency for HTTP 1.0
|
||||
5.2 support FF3 sqlite cookie files
|
||||
5.3 Rearrange request header order
|
||||
5.4 HTTP2/SPDY
|
||||
|
||||
6. TELNET
|
||||
6.1 ditch stdin
|
||||
@@ -46,61 +46,79 @@
|
||||
6.3 feature negotiation debug data
|
||||
6.4 send data in chunks
|
||||
|
||||
7. SSL
|
||||
7.1 Disable specific versions
|
||||
7.2 Provide mutex locking API
|
||||
7.3 Evaluate SSL patches
|
||||
7.4 Cache OpenSSL contexts
|
||||
7.5 Export session ids
|
||||
7.6 Provide callback for cert verification
|
||||
7.7 Support other SSL libraries
|
||||
7.9 improve configure --with-ssl
|
||||
7. SMTP
|
||||
7.1 Pipelining
|
||||
7.2 Graceful base64 decoding failure
|
||||
7.3 Enhanced capability support
|
||||
|
||||
8. POP3
|
||||
8.1 Pipelining
|
||||
8.2 Graceful base64 decoding failure
|
||||
8.3 Enhanced capability support
|
||||
|
||||
9. IMAP
|
||||
9.1 Graceful base64 decoding failure
|
||||
9.2 Enhanced capability support
|
||||
|
||||
10. LDAP
|
||||
10.1 SASL based authentication mechanisms
|
||||
|
||||
11. New protocols
|
||||
11.1 RSYNC
|
||||
|
||||
8. GnuTLS
|
||||
8.1 SSL engine stuff
|
||||
8.3 check connection
|
||||
8.4 non-gcrypt
|
||||
12. SSL
|
||||
12.1 Disable specific versions
|
||||
12.2 Provide mutex locking API
|
||||
12.3 Evaluate SSL patches
|
||||
12.4 Cache OpenSSL contexts
|
||||
12.5 Export session ids
|
||||
12.6 Provide callback for cert verification
|
||||
12.7 Support other SSL libraries
|
||||
12.8 improve configure --with-ssl
|
||||
12.9 Support DANE
|
||||
|
||||
9. Other protocols
|
||||
13. GnuTLS
|
||||
13.1 SSL engine stuff
|
||||
13.2 check connection
|
||||
|
||||
10. New protocols
|
||||
10.1 RSYNC
|
||||
14. SASL
|
||||
14.1 Other authentication mechanisms
|
||||
|
||||
15. Client
|
||||
15.1 sync
|
||||
15.2 glob posts
|
||||
15.3 prevent file overwriting
|
||||
15.4 simultaneous parallel transfers
|
||||
15.5 provide formpost headers
|
||||
15.6 url-specific options
|
||||
15.7 warning when setting an option
|
||||
15.8 IPv6 addresses with globbing
|
||||
|
||||
11. Client
|
||||
11.1 sync
|
||||
11.2 glob posts
|
||||
11.3 prevent file overwriting
|
||||
11.4 simultaneous parallel transfers
|
||||
11.5 provide formpost headers
|
||||
11.6 url-specific options
|
||||
11.7 metalink support
|
||||
11.8 warning when setting an option
|
||||
11.9 IPv6 addresses with globbing
|
||||
16. Build
|
||||
16.1 roffit
|
||||
|
||||
12. Build
|
||||
12.1 roffit
|
||||
17. Test suite
|
||||
17.1 SSL tunnel
|
||||
17.2 nicer lacking perl message
|
||||
17.3 more protocols supported
|
||||
17.4 more platforms supported
|
||||
|
||||
13. Test suite
|
||||
13.1 SSL tunnel
|
||||
13.2 nicer lacking perl message
|
||||
13.3 more protocols supported
|
||||
13.4 more platforms supported
|
||||
18. Next SONAME bump
|
||||
18.1 http-style HEAD output for ftp
|
||||
18.2 combine error codes
|
||||
18.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
14. Next SONAME bump
|
||||
14.1 http-style HEAD output for ftp
|
||||
14.2 combine error codes
|
||||
14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
15. Next major release
|
||||
15.1 cleanup return codes
|
||||
15.2 remove obsolete defines
|
||||
15.3 size_t
|
||||
15.4 remove several functions
|
||||
15.5 remove CURLOPT_FAILONERROR
|
||||
15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
15.7 remove progress meter from libcurl
|
||||
15.8 remove 'curl_httppost' from public
|
||||
15.9 have form functions use CURL handle argument
|
||||
19. Next major release
|
||||
19.1 cleanup return codes
|
||||
19.2 remove obsolete defines
|
||||
19.3 size_t
|
||||
19.4 remove several functions
|
||||
19.5 remove CURLOPT_FAILONERROR
|
||||
19.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
19.7 remove progress meter from libcurl
|
||||
19.8 remove 'curl_httppost' from public
|
||||
19.9 have form functions use CURL handle argument
|
||||
19.10 Add CURLOPT_MAIL_CLIENT option
|
||||
|
||||
==============================================================================
|
||||
|
||||
@@ -139,16 +157,7 @@
|
||||
we need libssh2 to properly tell us when we pass in a too small buffer and
|
||||
its current API (as of libssh2 1.2.7) doesn't.
|
||||
|
||||
1.6 progress callback without doubles
|
||||
|
||||
The progress callback was introduced way back in the days and the choice to
|
||||
use doubles in the arguments was possibly good at the time. Today the doubles
|
||||
only confuse users and make the amounts less precise. We should introduce
|
||||
another progress callback option that take precedence over the old one and
|
||||
have both co-exist for a forseeable time until we can remove the double-using
|
||||
one.
|
||||
|
||||
1.7 Happy Eyeball dual stack connect
|
||||
1.6 Happy Eyeball dual stack connect
|
||||
|
||||
In order to make alternative technologies not suffer when transitioning, like
|
||||
when introducing IPv6 as an alternative to IPv4 and there are more than one
|
||||
@@ -158,7 +167,28 @@
|
||||
To make libcurl do blazing fast IPv6 in a dual-stack configuration, this needs
|
||||
to be addressed:
|
||||
|
||||
http://tools.ietf.org/html/draft-ietf-v6ops-happy-eyeballs-07
|
||||
http://tools.ietf.org/html/rfc6555
|
||||
|
||||
1.7 Modified buffer size approach
|
||||
|
||||
Current libcurl allocates a fixed 16K size buffer for download and an
|
||||
additional 16K for upload. They are always unconditionally part of the easy
|
||||
handle. If CRLF translations are requested, an additional 32K "scratch
|
||||
buffer" is allocated. A total of 64K transfer buffers in the worst case.
|
||||
|
||||
First, while the handles are not actually in use these buffers could be freed
|
||||
so that lingering handles just kept in queues or whatever waste less memory.
|
||||
|
||||
Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
|
||||
since each need to be individually acked and therefore libssh2 must be
|
||||
allowed to send (or receive) many separate ones in parallel to achieve high
|
||||
transfer speeds. A current libcurl build with a 16K buffer makes that
|
||||
impossible, but one with a 512K buffer will reach MUCH faster transfers. But
|
||||
allocating 512K unconditionally for all buffers just in case they would like
|
||||
to do fast SFTP transfers at some point is not a good solution either.
|
||||
|
||||
Dynamically allocate buffer size depending on protocol in use in combination
|
||||
with freeing it after each individual transfer? Other suggestions?
|
||||
|
||||
|
||||
2. libcurl - multi interface
|
||||
@@ -177,16 +207,7 @@
|
||||
- The "DONE" operation (post transfer protocol-specific actions) for the
|
||||
protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task.
|
||||
|
||||
2.2 Remove easy interface internally
|
||||
|
||||
Make curl_easy_perform() a wrapper-function that simply creates a multi
|
||||
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
||||
transfer is done, then detach the easy handle, destroy the multi handle and
|
||||
return the easy handle's return code. This will thus make everything
|
||||
internally use and assume the multi interface. The select()-loop should use
|
||||
curl_multi_socket().
|
||||
|
||||
2.4 Fix HTTP Pipelining for PUT
|
||||
2.2 Fix HTTP Pipelining for PUT
|
||||
|
||||
HTTP Pipelining can be a way to greatly enhance performance for multiple
|
||||
serial requests and currently libcurl only supports that for HEAD and GET
|
||||
@@ -261,6 +282,24 @@
|
||||
headers use a default value so only headers that need to be moved have to be
|
||||
specified.
|
||||
|
||||
5.4 HTTP2/SPDY
|
||||
|
||||
The first drafts for HTTP2 have been published
|
||||
(http://tools.ietf.org/html/draft-ietf-httpbis-http2-03) and is so far based
|
||||
on SPDY (http://www.chromium.org/spdy) designs and experiences. Chances are
|
||||
it will end up in that style. Chrome and Firefox already support SPDY and
|
||||
lots of web services do.
|
||||
|
||||
It would make sense to implement SPDY support now and later transition into
|
||||
or add HTTP2 support as well.
|
||||
|
||||
We should base or HTTP2/SPDY work on a 3rd party library for the protocol
|
||||
fiddling. The Spindy library (http://spindly.haxx.se/) was an attempt to make
|
||||
such a library with an API suitable for use by libcurl but that effort has
|
||||
more or less stalled. spdylay (https://github.com/tatsuhiro-t/spdylay) may
|
||||
be a better option, either used directly or wrapped with a more spindly-like
|
||||
API.
|
||||
|
||||
|
||||
6. TELNET
|
||||
|
||||
@@ -286,25 +325,92 @@ to provide the data to send.
|
||||
use, but inefficient for any other. Sent data should be sent in larger
|
||||
chunks.
|
||||
|
||||
7. SSL
|
||||
7. SMTP
|
||||
|
||||
7.1 Disable specific versions
|
||||
7.1 Pipelining
|
||||
|
||||
Add support for pipelining emails.
|
||||
|
||||
7.2 Graceful base64 decoding failure
|
||||
|
||||
Rather than shutting down the session and returning an error when the
|
||||
decoding of a base64 encoded authentication response fails, we should
|
||||
gracefully shutdown the authentication process by sending a * response to the
|
||||
server as per RFC4954.
|
||||
|
||||
7.3 Enhanced capability support
|
||||
|
||||
Add the ability, for an application that uses libcurl, to obtain the list of
|
||||
capabilities returned from the EHLO command.
|
||||
|
||||
8. POP3
|
||||
|
||||
8.1 Pipelining
|
||||
|
||||
Add support for pipelining commands.
|
||||
|
||||
8.2 Graceful base64 decoding failure
|
||||
|
||||
Rather than shutting down the session and returning an error when the
|
||||
decoding of a base64 encoded authentication response fails, we should
|
||||
gracefully shutdown the authentication process by sending a * response to the
|
||||
server as per RFC5034.
|
||||
|
||||
8.3 Enhanced capability support
|
||||
|
||||
Add the ability, for an application that uses libcurl, to obtain the list of
|
||||
capabilities returned from the CAPA command.
|
||||
|
||||
9. IMAP
|
||||
|
||||
9.1 Graceful base64 decoding failure
|
||||
|
||||
Rather than shutting down the session and returning an error when the
|
||||
decoding of a base64 encoded authentication response fails, we should
|
||||
gracefully shutdown the authentication process by sending a * response to the
|
||||
server as per RFC3501.
|
||||
|
||||
9.2 Enhanced capability support
|
||||
|
||||
Add the ability, for an application that uses libcurl, to obtain the list of
|
||||
capabilities returned from the CAPABILITY command.
|
||||
|
||||
10. LDAP
|
||||
|
||||
10.1 SASL based authentication mechanisms
|
||||
|
||||
Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
|
||||
to an LDAP server. However, this function sends username and password details
|
||||
using the simple authentication mechanism (as clear text). However, it should
|
||||
be possible to use ldap_bind_s() instead specifing the security context
|
||||
information ourselves.
|
||||
|
||||
11. New protocols
|
||||
|
||||
11.1 RSYNC
|
||||
|
||||
There's no RFC for the protocol or an URI/URL format. An implementation
|
||||
should most probably use an existing rsync library, such as librsync.
|
||||
|
||||
12. SSL
|
||||
|
||||
12.1 Disable specific versions
|
||||
|
||||
Provide an option that allows for disabling specific SSL versions, such as
|
||||
SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
|
||||
|
||||
7.2 Provide mutex locking API
|
||||
12.2 Provide mutex locking API
|
||||
|
||||
Provide a libcurl API for setting mutex callbacks in the underlying SSL
|
||||
library, so that the same application code can use mutex-locking
|
||||
independently of OpenSSL or GnutTLS being used.
|
||||
|
||||
7.3 Evaluate SSL patches
|
||||
12.3 Evaluate SSL patches
|
||||
|
||||
Evaluate/apply Gertjan van Wingerde's SSL patches:
|
||||
http://curl.haxx.se/mail/lib-2004-03/0087.html
|
||||
|
||||
7.4 Cache OpenSSL contexts
|
||||
12.4 Cache OpenSSL contexts
|
||||
|
||||
"Look at SSL cafile - quick traces look to me like these are done on every
|
||||
request as well, when they should only be necessary once per ssl context (or
|
||||
@@ -314,7 +420,7 @@ to provide the data to send.
|
||||
style connections are re-used. It will make us use slightly more memory but
|
||||
it will libcurl do less creations and deletions of SSL contexts.
|
||||
|
||||
7.5 Export session ids
|
||||
12.5 Export session ids
|
||||
|
||||
Add an interface to libcurl that enables "session IDs" to get
|
||||
exported/imported. Cris Bailiff said: "OpenSSL has functions which can
|
||||
@@ -322,56 +428,54 @@ to provide the data to send.
|
||||
the state from such a buffer at a later date - this is used by mod_ssl for
|
||||
apache to implement and SSL session ID cache".
|
||||
|
||||
7.6 Provide callback for cert verification
|
||||
12.6 Provide callback for cert verification
|
||||
|
||||
OpenSSL supports a callback for customised verification of the peer
|
||||
certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
|
||||
it be? There's so much that could be done if it were!
|
||||
|
||||
7.7 Support other SSL libraries
|
||||
12.7 Support other SSL libraries
|
||||
|
||||
Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||
MatrixSSL (http://www.matrixssl.org/).
|
||||
|
||||
7.9 improve configure --with-ssl
|
||||
12.8 improve configure --with-ssl
|
||||
|
||||
make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||
then NSS...
|
||||
|
||||
8. GnuTLS
|
||||
12.9 Support DANE
|
||||
|
||||
8.1 SSL engine stuff
|
||||
DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
|
||||
keys and certs over DNS using DNSSEC as an alternative to the CA model.
|
||||
http://www.rfc-editor.org/rfc/rfc6698.txt
|
||||
|
||||
An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
|
||||
(http://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
|
||||
approach. See Daniel's comments:
|
||||
http://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
|
||||
correct library to base this development on.
|
||||
|
||||
13. GnuTLS
|
||||
|
||||
13.1 SSL engine stuff
|
||||
|
||||
Is this even possible?
|
||||
|
||||
8.3 check connection
|
||||
13.2 check connection
|
||||
|
||||
Add a way to check if the connection seems to be alive, to correspond to the
|
||||
SSL_peak() way we use with OpenSSL.
|
||||
|
||||
8.4 non-gcrypt
|
||||
14. SASL
|
||||
|
||||
libcurl assumes that there are gcrypt functions available when
|
||||
GnuTLS is.
|
||||
14.1 Other authentication mechanisms
|
||||
|
||||
GnuTLS can be built to use libnettle instead as crypto library,
|
||||
which breaks the previously mentioned assumption
|
||||
Add support for GSSAPI to SMTP, POP3 and IMAP.
|
||||
|
||||
The correct fix would be to detect which crypto layer that is in use and
|
||||
adapt our code to use that instead of blindly assuming gcrypt.
|
||||
15. Client
|
||||
|
||||
9. Other protocols
|
||||
|
||||
10. New protocols
|
||||
|
||||
10.1 RSYNC
|
||||
|
||||
There's no RFC for protocol nor URI/URL format. An implementation should
|
||||
most probably use an existing rsync library, such as librsync.
|
||||
|
||||
11. Client
|
||||
|
||||
11.1 sync
|
||||
15.1 sync
|
||||
|
||||
"curl --sync http://example.com/feed[1-100].rss" or
|
||||
"curl --sync http://example.net/{index,calendar,history}.html"
|
||||
@@ -380,12 +484,12 @@ to provide the data to send.
|
||||
remote file is newer than the local file. A Last-Modified HTTP date header
|
||||
should also be used to set the mod date on the downloaded file.
|
||||
|
||||
11.2 glob posts
|
||||
15.2 glob posts
|
||||
|
||||
Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
|
||||
This is easily scripted though.
|
||||
|
||||
11.3 prevent file overwriting
|
||||
15.3 prevent file overwriting
|
||||
|
||||
Add an option that prevents cURL from overwriting existing local files. When
|
||||
used, and there already is an existing file with the target file name
|
||||
@@ -393,14 +497,14 @@ to provide the data to send.
|
||||
existing). So that index.html becomes first index.html.1 and then
|
||||
index.html.2 etc.
|
||||
|
||||
11.4 simultaneous parallel transfers
|
||||
15.4 simultaneous parallel transfers
|
||||
|
||||
The client could be told to use maximum N simultaneous parallel transfers and
|
||||
then just make sure that happens. It should of course not make more than one
|
||||
connection to the same remote host. This would require the client to use the
|
||||
multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
|
||||
|
||||
11.5 provide formpost headers
|
||||
15.5 provide formpost headers
|
||||
|
||||
Extending the capabilities of the multipart formposting. How about leaving
|
||||
the ';type=foo' syntax as it is and adding an extra tag (headers) which
|
||||
@@ -414,7 +518,7 @@ to provide the data to send.
|
||||
which should overwrite the program reasonable defaults (plain/text,
|
||||
8bit...)
|
||||
|
||||
11.6 url-specific options
|
||||
15.6 url-specific options
|
||||
|
||||
Provide a way to make options bound to a specific URL among several on the
|
||||
command line. Possibly by letting ':' separate options between URLs,
|
||||
@@ -428,62 +532,57 @@ to provide the data to send.
|
||||
|
||||
The example would do a POST-GET-POST combination on a single command line.
|
||||
|
||||
11.7 metalink support
|
||||
|
||||
Add metalink support to curl (http://www.metalinker.org/). This is most useful
|
||||
with simultaneous parallel transfers (11.6) but not necessary.
|
||||
|
||||
11.8 warning when setting an option
|
||||
15.7 warning when setting an option
|
||||
|
||||
Display a warning when libcurl returns an error when setting an option.
|
||||
This can be useful to tell when support for a particular feature hasn't been
|
||||
compiled into the library.
|
||||
|
||||
11.9 IPv6 addresses with globbing
|
||||
15.8 IPv6 addresses with globbing
|
||||
|
||||
Currently the command line client needs to get url globbing disabled (with
|
||||
-g) for it to support IPv6 numerical addresses. This is a rather silly flaw
|
||||
that should be corrected. It probably involves a smarter detection of the
|
||||
'[' and ']' letters.
|
||||
|
||||
12. Build
|
||||
16. Build
|
||||
|
||||
12.1 roffit
|
||||
16.1 roffit
|
||||
|
||||
Consider extending 'roffit' to produce decent ASCII output, and use that
|
||||
instead of (g)nroff when building src/hugehelp.c
|
||||
instead of (g)nroff when building src/tool_hugehelp.c
|
||||
|
||||
13. Test suite
|
||||
17. Test suite
|
||||
|
||||
13.1 SSL tunnel
|
||||
17.1 SSL tunnel
|
||||
|
||||
Make our own version of stunnel for simple port forwarding to enable HTTPS
|
||||
and FTP-SSL tests without the stunnel dependency, and it could allow us to
|
||||
provide test tools built with either OpenSSL or GnuTLS
|
||||
|
||||
13.2 nicer lacking perl message
|
||||
17.2 nicer lacking perl message
|
||||
|
||||
If perl wasn't found by the configure script, don't attempt to run the tests
|
||||
but explain something nice why it doesn't.
|
||||
|
||||
13.3 more protocols supported
|
||||
17.3 more protocols supported
|
||||
|
||||
Extend the test suite to include more protocols. The telnet could just do ftp
|
||||
or http operations (for which we have test servers).
|
||||
|
||||
13.4 more platforms supported
|
||||
17.4 more platforms supported
|
||||
|
||||
Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
|
||||
fork()s and it should become even more portable.
|
||||
|
||||
14. Next SONAME bump
|
||||
18. Next SONAME bump
|
||||
|
||||
14.1 http-style HEAD output for ftp
|
||||
18.1 http-style HEAD output for ftp
|
||||
|
||||
#undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
|
||||
from being output in NOBODY requests over ftp
|
||||
|
||||
14.2 combine error codes
|
||||
18.2 combine error codes
|
||||
|
||||
Combine some of the error codes to remove duplicates. The original
|
||||
numbering should not be changed, and the old identifiers would be
|
||||
@@ -493,37 +592,44 @@ to provide the data to send.
|
||||
Candidates for removal and their replacements:
|
||||
|
||||
CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
|
||||
CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
|
||||
CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
|
||||
|
||||
CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
|
||||
|
||||
CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
|
||||
|
||||
CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
|
||||
|
||||
CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
|
||||
CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
|
||||
|
||||
14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
18.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
The current prototype only provides 'purpose' that tells what the
|
||||
connection/socket is for, but not any protocol or similar. It makes it hard
|
||||
for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
|
||||
similar.
|
||||
|
||||
15. Next major release
|
||||
10. Next major release
|
||||
|
||||
15.1 cleanup return codes
|
||||
19.1 cleanup return codes
|
||||
|
||||
curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
|
||||
CURLMcode. These should be changed to be the same.
|
||||
|
||||
15.2 remove obsolete defines
|
||||
19.2 remove obsolete defines
|
||||
|
||||
remove obsolete defines from curl/curl.h
|
||||
|
||||
15.3 size_t
|
||||
19.3 size_t
|
||||
|
||||
make several functions use size_t instead of int in their APIs
|
||||
|
||||
15.4 remove several functions
|
||||
19.4 remove several functions
|
||||
|
||||
remove the following functions from the public API:
|
||||
|
||||
@@ -544,18 +650,18 @@ to provide the data to send.
|
||||
|
||||
curl_multi_socket_all
|
||||
|
||||
15.5 remove CURLOPT_FAILONERROR
|
||||
19.5 remove CURLOPT_FAILONERROR
|
||||
|
||||
Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
|
||||
internally. Let the app judge success or not for itself.
|
||||
|
||||
15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
19.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
|
||||
Remove support for a global DNS cache. Anything global is silly, and we
|
||||
already offer the share interface for the same functionality but done
|
||||
"right".
|
||||
|
||||
15.7 remove progress meter from libcurl
|
||||
19.7 remove progress meter from libcurl
|
||||
|
||||
The internally provided progress meter output doesn't belong in the library.
|
||||
Basically no application wants it (apart from curl) but instead applications
|
||||
@@ -565,7 +671,7 @@ to provide the data to send.
|
||||
variable types passed to it instead of doubles so that big files work
|
||||
correctly.
|
||||
|
||||
15.8 remove 'curl_httppost' from public
|
||||
19.8 remove 'curl_httppost' from public
|
||||
|
||||
curl_formadd() was made to fill in a public struct, but the fact that the
|
||||
struct is public is never really used by application for their own advantage
|
||||
@@ -574,10 +680,21 @@ to provide the data to send.
|
||||
Changing them to return a private handle will benefit the implementation and
|
||||
allow us much greater freedoms while still maintining a solid API and ABI.
|
||||
|
||||
15.9 have form functions use CURL handle argument
|
||||
19.9 have form functions use CURL handle argument
|
||||
|
||||
curl_formadd() and curl_formget() both currently have no CURL handle
|
||||
argument, but both can use a callback that is set in the easy handle, and
|
||||
thus curl_formget() with callback cannot function without first having
|
||||
curl_easy_perform() (or similar) called - which is hard to grasp and a design
|
||||
mistake.
|
||||
|
||||
19.10 Add CURLOPT_MAIL_CLIENT option
|
||||
|
||||
Rather than use the URL to specify the mail client string to present in the
|
||||
HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
|
||||
specifing this data as the URL is non-standard and to be honest a bit of a
|
||||
hack ;-)
|
||||
|
||||
Please see the following thread for more information:
|
||||
http://curl.haxx.se/mail/lib-2012-05/0178.html
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" *
|
||||
.\" * This software is licensed as described in the file COPYING, which
|
||||
.\" * you should have received as part of this distribution. The terms
|
||||
@@ -93,7 +93,6 @@ What's the installed libcurl version?
|
||||
|
||||
How do I build a single file with a one-line command?
|
||||
|
||||
$ `curl-config --cc --cflags --libs` -o example example.c
|
||||
|
||||
$ `curl-config --cc --cflags` -o example example.c `curl-config --libs`
|
||||
.SH "SEE ALSO"
|
||||
.BR curl (1)
|
||||
|
568
docs/curl.1
568
docs/curl.1
File diff suppressed because it is too large
Load Diff
4
docs/examples/.gitignore
vendored
4
docs/examples/.gitignore
vendored
@@ -11,6 +11,7 @@ ftp-wildcard
|
||||
ftpget
|
||||
ftpgetinfo
|
||||
ftpgetresp
|
||||
ftpsget
|
||||
ftpupload
|
||||
getinfo
|
||||
getinmemory
|
||||
@@ -34,6 +35,7 @@ resolve
|
||||
rtsp
|
||||
sendrecv
|
||||
sepheaders
|
||||
sftpget
|
||||
simple
|
||||
simplepost
|
||||
simplesmtp
|
||||
@@ -41,3 +43,5 @@ simplessl
|
||||
smtp-multi
|
||||
smtp-tls
|
||||
url2file
|
||||
usercertinmem
|
||||
xmlstream
|
||||
|
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -23,7 +23,7 @@
|
||||
AUTOMAKE_OPTIONS = foreign nostdinc
|
||||
|
||||
EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
|
||||
Makefile.netware makefile.dj printf_macro.h $(COMPLICATED_EXAMPLES)
|
||||
Makefile.netware makefile.dj $(COMPLICATED_EXAMPLES)
|
||||
|
||||
# Specify our include paths here, and do it relative to $(top_srcdir) and
|
||||
# $(top_builddir), to ensure that these paths which belong to the library
|
||||
@@ -31,24 +31,31 @@ EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
|
||||
# might possibly already be installed in the system.
|
||||
#
|
||||
# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
|
||||
# $(top_builddir)/include for generated curlbuild.h included from lib/setup.h
|
||||
# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
|
||||
# $(top_srcdir)/include is for libcurl's external include files
|
||||
|
||||
INCLUDES = -I$(top_builddir)/include/curl \
|
||||
-I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/include
|
||||
AM_CPPFLAGS = -I$(top_builddir)/include/curl \
|
||||
-I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/include
|
||||
|
||||
LIBDIR = $(top_builddir)/lib
|
||||
|
||||
if STATICLIB
|
||||
# we need this define when building with a static lib on Windows
|
||||
STATICCPPFLAGS = -DCURL_STATICLIB
|
||||
# Avoid libcurl obsolete stuff
|
||||
AM_CPPFLAGS += -DCURL_NO_OLDIES
|
||||
|
||||
if USE_CPPFLAG_CURL_STATICLIB
|
||||
AM_CPPFLAGS += -DCURL_STATICLIB
|
||||
endif
|
||||
|
||||
CPPFLAGS = -DCURL_NO_OLDIES $(STATICCPPFLAGS)
|
||||
# Prevent LIBS from being used for all link targets
|
||||
LIBS = $(BLANK_AT_MAKETIME)
|
||||
|
||||
# Dependencies
|
||||
if USE_EXPLICIT_LIB_DEPS
|
||||
LDADD = $(LIBDIR)/libcurl.la @LIBCURL_LIBS@
|
||||
else
|
||||
LDADD = $(LIBDIR)/libcurl.la
|
||||
endif
|
||||
|
||||
# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
|
||||
include Makefile.inc
|
||||
|
@@ -5,11 +5,12 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
|
||||
persistant post-callback postit2 sepheaders simple simplepost simplessl \
|
||||
sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard \
|
||||
smtp-multi simplesmtp smtp-tls rtsp externalsocket resolve \
|
||||
progressfunc pop3s pop3slist imap url2file
|
||||
progressfunc pop3s pop3slist imap url2file sftpget ftpsget postinmemory
|
||||
|
||||
# These examples require external dependencies that may not be commonly
|
||||
# available on POSIX systems, so don't bother attempting to compile them here.
|
||||
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cc cacertinmem.c \
|
||||
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
|
||||
ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \
|
||||
opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
|
||||
smooth-gtk-thread.c version-check.pl
|
||||
smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
|
||||
multi-uv.c xmlstream.c usercertinmem.c
|
||||
|
@@ -27,28 +27,22 @@
|
||||
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn
|
||||
##
|
||||
## Hint: you can also set environment vars to control the build, f.e.:
|
||||
## set ZLIB_PATH=c:/zlib-1.2.5
|
||||
## set ZLIB_PATH=c:/zlib-1.2.8
|
||||
## set ZLIB=1
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
# Edit the path below to point to the base of your Zlib sources.
|
||||
ifndef ZLIB_PATH
|
||||
ZLIB_PATH = ../../../zlib-1.2.5
|
||||
ZLIB_PATH = ../../../zlib-1.2.8
|
||||
endif
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../../openssl-0.9.8r
|
||||
endif
|
||||
ifndef OPENSSL_LIBPATH
|
||||
OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
|
||||
endif
|
||||
ifndef OPENSSL_LIBS
|
||||
OPENSSL_LIBS = -leay32 -lssl32
|
||||
OPENSSL_PATH = ../../../openssl-0.9.8y
|
||||
endif
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
ifndef LIBSSH2_PATH
|
||||
LIBSSH2_PATH = ../../../libssh2-1.3.0
|
||||
LIBSSH2_PATH = ../../../libssh2-1.4.3
|
||||
endif
|
||||
# Edit the path below to point to the base of your librtmp package.
|
||||
ifndef LIBRTMP_PATH
|
||||
@@ -81,19 +75,44 @@ ifndef ARCH
|
||||
ARCH = w32
|
||||
endif
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -g -O2 -Wall
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
CC = $(CROSSPREFIX)gcc
|
||||
CFLAGS = -g -O2 -Wall
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
ifeq ($(ARCH),w64)
|
||||
CFLAGS += -D_AMD64_
|
||||
CFLAGS += -D_AMD64_
|
||||
endif
|
||||
# comment LDFLAGS below to keep debug info
|
||||
LDFLAGS = -s
|
||||
RC = windres
|
||||
RCFLAGS = --include-dir=$(PROOT)/include -O COFF -i
|
||||
LDFLAGS = -s
|
||||
RC = $(CROSSPREFIX)windres
|
||||
RCFLAGS = --include-dir=$(PROOT)/include -O COFF -i
|
||||
|
||||
RM = del /q /f 2>NUL
|
||||
CP = copy
|
||||
# Platform-dependent helper tool macros
|
||||
ifeq ($(findstring /sh,$(SHELL)),/sh)
|
||||
DEL = rm -f $1
|
||||
RMDIR = rm -fr $1
|
||||
MKDIR = mkdir -p $1
|
||||
COPY = -cp -afv $1 $2
|
||||
#COPYR = -cp -afr $1/* $2
|
||||
COPYR = -rsync -aC $1/* $2
|
||||
TOUCH = touch $1
|
||||
CAT = cat
|
||||
ECHONL = echo ""
|
||||
DL = '
|
||||
else
|
||||
ifeq "$(OS)" "Windows_NT"
|
||||
DEL = -del 2>NUL /q /f $(subst /,\,$1)
|
||||
RMDIR = -rd 2>NUL /q /s $(subst /,\,$1)
|
||||
else
|
||||
DEL = -del 2>NUL $(subst /,\,$1)
|
||||
RMDIR = -deltree 2>NUL /y $(subst /,\,$1)
|
||||
endif
|
||||
MKDIR = -md 2>NUL $(subst /,\,$1)
|
||||
COPY = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
|
||||
COPYR = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
|
||||
TOUCH = copy 2>&1>NUL /b $(subst /,\,$1) +,,
|
||||
CAT = type
|
||||
ECHONL = $(ComSpec) /c echo.
|
||||
endif
|
||||
|
||||
########################################################
|
||||
## Nothing more to do below this line!
|
||||
@@ -138,6 +157,13 @@ endif
|
||||
ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
|
||||
IPV6 = 1
|
||||
endif
|
||||
ifeq ($(findstring -metalink,$(CFG)),-metalink)
|
||||
METALINK = 1
|
||||
endif
|
||||
ifeq ($(findstring -winssl,$(CFG)),-winssl)
|
||||
SCHANNEL = 1
|
||||
SSPI = 1
|
||||
endif
|
||||
|
||||
INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib
|
||||
|
||||
@@ -148,6 +174,7 @@ else
|
||||
curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a
|
||||
curl_LDADD = -L$(PROOT)/lib -lcurl
|
||||
CFLAGS += -DCURL_STATICLIB
|
||||
LDFLAGS += -static
|
||||
endif
|
||||
ifdef ARES
|
||||
ifndef DYN
|
||||
@@ -165,7 +192,22 @@ ifdef SSH2
|
||||
curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
|
||||
endif
|
||||
ifdef SSL
|
||||
CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
|
||||
ifndef OPENSSL_LIBPATH
|
||||
OPENSSL_LIBS = -lssl -lcrypto
|
||||
ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out"
|
||||
OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
|
||||
ifdef DYN
|
||||
OPENSSL_LIBS = -lssl32 -leay32
|
||||
endif
|
||||
endif
|
||||
ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib"
|
||||
OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
|
||||
endif
|
||||
endif
|
||||
ifndef DYN
|
||||
OPENSSL_LIBS += -lgdi32 -lcrypt32
|
||||
endif
|
||||
CFLAGS += -DUSE_SSLEAY
|
||||
curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
|
||||
endif
|
||||
ifdef ZLIB
|
||||
@@ -184,6 +226,9 @@ endif
|
||||
endif
|
||||
ifdef SSPI
|
||||
CFLAGS += -DUSE_WINDOWS_SSPI
|
||||
ifdef SCHANNEL
|
||||
CFLAGS += -DUSE_SCHANNEL
|
||||
endif
|
||||
endif
|
||||
ifdef SPNEGO
|
||||
CFLAGS += -DHAVE_SPNEGO
|
||||
@@ -215,6 +260,8 @@ include Makefile.inc
|
||||
check_PROGRAMS := $(patsubst %,%.exe,$(strip $(check_PROGRAMS)))
|
||||
check_PROGRAMS += ftpuploadresume.exe synctime.exe
|
||||
|
||||
.PRECIOUS: %.o
|
||||
|
||||
|
||||
all: $(check_PROGRAMS)
|
||||
|
||||
@@ -228,8 +275,8 @@ all: $(check_PROGRAMS)
|
||||
$(RC) $(RCFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
-$(RM) $(check_PROGRAMS:.exe=.o)
|
||||
@$(call DEL, $(check_PROGRAMS:.exe=.o))
|
||||
|
||||
distclean vclean: clean
|
||||
-$(RM) $(check_PROGRAMS)
|
||||
@$(call DEL, $(check_PROGRAMS))
|
||||
|
||||
|
@@ -14,17 +14,17 @@ endif
|
||||
|
||||
# Edit the path below to point to the base of your Zlib sources.
|
||||
ifndef ZLIB_PATH
|
||||
ZLIB_PATH = ../../../zlib-1.2.5
|
||||
ZLIB_PATH = ../../../zlib-1.2.8
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../../openssl-0.9.8r
|
||||
OPENSSL_PATH = ../../../openssl-0.9.8y
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
ifndef LIBSSH2_PATH
|
||||
LIBSSH2_PATH = ../../../libssh2-1.3.0
|
||||
LIBSSH2_PATH = ../../../libssh2-1.4.3
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your axTLS package.
|
||||
|
@@ -61,6 +61,7 @@ multi-debugcallback.c - a multi-interface app using the debug callback
|
||||
multi-double.c - a multi-interface app doing two simultaneous transfers
|
||||
multi-post.c - a multi-interface app doing a multipart formpost
|
||||
multi-single.c - a multi-interface app getting a single file
|
||||
multi-uv.c - a multi-interface app using libuv
|
||||
multithread.c - an example using multi-treading transferring multiple files
|
||||
opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
|
||||
persistant.c - request two URLs with a persistent connection
|
||||
@@ -77,4 +78,5 @@ simplepost.c - HTTP POST
|
||||
simplessl.c - HTTPS example with certificates many options set
|
||||
synctime.c - Sync local time by extracting date from remote HTTP servers
|
||||
url2file.c - download a document and store it in a file
|
||||
xmlstream.c - Stream-parse a document using the streaming Expat parser
|
||||
10-at-a-time.c - Download many files simultaneously, 10 at a time.
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -27,7 +27,9 @@
|
||||
# ifdef __VMS
|
||||
typedef int intptr_t;
|
||||
# endif
|
||||
# include <stdint.h>
|
||||
# if !defined(_AIX) && !defined(__sgi) && !defined(__osf__)
|
||||
# include <stdint.h>
|
||||
# endif
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
@@ -42,7 +44,6 @@
|
||||
#endif
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include "printf_macro.h"
|
||||
|
||||
#if LIBCURL_VERSION_NUM < 0x070c03
|
||||
#error "upgrade your libcurl to no less than 7.12.3"
|
||||
@@ -52,6 +53,12 @@
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#if defined(_AIX) || defined(__sgi) || defined(__osf__)
|
||||
#ifndef intptr_t
|
||||
#define intptr_t long
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This example shows a HTTP PUT operation with authentiction using "any"
|
||||
* type. It PUTs a file given as a command line argument to the URL also given
|
||||
@@ -89,12 +96,16 @@ static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t retcode;
|
||||
curl_off_t nread;
|
||||
|
||||
intptr_t fd = (intptr_t)stream;
|
||||
|
||||
retcode = read(fd, ptr, size * nmemb);
|
||||
|
||||
fprintf(stderr, "*** We read %" _FMT_SIZE_T " bytes from file\n", retcode);
|
||||
nread = (curl_off_t)retcode;
|
||||
|
||||
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
|
||||
" bytes from file\n", nread);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
@@ -159,6 +170,10 @@ int main(int argc, char **argv)
|
||||
|
||||
/* Now run off and do what you've been told! */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
454
docs/examples/asiohiper.cpp
Normal file
454
docs/examples/asiohiper.cpp
Normal file
@@ -0,0 +1,454 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* file: asiohiper.cpp
|
||||
* Example program to demonstrate the use of multi socket interface
|
||||
* with boost::asio
|
||||
*
|
||||
* This program is in c++ and uses boost::asio instead of libevent/libev.
|
||||
* Requires boost::asio, boost::bind and boost::system
|
||||
*
|
||||
* This is an adaptation of libcurl's "hiperfifo.c" and "evhiperfifo.c"
|
||||
* sample programs. This example implements a subset of the functionality from
|
||||
* hiperfifo.c, for full functionality refer hiperfifo.c or evhiperfifo.c
|
||||
*
|
||||
* Written by Lijo Antony based on hiperfifo.c by Jeff Pohlmeyer
|
||||
*
|
||||
* When running, the program creates an easy handle for a URL and
|
||||
* uses the curl_multi API to fetch it.
|
||||
*
|
||||
* Note:
|
||||
* For the sake of simplicity, URL is hard coded to "www.google.com"
|
||||
*
|
||||
* This is purely a demo app, all retrieved data is simply discarded by the write
|
||||
* callback.
|
||||
*/
|
||||
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <boost/asio.hpp>
|
||||
#include <boost/bind.hpp>
|
||||
|
||||
#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
|
||||
|
||||
/* boost::asio related objects
|
||||
* using global variables for simplicity
|
||||
*/
|
||||
boost::asio::io_service io_service;
|
||||
boost::asio::deadline_timer timer(io_service);
|
||||
std::map<curl_socket_t, boost::asio::ip::tcp::socket *> socket_map;
|
||||
|
||||
/* Global information, common to all connections */
|
||||
typedef struct _GlobalInfo
|
||||
{
|
||||
CURLM *multi;
|
||||
int still_running;
|
||||
} GlobalInfo;
|
||||
|
||||
/* Information associated with a specific easy handle */
|
||||
typedef struct _ConnInfo
|
||||
{
|
||||
CURL *easy;
|
||||
char *url;
|
||||
GlobalInfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
} ConnInfo;
|
||||
|
||||
static void timer_cb(const boost::system::error_code & error, GlobalInfo *g);
|
||||
|
||||
/* Update the event timer after curl_multi library calls */
|
||||
static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nmulti_timer_cb: timeout_ms %ld", timeout_ms);
|
||||
|
||||
/* cancel running timer */
|
||||
timer.cancel();
|
||||
|
||||
if ( timeout_ms > 0 )
|
||||
{
|
||||
/* update timer */
|
||||
timer.expires_from_now(boost::posix_time::millisec(timeout_ms));
|
||||
timer.async_wait(boost::bind(&timer_cb, _1, g));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* call timeout function immediately */
|
||||
boost::system::error_code error; /*success*/
|
||||
timer_cb(error, g);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Die if we get a bad CURLMcode somewhere */
|
||||
static void mcode_or_die(const char *where, CURLMcode code)
|
||||
{
|
||||
if ( CURLM_OK != code )
|
||||
{
|
||||
const char *s;
|
||||
switch ( code )
|
||||
{
|
||||
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
|
||||
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
|
||||
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
|
||||
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
|
||||
case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
|
||||
case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
|
||||
case CURLM_LAST: s="CURLM_LAST"; break;
|
||||
default: s="CURLM_unknown";
|
||||
break;
|
||||
case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET";
|
||||
fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s);
|
||||
/* ignore this error */
|
||||
return;
|
||||
}
|
||||
fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s);
|
||||
exit(code);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for completed transfers, and remove their easy handles */
|
||||
static void check_multi_info(GlobalInfo *g)
|
||||
{
|
||||
char *eff_url;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
fprintf(MSG_OUT, "\nREMAINING: %d", g->still_running);
|
||||
|
||||
while ((msg = curl_multi_info_read(g->multi, &msgs_left)))
|
||||
{
|
||||
if (msg->msg == CURLMSG_DONE)
|
||||
{
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "\nDONE: %s => (%d) %s", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Called by asio when there is an action on a socket */
|
||||
static void event_cb(GlobalInfo * g, boost::asio::ip::tcp::socket * tcp_socket, int action)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nevent_cb: action=%d", action);
|
||||
|
||||
CURLMcode rc;
|
||||
rc = curl_multi_socket_action(g->multi, tcp_socket->native_handle(), action, &g->still_running);
|
||||
|
||||
mcode_or_die("event_cb: curl_multi_socket_action", rc);
|
||||
check_multi_info(g);
|
||||
|
||||
if ( g->still_running <= 0 )
|
||||
{
|
||||
fprintf(MSG_OUT, "\nlast transfer done, kill timeout");
|
||||
timer.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
/* Called by asio when our timeout expires */
|
||||
static void timer_cb(const boost::system::error_code & error, GlobalInfo *g)
|
||||
{
|
||||
if ( !error)
|
||||
{
|
||||
fprintf(MSG_OUT, "\ntimer_cb: ");
|
||||
|
||||
CURLMcode rc;
|
||||
rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running);
|
||||
|
||||
mcode_or_die("timer_cb: curl_multi_socket_action", rc);
|
||||
check_multi_info(g);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up any data */
|
||||
static void remsock(int *f, GlobalInfo *g)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nremsock: ");
|
||||
|
||||
if ( f )
|
||||
{
|
||||
free(f);
|
||||
}
|
||||
}
|
||||
|
||||
static void setsock(int *fdp, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nsetsock: socket=%d, act=%d, fdp=%p", s, act, fdp);
|
||||
|
||||
std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it = socket_map.find(s);
|
||||
|
||||
if ( it == socket_map.end() )
|
||||
{
|
||||
fprintf(MSG_OUT, "\nsocket %d is a c-ares socket, ignoring", s);
|
||||
return;
|
||||
}
|
||||
|
||||
boost::asio::ip::tcp::socket * tcp_socket = it->second;
|
||||
|
||||
*fdp = act;
|
||||
|
||||
if ( act == CURL_POLL_IN )
|
||||
{
|
||||
fprintf(MSG_OUT, "\nwatching for socket to become readable");
|
||||
|
||||
tcp_socket->async_read_some(boost::asio::null_buffers(),
|
||||
boost::bind(&event_cb, g,
|
||||
tcp_socket,
|
||||
act));
|
||||
}
|
||||
else if ( act == CURL_POLL_OUT )
|
||||
{
|
||||
fprintf(MSG_OUT, "\nwatching for socket to become writable");
|
||||
|
||||
tcp_socket->async_write_some(boost::asio::null_buffers(),
|
||||
boost::bind(&event_cb, g,
|
||||
tcp_socket,
|
||||
act));
|
||||
}
|
||||
else if ( act == CURL_POLL_INOUT )
|
||||
{
|
||||
fprintf(MSG_OUT, "\nwatching for socket to become readable & writable");
|
||||
|
||||
tcp_socket->async_read_some(boost::asio::null_buffers(),
|
||||
boost::bind(&event_cb, g,
|
||||
tcp_socket,
|
||||
act));
|
||||
|
||||
tcp_socket->async_write_some(boost::asio::null_buffers(),
|
||||
boost::bind(&event_cb, g,
|
||||
tcp_socket,
|
||||
act));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
|
||||
{
|
||||
int *fdp = (int *)calloc(sizeof(int), 1); /* fdp is used to store current action */
|
||||
|
||||
setsock(fdp, s, easy, action, g);
|
||||
curl_multi_assign(g->multi, s, fdp);
|
||||
}
|
||||
|
||||
/* CURLMOPT_SOCKETFUNCTION */
|
||||
static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nsock_cb: socket=%d, what=%d, sockp=%p", s, what, sockp);
|
||||
|
||||
GlobalInfo *g = (GlobalInfo*) cbp;
|
||||
int *actionp = (int*) sockp;
|
||||
const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE"};
|
||||
|
||||
fprintf(MSG_OUT,
|
||||
"\nsocket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
|
||||
|
||||
if ( what == CURL_POLL_REMOVE )
|
||||
{
|
||||
fprintf(MSG_OUT, "\n");
|
||||
remsock(actionp, g);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !actionp )
|
||||
{
|
||||
fprintf(MSG_OUT, "\nAdding data: %s", whatstr[what]);
|
||||
addsock(s, e, what, g);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(MSG_OUT,
|
||||
"\nChanging action from %s to %s",
|
||||
whatstr[*actionp], whatstr[what]);
|
||||
setsock(actionp, s, e, what, g);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* CURLOPT_WRITEFUNCTION */
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
{
|
||||
|
||||
size_t written = size * nmemb;
|
||||
char* pBuffer = (char*)malloc(written + 1);
|
||||
|
||||
strncpy(pBuffer, (const char *)ptr, written);
|
||||
pBuffer [written] = '\0';
|
||||
|
||||
fprintf(MSG_OUT, "%s", pBuffer);
|
||||
|
||||
free(pBuffer);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
|
||||
/* CURLOPT_PROGRESSFUNCTION */
|
||||
static int prog_cb (void *p, double dltotal, double dlnow, double ult,
|
||||
double uln)
|
||||
{
|
||||
ConnInfo *conn = (ConnInfo *)p;
|
||||
(void)ult;
|
||||
(void)uln;
|
||||
|
||||
fprintf(MSG_OUT, "\nProgress: %s (%g/%g)", conn->url, dlnow, dltotal);
|
||||
fprintf(MSG_OUT, "\nProgress: %s (%g)", conn->url, ult);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* CURLOPT_OPENSOCKETFUNCTION */
|
||||
static curl_socket_t opensocket(void *clientp,
|
||||
curlsocktype purpose,
|
||||
struct curl_sockaddr *address)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nopensocket :");
|
||||
|
||||
curl_socket_t sockfd = CURL_SOCKET_BAD;
|
||||
|
||||
/* restrict to ipv4 */
|
||||
if (purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET)
|
||||
{
|
||||
/* create a tcp socket object */
|
||||
boost::asio::ip::tcp::socket *tcp_socket = new boost::asio::ip::tcp::socket(io_service);
|
||||
|
||||
/* open it and get the native handle*/
|
||||
boost::system::error_code ec;
|
||||
tcp_socket->open(boost::asio::ip::tcp::v4(), ec);
|
||||
|
||||
if (ec)
|
||||
{
|
||||
//An error occurred
|
||||
std::cout << std::endl << "Couldn't open socket [" << ec << "][" << ec.message() << "]";
|
||||
fprintf(MSG_OUT, "\nERROR: Returning CURL_SOCKET_BAD to signal error");
|
||||
}
|
||||
else
|
||||
{
|
||||
sockfd = tcp_socket->native_handle();
|
||||
fprintf(MSG_OUT, "\nOpened socket %d", sockfd);
|
||||
|
||||
/* save it for monitoring */
|
||||
socket_map.insert(std::pair<curl_socket_t, boost::asio::ip::tcp::socket *>(sockfd, tcp_socket));
|
||||
}
|
||||
}
|
||||
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
/* CURLOPT_CLOSESOCKETFUNCTION */
|
||||
static int closesocket(void *clientp, curl_socket_t item)
|
||||
{
|
||||
fprintf(MSG_OUT, "\nclosesocket : %d", item);
|
||||
|
||||
std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it = socket_map.find(item);
|
||||
|
||||
if ( it != socket_map.end() )
|
||||
{
|
||||
delete it->second;
|
||||
socket_map.erase(it);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Create a new easy handle, and add it to the global curl_multi */
|
||||
static void new_conn(char *url, GlobalInfo *g )
|
||||
{
|
||||
ConnInfo *conn;
|
||||
CURLMcode rc;
|
||||
|
||||
conn = (ConnInfo *)calloc(1, sizeof(ConnInfo));
|
||||
memset(conn, 0, sizeof(ConnInfo));
|
||||
conn->error[0]='\0';
|
||||
|
||||
conn->easy = curl_easy_init();
|
||||
|
||||
if ( !conn->easy )
|
||||
{
|
||||
fprintf(MSG_OUT, "\ncurl_easy_init() failed, exiting!");
|
||||
exit(2);
|
||||
}
|
||||
conn->global = g;
|
||||
conn->url = strdup(url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
|
||||
|
||||
/* call this function to get a socket */
|
||||
curl_easy_setopt(conn->easy, CURLOPT_OPENSOCKETFUNCTION, opensocket);
|
||||
|
||||
/* call this function to close a socket */
|
||||
curl_easy_setopt(conn->easy, CURLOPT_CLOSESOCKETFUNCTION, closesocket);
|
||||
|
||||
fprintf(MSG_OUT,
|
||||
"\nAdding easy %p to multi %p (%s)", conn->easy, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
/* note that the add_handle() will set a time-out to trigger very soon so
|
||||
that the necessary socket_action() call will be called by this app */
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GlobalInfo g;
|
||||
CURLMcode rc;
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
memset(&g, 0, sizeof(GlobalInfo));
|
||||
g.multi = curl_multi_init();
|
||||
|
||||
curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
|
||||
curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
|
||||
curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
|
||||
curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
|
||||
|
||||
new_conn((char *)"www.google.com", &g); /* add a URL */
|
||||
|
||||
/* enter io_service run loop */
|
||||
io_service.run();
|
||||
|
||||
curl_multi_cleanup(g.multi);
|
||||
|
||||
fprintf(MSG_OUT, "\ndone.\n");
|
||||
return 0;
|
||||
}
|
@@ -52,18 +52,24 @@ int main(void)
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(!res) {
|
||||
struct curl_certinfo *ci = NULL;
|
||||
union {
|
||||
struct curl_slist *to_info;
|
||||
struct curl_certinfo *to_certinfo;
|
||||
} ptr;
|
||||
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ci);
|
||||
ptr.to_info = NULL;
|
||||
|
||||
if(!res && ci) {
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ptr.to_info);
|
||||
|
||||
if(!res && ptr.to_info) {
|
||||
int i;
|
||||
printf("%d certs!\n", ci->num_of_certs);
|
||||
|
||||
for(i=0; i<ci->num_of_certs; i++) {
|
||||
printf("%d certs!\n", ptr.to_certinfo->num_of_certs);
|
||||
|
||||
for(i = 0; i < ptr.to_certinfo->num_of_certs; i++) {
|
||||
struct curl_slist *slist;
|
||||
|
||||
for(slist = ci->certinfo[i]; slist; slist = slist->next)
|
||||
for(slist = ptr.to_certinfo->certinfo[i]; slist; slist = slist->next)
|
||||
printf("%s\n", slist->data);
|
||||
|
||||
}
|
||||
@@ -71,7 +77,6 @@ int main(void)
|
||||
|
||||
}
|
||||
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
|
@@ -60,7 +60,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURLcode res;
|
||||
int prtsep = 0, prttime = 0;
|
||||
int prtall = 0, prtsep = 0, prttime = 0;
|
||||
const char *url = URL_1M;
|
||||
char *appname = argv[0];
|
||||
|
||||
@@ -77,6 +77,8 @@ int main(int argc, char *argv[])
|
||||
fprintf(stderr, "\r%s %s - %s\n",
|
||||
appname, CHKSPEED_VERSION, curl_version());
|
||||
exit(1);
|
||||
} else if (strncasecmp(*argv, "-A", 2) == 0) {
|
||||
prtall = 1;
|
||||
} else if (strncasecmp(*argv, "-X", 2) == 0) {
|
||||
prtsep = 1;
|
||||
} else if (strncasecmp(*argv, "-T", 2) == 0) {
|
||||
@@ -161,6 +163,18 @@ int main(int argc, char *argv[])
|
||||
if((CURLE_OK == res) && (val>0))
|
||||
printf("Average download speed: %0.3f kbyte/sec.\n", val / 1024);
|
||||
|
||||
if (prtall) {
|
||||
/* check for name resolution time */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME, &val);
|
||||
if((CURLE_OK == res) && (val>0))
|
||||
printf("Name lookup time: %0.3f sec.\n", val);
|
||||
|
||||
/* check for connect time */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_CONNECT_TIME, &val);
|
||||
if((CURLE_OK == res) && (val>0))
|
||||
printf("Connect time: %0.3f sec.\n", val);
|
||||
}
|
||||
|
||||
} else {
|
||||
fprintf(stderr, "Error while fetching '%s' : %s\n",
|
||||
url, curl_easy_strerror(res));
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -89,7 +89,7 @@ main(void)
|
||||
#endif
|
||||
/* Netscape format cookie */
|
||||
snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s",
|
||||
".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!");
|
||||
".google.com", "TRUE", "/", "FALSE", (unsigned long)time(NULL) + 31337UL, "PREF", "hello google, i like you very much!");
|
||||
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
|
||||
if (res != CURLE_OK) {
|
||||
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -130,8 +130,15 @@ int main(void)
|
||||
/* the DEBUGFUNCTION has no effect until we enable VERBOSE */
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
/* example.com is redirected, so we tell libcurl to follow redirection */
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -336,7 +336,7 @@ static void new_conn(char *url, GlobalInfo *g )
|
||||
conn->url = strdup(url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -47,6 +47,10 @@
|
||||
#define IPADDR "127.0.0.1"
|
||||
#define PORTNUM 80
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||
@@ -57,7 +61,10 @@ static curl_socket_t opensocket(void *clientp,
|
||||
curlsocktype purpose,
|
||||
struct curl_sockaddr *address)
|
||||
{
|
||||
curl_socket_t sockfd = *(curl_socket_t *)clientp;
|
||||
curl_socket_t sockfd;
|
||||
(void)purpose;
|
||||
(void)address;
|
||||
sockfd = *(curl_socket_t *)clientp;
|
||||
/* the actual externally set socket is passed in via the OPENSOCKETDATA
|
||||
option */
|
||||
return sockfd;
|
||||
@@ -66,6 +73,9 @@ static curl_socket_t opensocket(void *clientp,
|
||||
static int sockopt_callback(void *clientp, curl_socket_t curlfd,
|
||||
curlsocktype purpose)
|
||||
{
|
||||
(void)clientp;
|
||||
(void)curlfd;
|
||||
(void)purpose;
|
||||
/* This return code was added in libcurl 7.21.5 */
|
||||
return CURL_SOCKOPT_ALREADY_CONNECTED;
|
||||
}
|
||||
@@ -96,7 +106,7 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
|
||||
|
||||
/* Create the socket "manually" */
|
||||
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
|
||||
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == CURL_SOCKET_BAD ) {
|
||||
printf("Error creating listening socket.\n");
|
||||
return 3;
|
||||
}
|
||||
|
@@ -64,14 +64,21 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* now extract transfer info */
|
||||
curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
|
||||
curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
|
||||
}
|
||||
else {
|
||||
/* now extract transfer info */
|
||||
curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
|
||||
curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
|
||||
|
||||
fprintf(stderr, "Speed: %.3f bytes/sec during %.3f seconds\n",
|
||||
speed_upload, total_time);
|
||||
fprintf(stderr, "Speed: %.3f bytes/sec during %.3f seconds\n",
|
||||
speed_upload, total_time);
|
||||
|
||||
}
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -33,7 +33,7 @@ static long file_is_comming(struct curl_fileinfo *finfo,
|
||||
static long file_is_downloaded(struct callback_data *data);
|
||||
|
||||
static size_t write_it(char *buff, size_t size, size_t nmemb,
|
||||
struct callback_data *data);
|
||||
void *cb_data);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
@@ -135,8 +135,9 @@ static long file_is_downloaded(struct callback_data *data)
|
||||
}
|
||||
|
||||
static size_t write_it(char *buff, size_t size, size_t nmemb,
|
||||
struct callback_data *data)
|
||||
void *cb_data)
|
||||
{
|
||||
struct callback_data *data = cb_data;
|
||||
size_t written = 0;
|
||||
if(data->output)
|
||||
written = fwrite(buff, size, nmemb, data->output);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -43,8 +43,8 @@ int main(void)
|
||||
char ftpurl[] = "ftp://ftp.example.com/gnu/binutils/binutils-2.19.1.tar.bz2";
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
const time_t filetime;
|
||||
const double filesize;
|
||||
long filetime = -1;
|
||||
double filesize = 0.0;
|
||||
const char *filename = strrchr(ftpurl, '/') + 1;
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
@@ -67,10 +67,12 @@ int main(void)
|
||||
if(CURLE_OK == res) {
|
||||
/* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
|
||||
res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
|
||||
if((CURLE_OK == res) && filetime)
|
||||
printf("filetime %s: %s", filename, ctime(&filetime));
|
||||
if((CURLE_OK == res) && (filetime >= 0)) {
|
||||
time_t file_time = (time_t)filetime;
|
||||
printf("filetime %s: %s", filename, ctime(&file_time));
|
||||
}
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
|
||||
if((CURLE_OK == res) && (filesize>0))
|
||||
if((CURLE_OK == res) && (filesize>0.0))
|
||||
printf("filesize %s: %0.0f bytes\n", filename, filesize);
|
||||
} else {
|
||||
/* we failed */
|
||||
|
@@ -60,6 +60,10 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, respfile);
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
101
docs/examples/ftpsget.c
Normal file
101
docs/examples/ftpsget.c
Normal file
@@ -0,0 +1,101 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
/*
|
||||
* This is an example showing how to get a single file from an FTPS server.
|
||||
* It delays the actual destination file creation until the first write
|
||||
* callback so that it won't create an empty file in case the remote file
|
||||
* doesn't exist or something else fails.
|
||||
*/
|
||||
|
||||
struct FtpFile {
|
||||
const char *filename;
|
||||
FILE *stream;
|
||||
};
|
||||
|
||||
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
struct FtpFile *out=(struct FtpFile *)stream;
|
||||
if(out && !out->stream) {
|
||||
/* open file for writing */
|
||||
out->stream=fopen(out->filename, "wb");
|
||||
if(!out->stream)
|
||||
return -1; /* failure, can't open file to write */
|
||||
}
|
||||
return fwrite(buffer, size, nmemb, out->stream);
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
struct FtpFile ftpfile={
|
||||
"yourfile.bin", /* name to store the file as if succesful */
|
||||
NULL
|
||||
};
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/*
|
||||
* You better replace the URL with one that works! Note that we use an
|
||||
* FTP:// URL with standard explicit FTPS. You can also do FTPS:// URLs if
|
||||
* you want to do the rarer kind of transfers: implicit.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"ftp://user@server/home/user/file.txt");
|
||||
/* Define our callback to get called when there's data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
/* Set a pointer to our struct to pass to the callback */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
|
||||
|
||||
/* We activate SSL and we require it for both control and data */
|
||||
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
|
||||
|
||||
/* Switch on full protocol/debug output */
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
if(CURLE_OK != res) {
|
||||
/* we failed */
|
||||
fprintf(stderr, "curl told us %d\n", res);
|
||||
}
|
||||
}
|
||||
|
||||
if(ftpfile.stream)
|
||||
fclose(ftpfile.stream); /* close the local file */
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -32,7 +32,6 @@
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include "printf_macro.h"
|
||||
|
||||
/*
|
||||
* This example shows an FTP upload, with a rename of the file just after
|
||||
@@ -52,12 +51,16 @@
|
||||
variable's memory when passed in to it from an app like this. */
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
curl_off_t nread;
|
||||
/* in real-world cases, this would probably get this data differently
|
||||
as this fread() stuff is exactly what the library already would do
|
||||
by default internally */
|
||||
size_t retcode = fread(ptr, size, nmemb, stream);
|
||||
|
||||
fprintf(stderr, "*** We read %" _FMT_SIZE_T " bytes from file\n", retcode);
|
||||
nread = (curl_off_t)retcode;
|
||||
|
||||
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
|
||||
" bytes from file\n", nread);
|
||||
return retcode;
|
||||
}
|
||||
|
||||
@@ -119,6 +122,10 @@ int main(void)
|
||||
|
||||
/* Now run off and do what you've been told! */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* clean up the FTP commands list */
|
||||
curl_slist_free_all (headerlist);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -42,10 +42,10 @@ WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
||||
|
||||
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
|
||||
if (mem->memory == NULL) {
|
||||
if(mem->memory == NULL) {
|
||||
/* out of memory! */
|
||||
printf("not enough memory (realloc returned NULL)\n");
|
||||
exit(EXIT_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(&(mem->memory[mem->size]), contents, realsize);
|
||||
@@ -59,6 +59,7 @@ WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURLcode res;
|
||||
|
||||
struct MemoryStruct chunk;
|
||||
|
||||
@@ -84,24 +85,27 @@ int main(void)
|
||||
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
|
||||
|
||||
/* get it! */
|
||||
curl_easy_perform(curl_handle);
|
||||
res = curl_easy_perform(curl_handle);
|
||||
|
||||
/* check for errors */
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* Now, our chunk.memory points to a memory block that is chunk.size
|
||||
* bytes big and contains the remote file.
|
||||
*
|
||||
* Do something nice with it!
|
||||
*/
|
||||
|
||||
printf("%lu bytes retrieved\n", (long)chunk.size);
|
||||
}
|
||||
|
||||
/* cleanup curl stuff */
|
||||
curl_easy_cleanup(curl_handle);
|
||||
|
||||
/*
|
||||
* Now, our chunk.memory points to a memory block that is chunk.size
|
||||
* bytes big and contains the remote file.
|
||||
*
|
||||
* Do something nice with it!
|
||||
*
|
||||
* You should be aware of the fact that at this point we might have an
|
||||
* allocated data block, and nothing has yet deallocated that data. So when
|
||||
* you're done with it, you should free() it as a nice application.
|
||||
*/
|
||||
|
||||
printf("%lu bytes retrieved\n", (long)chunk.size);
|
||||
|
||||
if(chunk.memory)
|
||||
free(chunk.memory);
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
Written by Jeff Pohlmeyer
|
||||
|
||||
Requires libevent and a (POSIX?) system that has mkfifo().
|
||||
Requires libevent version 2 and a (POSIX?) system that has mkfifo().
|
||||
|
||||
This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
|
||||
sample programs.
|
||||
@@ -61,7 +61,7 @@ callback.
|
||||
#include <unistd.h>
|
||||
#include <sys/poll.h>
|
||||
#include <curl/curl.h>
|
||||
#include <event.h>
|
||||
#include <event2/event.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
@@ -71,9 +71,11 @@ callback.
|
||||
|
||||
|
||||
/* Global information, common to all connections */
|
||||
typedef struct _GlobalInfo {
|
||||
struct event fifo_event;
|
||||
struct event timer_event;
|
||||
typedef struct _GlobalInfo
|
||||
{
|
||||
struct event_base *evbase;
|
||||
struct event *fifo_event;
|
||||
struct event *timer_event;
|
||||
CURLM *multi;
|
||||
int still_running;
|
||||
FILE* input;
|
||||
@@ -81,7 +83,8 @@ typedef struct _GlobalInfo {
|
||||
|
||||
|
||||
/* Information associated with a specific easy handle */
|
||||
typedef struct _ConnInfo {
|
||||
typedef struct _ConnInfo
|
||||
{
|
||||
CURL *easy;
|
||||
char *url;
|
||||
GlobalInfo *global;
|
||||
@@ -90,12 +93,13 @@ typedef struct _ConnInfo {
|
||||
|
||||
|
||||
/* Information associated with a specific socket */
|
||||
typedef struct _SockInfo {
|
||||
typedef struct _SockInfo
|
||||
{
|
||||
curl_socket_t sockfd;
|
||||
CURL *easy;
|
||||
int action;
|
||||
long timeout;
|
||||
struct event ev;
|
||||
struct event *ev;
|
||||
int evset;
|
||||
GlobalInfo *global;
|
||||
} SockInfo;
|
||||
@@ -111,7 +115,7 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
|
||||
timeout.tv_sec = timeout_ms/1000;
|
||||
timeout.tv_usec = (timeout_ms%1000)*1000;
|
||||
fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
|
||||
evtimer_add(&g->timer_event, &timeout);
|
||||
evtimer_add(g->timer_event, &timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -186,8 +190,8 @@ static void event_cb(int fd, short kind, void *userp)
|
||||
check_multi_info(g);
|
||||
if ( g->still_running <= 0 ) {
|
||||
fprintf(MSG_OUT, "last transfer done, kill timeout\n");
|
||||
if (evtimer_pending(&g->timer_event, NULL)) {
|
||||
evtimer_del(&g->timer_event);
|
||||
if (evtimer_pending(g->timer_event, NULL)) {
|
||||
evtimer_del(g->timer_event);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -215,7 +219,7 @@ static void remsock(SockInfo *f)
|
||||
{
|
||||
if (f) {
|
||||
if (f->evset)
|
||||
event_del(&f->ev);
|
||||
event_free(f->ev);
|
||||
free(f);
|
||||
}
|
||||
}
|
||||
@@ -232,16 +236,17 @@ static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
|
||||
f->action = act;
|
||||
f->easy = e;
|
||||
if (f->evset)
|
||||
event_del(&f->ev);
|
||||
event_set(&f->ev, f->sockfd, kind, event_cb, g);
|
||||
f->evset=1;
|
||||
event_add(&f->ev, NULL);
|
||||
event_free(f->ev);
|
||||
f->ev = event_new(g->evbase, f->sockfd, kind, event_cb, g);
|
||||
f->evset = 1;
|
||||
event_add(f->ev, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Initialize a new SockInfo structure */
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g) {
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
|
||||
{
|
||||
SockInfo *fdp = calloc(sizeof(SockInfo), 1);
|
||||
|
||||
fdp->global = g;
|
||||
@@ -359,10 +364,10 @@ static void fifo_cb(int fd, short event, void *arg)
|
||||
}
|
||||
|
||||
/* Create a named pipe and tell libevent to monitor it */
|
||||
static const char *fifo = "hiper.fifo";
|
||||
static int init_fifo (GlobalInfo *g)
|
||||
{
|
||||
struct stat st;
|
||||
static const char *fifo = "hiper.fifo";
|
||||
curl_socket_t sockfd;
|
||||
|
||||
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
|
||||
@@ -386,11 +391,18 @@ static int init_fifo (GlobalInfo *g)
|
||||
g->input = fdopen(sockfd, "r");
|
||||
|
||||
fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo);
|
||||
event_set(&g->fifo_event, sockfd, EV_READ | EV_PERSIST, fifo_cb, g);
|
||||
event_add(&g->fifo_event, NULL);
|
||||
g->fifo_event = event_new(g->evbase, sockfd, EV_READ|EV_PERSIST, fifo_cb, g);
|
||||
event_add(g->fifo_event, NULL);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void clean_fifo(GlobalInfo *g)
|
||||
{
|
||||
event_free(g->fifo_event);
|
||||
fclose(g->input);
|
||||
unlink(fifo);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GlobalInfo g;
|
||||
@@ -398,10 +410,10 @@ int main(int argc, char **argv)
|
||||
(void)argv;
|
||||
|
||||
memset(&g, 0, sizeof(GlobalInfo));
|
||||
event_init();
|
||||
g.evbase = event_base_new();
|
||||
init_fifo(&g);
|
||||
g.multi = curl_multi_init();
|
||||
evtimer_set(&g.timer_event, timer_cb, &g);
|
||||
g.timer_event = evtimer_new(g.evbase, timer_cb, &g);
|
||||
|
||||
/* setup the generic multi interface options we want */
|
||||
curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
|
||||
@@ -412,7 +424,13 @@ int main(int argc, char **argv)
|
||||
/* we don't call any curl_multi_socket*() function yet as we have no handles
|
||||
added! */
|
||||
|
||||
event_dispatch();
|
||||
event_base_dispatch(g.evbase);
|
||||
|
||||
/* this, of course, won't get called since only way to stop this program is
|
||||
via ctrl-C, but it is here to show how cleanup /would/ be done. */
|
||||
clean_fifo(&g);
|
||||
event_free(g.timer_event);
|
||||
event_base_free(g.evbase);
|
||||
curl_multi_cleanup(g.multi);
|
||||
return 0;
|
||||
}
|
||||
|
86
docs/examples/href_extractor.c
Normal file
86
docs/examples/href_extractor.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* This example uses the "Streaming HTML parser" to extract the href pieces in
|
||||
* a streaming manner from a downloaded HTML. Kindly donated by Michał
|
||||
* Kowalczyk.
|
||||
*
|
||||
* The parser is found at
|
||||
* http://code.google.com/p/htmlstreamparser/
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
#include <htmlstreamparser.h>
|
||||
|
||||
|
||||
static size_t write_callback(void *buffer, size_t size, size_t nmemb,
|
||||
void *hsp)
|
||||
{
|
||||
size_t realsize = size * nmemb, p;
|
||||
for (p = 0; p < realsize; p++) {
|
||||
html_parser_char_parse(hsp, ((char *)buffer)[p]);
|
||||
if (html_parser_cmp_tag(hsp, "a", 1))
|
||||
if (html_parser_cmp_attr(hsp, "href", 4))
|
||||
if (html_parser_is_in(hsp, HTML_VALUE_ENDED)) {
|
||||
html_parser_val(hsp)[html_parser_val_length(hsp)] = '\0';
|
||||
printf("%s\n", html_parser_val(hsp));
|
||||
}
|
||||
}
|
||||
return realsize;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char tag[1], attr[4], val[128];
|
||||
CURL *curl;
|
||||
HTMLSTREAMPARSER *hsp;
|
||||
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s URL\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
curl = curl_easy_init();
|
||||
|
||||
hsp = html_parser_init();
|
||||
|
||||
html_parser_set_tag_to_lower(hsp, 1);
|
||||
html_parser_set_attr_to_lower(hsp, 1);
|
||||
html_parser_set_tag_buffer(hsp, tag, sizeof(tag));
|
||||
html_parser_set_attr_buffer(hsp, attr, sizeof(attr));
|
||||
html_parser_set_val_buffer(hsp, val, sizeof(val)-1);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, hsp);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
|
||||
curl_easy_perform(curl);
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
html_parser_cleanup(hsp);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@@ -25,7 +25,7 @@
|
||||
//
|
||||
// GNU C++ compile command line suggestion (edit paths accordingly):
|
||||
//
|
||||
// g++ -Wall -I/opt/curl/include -I/opt/libxml/include/libxml2 htmltitle.cc \
|
||||
// g++ -Wall -I/opt/curl/include -I/opt/libxml/include/libxml2 htmltitle.cpp \
|
||||
// -o htmltitle -L/opt/curl/lib -L/opt/libxml/lib -lcurl -lxml2
|
||||
|
||||
#include <stdio.h>
|
@@ -27,6 +27,10 @@ int main(void)
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
/* In windows, this will init the winsock stuff */
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
|
||||
/* get a curl handle */
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* First set the URL that is about to receive our POST. This URL can
|
||||
@@ -38,9 +42,14 @@ int main(void)
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -38,13 +38,24 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "localhost");
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* redo request with our own custom Accept: */
|
||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
/* free the custom headers */
|
||||
curl_slist_free_all(chunk);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -25,7 +25,6 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include "printf_macro.h"
|
||||
|
||||
/*
|
||||
* This example shows a HTTP PUT operation. PUTs a file given as a command
|
||||
@@ -40,13 +39,17 @@
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t retcode;
|
||||
curl_off_t nread;
|
||||
|
||||
/* in real-world cases, this would probably get this data differently
|
||||
as this fread() stuff is exactly what the library already would do
|
||||
by default internally */
|
||||
retcode = fread(ptr, size, nmemb, stream);
|
||||
|
||||
fprintf(stderr, "*** We read %" _FMT_SIZE_T " bytes from file\n", retcode);
|
||||
nread = (curl_off_t)retcode;
|
||||
|
||||
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
|
||||
" bytes from file\n", nread);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
@@ -107,6 +110,10 @@ int main(int argc, char **argv)
|
||||
|
||||
/* Now run off and do what you've been told! */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -27,6 +27,8 @@ int main(void)
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
|
||||
@@ -45,7 +47,7 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
#endif
|
||||
|
||||
#ifdef SKIP_HOSTNAME_VERFICATION
|
||||
#ifdef SKIP_HOSTNAME_VERIFICATION
|
||||
/*
|
||||
* If the site you're connecting to uses a different host name that what
|
||||
* they have mentioned in their server certificate's commonName (or
|
||||
@@ -55,10 +57,18 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
#endif
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -25,7 +25,7 @@
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
CURLcode res = CURLE_OK;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
@@ -70,7 +70,7 @@ int main(void)
|
||||
/* we start some action by calling perform right away */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
do {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
|
||||
@@ -118,7 +118,7 @@ int main(void)
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(still_running);
|
||||
|
||||
/* See how the transfers went */
|
||||
while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
|
||||
|
@@ -144,7 +144,7 @@ int main(void)
|
||||
/* we start some action by calling perform right away */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
do {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
|
||||
@@ -195,7 +195,7 @@ int main(void)
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
|
||||
|
@@ -59,7 +59,7 @@ int main(void)
|
||||
/* we start some action by calling perform right away */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
do {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
|
||||
@@ -108,7 +108,7 @@ int main(void)
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
|
||||
|
@@ -80,7 +80,7 @@ int main(void)
|
||||
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
do {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
|
||||
@@ -131,7 +131,7 @@ int main(void)
|
||||
printf("running: %d!\n", still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
|
||||
|
@@ -41,6 +41,8 @@ int main(void)
|
||||
|
||||
int still_running; /* keep number of running handles */
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
http_handle = curl_easy_init();
|
||||
|
||||
/* set the options (I left out a few, you'll get the point anyway) */
|
||||
@@ -55,7 +57,7 @@ int main(void)
|
||||
/* we start some action by calling perform right away */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
do {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
|
||||
@@ -106,11 +108,15 @@ int main(void)
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_remove_handle(multi_handle, http_handle);
|
||||
|
||||
curl_easy_cleanup(http_handle);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
212
docs/examples/multi-uv.c
Normal file
212
docs/examples/multi-uv.c
Normal file
@@ -0,0 +1,212 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/* Example application code using the multi socket interface to download
|
||||
multiple files at once, but instead of using curl_multi_perform and
|
||||
curl_multi_wait, which uses select(), we use libuv.
|
||||
It supports epoll, kqueue, etc. on unixes and fast IO completion ports on
|
||||
Windows, which means, it should be very fast on all platforms..
|
||||
|
||||
Written by Clemens Gruber, based on an outdated example from uvbook and
|
||||
some tests from libuv.
|
||||
|
||||
Requires libuv and (of course) libcurl.
|
||||
|
||||
See http://nikhilm.github.com/uvbook/ for more information on libuv.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <uv.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
uv_loop_t *loop;
|
||||
CURLM *curl_handle;
|
||||
uv_timer_t timeout;
|
||||
|
||||
typedef struct curl_context_s {
|
||||
uv_poll_t poll_handle;
|
||||
curl_socket_t sockfd;
|
||||
} curl_context_t;
|
||||
|
||||
curl_context_t* create_curl_context(curl_socket_t sockfd)
|
||||
{
|
||||
curl_context_t *context;
|
||||
|
||||
context = (curl_context_t *) malloc(sizeof *context);
|
||||
|
||||
context->sockfd = sockfd;
|
||||
|
||||
uv_poll_init_socket(loop, &context->poll_handle, sockfd);
|
||||
context->poll_handle.data = context;
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
void curl_close_cb(uv_handle_t *handle)
|
||||
{
|
||||
curl_context_t* context = (curl_context_t*) handle->data;
|
||||
free(context);
|
||||
}
|
||||
|
||||
void destroy_curl_context(curl_context_t *context)
|
||||
{
|
||||
uv_close((uv_handle_t*) &context->poll_handle, curl_close_cb);
|
||||
}
|
||||
|
||||
|
||||
void add_download(const char *url, int num)
|
||||
{
|
||||
char filename[50];
|
||||
FILE *file;
|
||||
CURL *handle;
|
||||
|
||||
sprintf(filename, "%d.download", num);
|
||||
|
||||
file = fopen(filename, "w");
|
||||
if (file == NULL) {
|
||||
fprintf(stderr, "Error opening %s\n", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
handle = curl_easy_init();
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||
curl_multi_add_handle(curl_handle, handle);
|
||||
fprintf(stderr, "Added download %s -> %s\n", url, filename);
|
||||
}
|
||||
|
||||
void curl_perform(uv_poll_t *req, int status, int events)
|
||||
{
|
||||
int running_handles;
|
||||
int flags = 0;
|
||||
curl_context_t *context;
|
||||
char *done_url;
|
||||
CURLMsg *message;
|
||||
int pending;
|
||||
|
||||
uv_timer_stop(&timeout);
|
||||
|
||||
if (events & UV_READABLE)
|
||||
flags |= CURL_CSELECT_IN;
|
||||
if (events & UV_WRITABLE)
|
||||
flags |= CURL_CSELECT_OUT;
|
||||
|
||||
context = (curl_context_t*)req;
|
||||
|
||||
curl_multi_socket_action(curl_handle, context->sockfd, flags,
|
||||
&running_handles);
|
||||
|
||||
while ((message = curl_multi_info_read(curl_handle, &pending))) {
|
||||
switch (message->msg) {
|
||||
case CURLMSG_DONE:
|
||||
curl_easy_getinfo(message->easy_handle, CURLINFO_EFFECTIVE_URL,
|
||||
&done_url);
|
||||
printf("%s DONE\n", done_url);
|
||||
|
||||
curl_multi_remove_handle(curl_handle, message->easy_handle);
|
||||
curl_easy_cleanup(message->easy_handle);
|
||||
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "CURLMSG default\n");
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void on_timeout(uv_timer_t *req, int status)
|
||||
{
|
||||
int running_handles;
|
||||
curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
|
||||
&running_handles);
|
||||
}
|
||||
|
||||
void start_timeout(CURLM *multi, long timeout_ms, void *userp)
|
||||
{
|
||||
if (timeout_ms <= 0)
|
||||
timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it in
|
||||
a bit */
|
||||
uv_timer_start(&timeout, on_timeout, timeout_ms, 0);
|
||||
}
|
||||
|
||||
int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
|
||||
void *socketp)
|
||||
{
|
||||
curl_context_t *curl_context;
|
||||
if (action == CURL_POLL_IN || action == CURL_POLL_OUT) {
|
||||
if (socketp) {
|
||||
curl_context = (curl_context_t*) socketp;
|
||||
}
|
||||
else {
|
||||
curl_context = create_curl_context(s);
|
||||
}
|
||||
curl_multi_assign(curl_handle, s, (void *) curl_context);
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
case CURL_POLL_IN:
|
||||
uv_poll_start(&curl_context->poll_handle, UV_READABLE, curl_perform);
|
||||
break;
|
||||
case CURL_POLL_OUT:
|
||||
uv_poll_start(&curl_context->poll_handle, UV_WRITABLE, curl_perform);
|
||||
break;
|
||||
case CURL_POLL_REMOVE:
|
||||
if (socketp) {
|
||||
uv_poll_stop(&((curl_context_t*)socketp)->poll_handle);
|
||||
destroy_curl_context((curl_context_t*) socketp);
|
||||
curl_multi_assign(curl_handle, s, NULL);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
loop = uv_default_loop();
|
||||
|
||||
if (argc <= 1)
|
||||
return 0;
|
||||
|
||||
if (curl_global_init(CURL_GLOBAL_ALL)) {
|
||||
fprintf(stderr, "Could not init cURL\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
uv_timer_init(loop, &timeout);
|
||||
|
||||
curl_handle = curl_multi_init();
|
||||
curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
|
||||
curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
|
||||
|
||||
while (argc-- > 1) {
|
||||
add_download(argv[argc], argc);
|
||||
}
|
||||
|
||||
uv_run(loop, UV_RUN_DEFAULT);
|
||||
curl_multi_cleanup(curl_handle);
|
||||
return 0;
|
||||
}
|
@@ -37,12 +37,24 @@ int main(void)
|
||||
|
||||
/* get the first document */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* get another document from the same server using the same
|
||||
connection */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/docs/");
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -59,7 +59,12 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
#endif
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -59,7 +59,12 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
#endif
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -30,7 +30,7 @@ const char data[]="this is what we post to the silly web server";
|
||||
|
||||
struct WriteThis {
|
||||
const char *readptr;
|
||||
int sizeleft;
|
||||
long sizeleft;
|
||||
};
|
||||
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
|
||||
@@ -58,8 +58,18 @@ int main(void)
|
||||
struct WriteThis pooh;
|
||||
|
||||
pooh.readptr = data;
|
||||
pooh.sizeleft = strlen(data);
|
||||
pooh.sizeleft = (long)strlen(data);
|
||||
|
||||
/* In windows, this will init the winsock stuff */
|
||||
res = curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "curl_global_init() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* get a curl handle */
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* First set the URL that is about to receive our POST. */
|
||||
@@ -96,7 +106,7 @@ int main(void)
|
||||
#else
|
||||
/* Set the expected POST size. If you want to POST large amounts of data,
|
||||
consider CURLOPT_POSTFIELDSIZE_LARGE */
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (curl_off_t)pooh.sizeleft);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft);
|
||||
#endif
|
||||
|
||||
#ifdef DISABLE_EXPECT
|
||||
@@ -120,9 +130,14 @@ int main(void)
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
111
docs/examples/postinmemory.c
Normal file
111
docs/examples/postinmemory.c
Normal file
@@ -0,0 +1,111 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
struct MemoryStruct {
|
||||
char *memory;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
static size_t
|
||||
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
size_t realsize = size * nmemb;
|
||||
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
||||
|
||||
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
|
||||
if(mem->memory == NULL) {
|
||||
/* out of memory! */
|
||||
printf("not enough memory (realloc returned NULL)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(&(mem->memory[mem->size]), contents, realsize);
|
||||
mem->size += realsize;
|
||||
mem->memory[mem->size] = 0;
|
||||
|
||||
return realsize;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
struct MemoryStruct chunk;
|
||||
static const char *postthis="Field=1&Field=2&Field=3";
|
||||
|
||||
chunk.memory = malloc(1); /* will be grown as needed by realloc above */
|
||||
chunk.size = 0; /* no data at this point */
|
||||
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.org/");
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||
|
||||
/* we pass our 'chunk' struct to the callback function */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||
|
||||
/* some servers don't like requests that are made without a user-agent
|
||||
field, so we provide one */
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
|
||||
|
||||
/* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
|
||||
itself */
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* Now, our chunk.memory points to a memory block that is chunk.size
|
||||
* bytes big and contains the remote file.
|
||||
*
|
||||
* Do something nice with it!
|
||||
*/
|
||||
printf("%s\n",chunk.memory);
|
||||
}
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
if(chunk.memory)
|
||||
free(chunk.memory);
|
||||
|
||||
/* we're done with libcurl, so clean it up */
|
||||
curl_global_cleanup();
|
||||
}
|
||||
return 0;
|
||||
}
|
@@ -83,7 +83,13 @@ int main(int argc, char *argv[])
|
||||
/* only disable 100-continue header if explicitly requested */
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -30,9 +30,10 @@ struct myprogress {
|
||||
CURL *curl;
|
||||
};
|
||||
|
||||
static int progress(void *p,
|
||||
double dltotal, double dlnow,
|
||||
double ultotal, double ulnow)
|
||||
/* this is how the CURLOPT_XFERINFOFUNCTION callback works */
|
||||
static int xferinfo(void *p,
|
||||
curl_off_t dltotal, curl_off_t dlnow,
|
||||
curl_off_t ultotal, curl_off_t ulnow)
|
||||
{
|
||||
struct myprogress *myp = (struct myprogress *)p;
|
||||
CURL *curl = myp->curl;
|
||||
@@ -48,7 +49,9 @@ static int progress(void *p,
|
||||
fprintf(stderr, "TOTAL TIME: %f \r\n", curtime);
|
||||
}
|
||||
|
||||
fprintf(stderr, "UP: %g of %g DOWN: %g of %g\r\n",
|
||||
fprintf(stderr, "UP: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
|
||||
" DOWN: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
|
||||
"\r\n",
|
||||
ulnow, ultotal, dlnow, dltotal);
|
||||
|
||||
if(dlnow > STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES)
|
||||
@@ -56,10 +59,23 @@ static int progress(void *p,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* for libcurl older than 7.32.0 (CURLOPT_PROGRESSFUNCTION) */
|
||||
static int older_progress(void *p,
|
||||
double dltotal, double dlnow,
|
||||
double ultotal, double ulnow)
|
||||
{
|
||||
return xferinfo(p,
|
||||
(curl_off_t)dltotal,
|
||||
(curl_off_t)dlnow,
|
||||
(curl_off_t)ultotal,
|
||||
(curl_off_t)ulnow);
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res=0;
|
||||
CURLcode res = CURLE_OK;
|
||||
struct myprogress prog;
|
||||
|
||||
curl = curl_easy_init();
|
||||
@@ -68,13 +84,32 @@ int main(void)
|
||||
prog.curl = curl;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, older_progress);
|
||||
/* pass the struct pointer into the progress function */
|
||||
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &prog);
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x072000
|
||||
/* xferinfo was introduced in 7.32.0, no earlier libcurl versions will
|
||||
compile as they won't have the symbols around.
|
||||
|
||||
If built with a newer libcurl, but running with an older libcurl:
|
||||
curl_easy_setopt() will fail in run-time trying to set the new
|
||||
callback, making the older callback get used.
|
||||
|
||||
New libcurls will prefer the new callback and instead use that one even
|
||||
if both callbacks are set. */
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo);
|
||||
/* pass the struct pointer into the xferinfo function, note that this is
|
||||
an alias to CURLOPT_PROGRESSDATA */
|
||||
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &prog);
|
||||
#endif
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(res)
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "%s\n", curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
|
@@ -178,7 +178,7 @@ int main(int argc, char * const argv[])
|
||||
#endif
|
||||
const char *range = "0.000-";
|
||||
int rc = EXIT_SUCCESS;
|
||||
char *basename = NULL;
|
||||
char *base_name = NULL;
|
||||
|
||||
printf("\nRTSP request %s\n", VERSION_STR);
|
||||
printf(" Project web site: http://code.google.com/p/rtsprequest/\n");
|
||||
@@ -186,20 +186,20 @@ int main(int argc, char * const argv[])
|
||||
|
||||
/* check command line */
|
||||
if ((argc != 2) && (argc != 3)) {
|
||||
basename = strrchr(argv[0], '/');
|
||||
if (basename == NULL) {
|
||||
basename = strrchr(argv[0], '\\');
|
||||
base_name = strrchr(argv[0], '/');
|
||||
if (base_name == NULL) {
|
||||
base_name = strrchr(argv[0], '\\');
|
||||
}
|
||||
if (basename == NULL) {
|
||||
basename = argv[0];
|
||||
if (base_name == NULL) {
|
||||
base_name = argv[0];
|
||||
} else {
|
||||
basename++;
|
||||
base_name++;
|
||||
}
|
||||
printf("Usage: %s url [transport]\n", basename);
|
||||
printf("Usage: %s url [transport]\n", base_name);
|
||||
printf(" url of video server\n");
|
||||
printf(" transport (optional) specifier for media stream protocol\n");
|
||||
printf(" default transport: %s\n", transport);
|
||||
printf("Example: %s rtsp://192.168.0.2/media/video1\n\n", basename);
|
||||
printf("Example: %s rtsp://192.168.0.2/media/video1\n\n", base_name);
|
||||
rc = EXIT_FAILURE;
|
||||
} else {
|
||||
const char *url = argv[1];
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
#include "printf_macro.h"
|
||||
|
||||
/* Auxiliary function that waits on the socket. */
|
||||
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
|
||||
@@ -65,6 +64,7 @@ int main(void)
|
||||
curl_socket_t sockfd; /* socket */
|
||||
long sockextr;
|
||||
size_t iolen;
|
||||
curl_off_t nread;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
@@ -123,7 +123,9 @@ int main(void)
|
||||
if(CURLE_OK != res)
|
||||
break;
|
||||
|
||||
printf("Received %" _FMT_SIZE_T " bytes.\n", iolen);
|
||||
nread = (curl_off_t)iolen;
|
||||
|
||||
printf("Received %" CURL_FORMAT_CURL_OFF_T " bytes.\n", nread);
|
||||
}
|
||||
|
||||
/* always cleanup */
|
||||
|
@@ -54,23 +54,22 @@ int main(void)
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
|
||||
|
||||
/* open the files */
|
||||
headerfile = fopen(headerfilename,"w");
|
||||
headerfile = fopen(headerfilename,"wb");
|
||||
if (headerfile == NULL) {
|
||||
curl_easy_cleanup(curl_handle);
|
||||
return -1;
|
||||
}
|
||||
bodyfile = fopen(bodyfilename,"w");
|
||||
bodyfile = fopen(bodyfilename,"wb");
|
||||
if (bodyfile == NULL) {
|
||||
curl_easy_cleanup(curl_handle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* we want the headers to this file handle */
|
||||
/* we want the headers be written to this file handle */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, headerfile);
|
||||
|
||||
/*
|
||||
* Notice here that if you want the actual data sent anywhere else but
|
||||
* stdout, you should consider using the CURLOPT_WRITEDATA option. */
|
||||
/* we want the body be written to this file handle instead of stdout */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile);
|
||||
|
||||
/* get it! */
|
||||
curl_easy_perform(curl_handle);
|
||||
@@ -78,6 +77,9 @@ int main(void)
|
||||
/* close the header file */
|
||||
fclose(headerfile);
|
||||
|
||||
/* close the body file */
|
||||
fclose(bodyfile);
|
||||
|
||||
/* cleanup curl stuff */
|
||||
curl_easy_cleanup(curl_handle);
|
||||
|
||||
|
106
docs/examples/sftpget.c
Normal file
106
docs/examples/sftpget.c
Normal file
@@ -0,0 +1,106 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
/* define this to switch off the use of ssh-agent in this program */
|
||||
#undef DISABLE_SSH_AGENT
|
||||
|
||||
/*
|
||||
* This is an example showing how to get a single file from an SFTP server.
|
||||
* It delays the actual destination file creation until the first write
|
||||
* callback so that it won't create an empty file in case the remote file
|
||||
* doesn't exist or something else fails.
|
||||
*/
|
||||
|
||||
struct FtpFile {
|
||||
const char *filename;
|
||||
FILE *stream;
|
||||
};
|
||||
|
||||
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
struct FtpFile *out=(struct FtpFile *)stream;
|
||||
if(out && !out->stream) {
|
||||
/* open file for writing */
|
||||
out->stream=fopen(out->filename, "wb");
|
||||
if(!out->stream)
|
||||
return -1; /* failure, can't open file to write */
|
||||
}
|
||||
return fwrite(buffer, size, nmemb, out->stream);
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
struct FtpFile ftpfile={
|
||||
"yourfile.bin", /* name to store the file as if succesful */
|
||||
NULL
|
||||
};
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/*
|
||||
* You better replace the URL with one that works!
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"sftp://user@server/home/user/file.txt");
|
||||
/* Define our callback to get called when there's data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
/* Set a pointer to our struct to pass to the callback */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
|
||||
|
||||
#ifndef DISABLE_SSH_AGENT
|
||||
/* We activate ssh agent. For this to work you need
|
||||
to have ssh-agent running (type set | grep SSH_AGENT to check) or
|
||||
pageant on Windows (there is an icon in systray if so) */
|
||||
curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_AGENT);
|
||||
#endif
|
||||
|
||||
/* Switch on full protocol/debug output */
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
if(CURLE_OK != res) {
|
||||
/* we failed */
|
||||
fprintf(stderr, "curl told us %d\n", res);
|
||||
}
|
||||
}
|
||||
|
||||
if(ftpfile.stream)
|
||||
fclose(ftpfile.stream); /* close the local file */
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -30,7 +30,15 @@ int main(void)
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||
/* example.com is redirected, so we tell libcurl to follow redirection */
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -39,7 +39,12 @@ int main(void)
|
||||
itself */
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -65,6 +65,10 @@ int main(void)
|
||||
|
||||
/* send the message (including headers) */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* free the list of recipients */
|
||||
curl_slist_free_all(recipients);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
FILE *headerfile;
|
||||
@@ -76,7 +77,7 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site");
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
|
||||
|
||||
while(1) /* do some ugly short cut... */
|
||||
for(i = 0; i < 1; i++) /* single-iteration loop, just to break out from */
|
||||
{
|
||||
if (pEngine) /* use crypto engine */
|
||||
{
|
||||
@@ -118,8 +119,14 @@ int main(void)
|
||||
/* disconnect if we can't validate server's cert */
|
||||
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,1L);
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
break; /* we are done... */
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* we are done... */
|
||||
}
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
@@ -96,7 +96,6 @@ int main(void)
|
||||
CURLM *mcurl;
|
||||
int still_running = 1;
|
||||
struct timeval mp_start;
|
||||
char mp_timedout = 0;
|
||||
struct WriteThis pooh;
|
||||
struct curl_slist* rcpt_list = NULL;
|
||||
|
||||
@@ -132,7 +131,6 @@ int main(void)
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L);
|
||||
curl_multi_add_handle(mcurl, curl);
|
||||
|
||||
mp_timedout = 0;
|
||||
mp_start = tvnow();
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
|
@@ -139,6 +139,10 @@ int main(void)
|
||||
|
||||
/* send the message (including headers) */
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* free the list of recipients and clean up */
|
||||
curl_slist_free_all(recipients);
|
||||
|
211
docs/examples/usercertinmem.c
Normal file
211
docs/examples/usercertinmem.c
Normal file
@@ -0,0 +1,211 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example using an in memory PEM user certificate and RSA key to retrieve an
|
||||
* https page.
|
||||
* Written by Ishan SinghLevett, based on Theo Borm's cacertinmem.c.
|
||||
* Note this example does not use a CA certificate, however one should be used
|
||||
* if you want a properly secure connection
|
||||
*/
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <curl/curl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
fwrite(ptr,size,nmemb,stream);
|
||||
return(nmemb*size);
|
||||
}
|
||||
|
||||
static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
|
||||
{
|
||||
X509 *cert = NULL;
|
||||
BIO *bio = NULL;
|
||||
BIO *kbio = NULL;
|
||||
RSA *rsa = NULL;
|
||||
int ret;
|
||||
|
||||
const char *mypem = /* www.cacert.org */
|
||||
"-----BEGIN CERTIFICATE-----\n"\
|
||||
"MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\
|
||||
"IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"\
|
||||
"IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"\
|
||||
"Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"\
|
||||
"BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\n"\
|
||||
"MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\n"\
|
||||
"ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n"\
|
||||
"CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\n"\
|
||||
"8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\n"\
|
||||
"zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\n"\
|
||||
"fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\n"\
|
||||
"w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\n"\
|
||||
"G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\n"\
|
||||
"epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\n"\
|
||||
"laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\n"\
|
||||
"QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\n"\
|
||||
"fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\n"\
|
||||
"YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\n"\
|
||||
"ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\n"\
|
||||
"gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\n"\
|
||||
"MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\n"\
|
||||
"IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\n"\
|
||||
"dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\n"\
|
||||
"czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\n"\
|
||||
"dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\n"\
|
||||
"aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\n"\
|
||||
"AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\n"\
|
||||
"b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\n"\
|
||||
"ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\n"\
|
||||
"nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\n"\
|
||||
"18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\n"\
|
||||
"gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\n"\
|
||||
"Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\n"\
|
||||
"sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\n"\
|
||||
"SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\n"\
|
||||
"CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\n"\
|
||||
"GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"\
|
||||
"zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"\
|
||||
"omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
/*replace the XXX with the actual RSA key*/
|
||||
const char *mykey =
|
||||
"-----BEGIN RSA PRIVATE KEY-----\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
|
||||
"-----END RSA PRIVATE KEY-----\n";
|
||||
|
||||
(void)curl; /* avoid warnings */
|
||||
(void)parm; /* avoid warnings */
|
||||
|
||||
/* get a BIO */
|
||||
bio = BIO_new_mem_buf((char *)mypem, -1);
|
||||
|
||||
if (bio == NULL) {
|
||||
printf("BIO_new_mem_buf failed\n");
|
||||
}
|
||||
|
||||
/* use it to read the PEM formatted certificate from memory into an X509
|
||||
* structure that SSL can use
|
||||
*/
|
||||
cert = PEM_read_bio_X509(bio, NULL, 0, NULL);
|
||||
if (cert == NULL) {
|
||||
printf("PEM_read_bio_X509 failed...\n");
|
||||
}
|
||||
|
||||
/*tell SSL to use the X509 certificate*/
|
||||
ret = SSL_CTX_use_certificate((SSL_CTX*)sslctx, cert);
|
||||
if (ret != 1) {
|
||||
printf("Use certificate failed\n");
|
||||
}
|
||||
|
||||
/*create a bio for the RSA key*/
|
||||
kbio = BIO_new_mem_buf((char *)mykey, -1);
|
||||
if (kbio == NULL) {
|
||||
printf("BIO_new_mem_buf failed\n");
|
||||
}
|
||||
|
||||
/*read the key bio into an RSA object*/
|
||||
rsa = PEM_read_bio_RSAPrivateKey(kbio, NULL, 0, NULL);
|
||||
if (rsa == NULL) {
|
||||
printf("Failed to create key bio\n");
|
||||
}
|
||||
|
||||
/*tell SSL to use the RSA key from memory*/
|
||||
ret = SSL_CTX_use_RSAPrivateKey((SSL_CTX*)sslctx, rsa);
|
||||
if (ret != 1) {
|
||||
printf("Use Key failed\n");
|
||||
}
|
||||
|
||||
|
||||
/* all set to go */
|
||||
return CURLE_OK ;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *ch;
|
||||
CURLcode rv;
|
||||
|
||||
rv = curl_global_init(CURL_GLOBAL_ALL);
|
||||
ch = curl_easy_init();
|
||||
rv = curl_easy_setopt(ch,CURLOPT_VERBOSE, 0L);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_HEADER, 0L);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1L);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1L);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
|
||||
|
||||
/* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there is
|
||||
no CA certificate*/
|
||||
|
||||
rv = curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
rv = curl_easy_setopt(ch,CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
rv = curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
|
||||
rv = curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
|
||||
|
||||
/* first try: retrieve page without user certificate and key -> will fail
|
||||
*/
|
||||
rv = curl_easy_perform(ch);
|
||||
if (rv==CURLE_OK) {
|
||||
printf("*** transfer succeeded ***\n");
|
||||
}
|
||||
else {
|
||||
printf("*** transfer failed ***\n");
|
||||
}
|
||||
|
||||
/* second try: retrieve page using user certificate and key -> will succeed
|
||||
* load the certificate and key by installing a function doing the necessary
|
||||
* "modifications" to the SSL CONTEXT just before link init
|
||||
*/
|
||||
rv = curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
|
||||
rv = curl_easy_perform(ch);
|
||||
if (rv==CURLE_OK) {
|
||||
printf("*** transfer succeeded ***\n");
|
||||
}
|
||||
else {
|
||||
printf("*** transfer failed ***\n");
|
||||
}
|
||||
|
||||
curl_easy_cleanup(ch);
|
||||
curl_global_cleanup();
|
||||
return rv;
|
||||
}
|
158
docs/examples/xmlstream.c
Normal file
158
docs/examples/xmlstream.c
Normal file
@@ -0,0 +1,158 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Stream-parse a document using the streaming Expat parser.
|
||||
* Written by David Strauss
|
||||
*
|
||||
* Expat => http://www.libexpat.org/
|
||||
*
|
||||
* gcc -Wall -I/usr/local/include xmlstream.c -lcurl -lexpat -o xmlstream
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <expat.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
struct MemoryStruct {
|
||||
char *memory;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
struct ParserStruct {
|
||||
int ok;
|
||||
size_t tags;
|
||||
size_t depth;
|
||||
struct MemoryStruct characters;
|
||||
};
|
||||
|
||||
static void startElement(void *userData, const XML_Char *name, const XML_Char **atts)
|
||||
{
|
||||
struct ParserStruct *state = (struct ParserStruct *) userData;
|
||||
state->tags++;
|
||||
state->depth++;
|
||||
|
||||
/* Get a clean slate for reading in character data. */
|
||||
free(state->characters.memory);
|
||||
state->characters.memory = NULL;
|
||||
state->characters.size = 0;
|
||||
}
|
||||
|
||||
static void characterDataHandler(void *userData, const XML_Char *s, int len)
|
||||
{
|
||||
struct ParserStruct *state = (struct ParserStruct *) userData;
|
||||
struct MemoryStruct *mem = &state->characters;
|
||||
|
||||
mem->memory = realloc(mem->memory, mem->size + len + 1);
|
||||
if(mem->memory == NULL) {
|
||||
/* Out of memory. */
|
||||
fprintf(stderr, "Not enough memory (realloc returned NULL).\n");
|
||||
state->ok = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(&(mem->memory[mem->size]), s, len);
|
||||
mem->size += len;
|
||||
mem->memory[mem->size] = 0;
|
||||
}
|
||||
|
||||
static void endElement(void *userData, const XML_Char *name)
|
||||
{
|
||||
struct ParserStruct *state = (struct ParserStruct *) userData;
|
||||
state->depth--;
|
||||
|
||||
printf("%5lu %10lu %s\n", state->depth, state->characters.size, name);
|
||||
}
|
||||
|
||||
static size_t parseStreamCallback(void *contents, size_t length, size_t nmemb, void *userp)
|
||||
{
|
||||
XML_Parser parser = (XML_Parser) userp;
|
||||
size_t real_size = length * nmemb;
|
||||
struct ParserStruct *state = (struct ParserStruct *) XML_GetUserData(parser);
|
||||
|
||||
/* Only parse if we're not already in a failure state. */
|
||||
if (state->ok && XML_Parse(parser, contents, real_size, 0) == 0) {
|
||||
int error_code = XML_GetErrorCode(parser);
|
||||
fprintf(stderr, "Parsing response buffer of length %lu failed with error code %d (%s).\n",
|
||||
real_size, error_code, XML_ErrorString(error_code));
|
||||
state->ok = 0;
|
||||
}
|
||||
|
||||
return real_size;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURLcode res;
|
||||
XML_Parser parser;
|
||||
struct ParserStruct state;
|
||||
|
||||
/* Initialize the state structure for parsing. */
|
||||
memset(&state, 0, sizeof(struct ParserStruct));
|
||||
state.ok = 1;
|
||||
|
||||
/* Initialize a namespace-aware parser. */
|
||||
parser = XML_ParserCreateNS(NULL, '\0');
|
||||
XML_SetUserData(parser, &state);
|
||||
XML_SetElementHandler(parser, startElement, endElement);
|
||||
XML_SetCharacterDataHandler(parser, characterDataHandler);
|
||||
|
||||
/* Initalize a libcurl handle. */
|
||||
curl_global_init(CURL_GLOBAL_ALL ^ CURL_GLOBAL_SSL);
|
||||
curl_handle = curl_easy_init();
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.w3schools.com/xml/simple.xml");
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, parseStreamCallback);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)parser);
|
||||
|
||||
printf("Depth Characters Closing Tag\n");
|
||||
|
||||
/* Perform the request and any follow-up parsing. */
|
||||
res = curl_easy_perform(curl_handle);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
}
|
||||
else if (state.ok) {
|
||||
/* Expat requires one final call to finalize parsing. */
|
||||
if (XML_Parse(parser, NULL, 0, 1) == 0) {
|
||||
int error_code = XML_GetErrorCode(parser);
|
||||
fprintf(stderr, "Finalizing parsing failed with error code %d (%s).\n",
|
||||
error_code, XML_ErrorString(error_code));
|
||||
}
|
||||
else {
|
||||
printf(" --------------\n");
|
||||
printf(" %lu tags total\n", state.tags);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up. */
|
||||
free(state.characters.memory);
|
||||
XML_ParserFree(parser);
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -38,7 +38,7 @@ man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
|
||||
curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
|
||||
curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
|
||||
curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
|
||||
curl_multi_socket_action.3
|
||||
curl_multi_socket_action.3 curl_multi_wait.3
|
||||
|
||||
HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
|
||||
curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html \
|
||||
@@ -58,7 +58,7 @@ HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
|
||||
curl_easy_unescape.html curl_multi_setopt.html curl_multi_socket.html \
|
||||
curl_multi_timeout.html curl_formget.html curl_multi_assign.html \
|
||||
curl_easy_pause.html curl_easy_recv.html curl_easy_send.html \
|
||||
curl_multi_socket_action.html
|
||||
curl_multi_socket_action.html curl_multi_wait.html
|
||||
|
||||
PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
|
||||
curl_easy_init.pdf curl_easy_perform.pdf curl_easy_setopt.pdf \
|
||||
@@ -77,7 +77,7 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
|
||||
curl_easy_escape.pdf curl_easy_unescape.pdf curl_multi_setopt.pdf \
|
||||
curl_multi_socket.pdf curl_multi_timeout.pdf curl_formget.pdf \
|
||||
curl_multi_assign.pdf curl_easy_pause.pdf curl_easy_recv.pdf \
|
||||
curl_easy_send.pdf curl_multi_socket_action.pdf
|
||||
curl_easy_send.pdf curl_multi_socket_action.pdf curl_multi_wait.pdf
|
||||
|
||||
CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
|
||||
|
||||
|
@@ -162,7 +162,7 @@ method(s) available for your proxy authentication. (Added in 7.10.8)
|
||||
.IP CURLINFO_OS_ERRNO
|
||||
Pass a pointer to a long to receive the errno variable from a connect failure.
|
||||
Note that the value is only set on failure, it is not reset upon a
|
||||
successfull operation. (Added in 7.12.2)
|
||||
successful operation. (Added in 7.12.2)
|
||||
.IP CURLINFO_NUM_CONNECTS
|
||||
Pass a pointer to a long to receive how many new connections libcurl had to
|
||||
create to achieve the previous transfer (only the successful connects are
|
||||
@@ -232,7 +232,7 @@ Pass a pointer to a char pointer to receive a pointer to a string holding the
|
||||
most recent RTSP Session ID.
|
||||
|
||||
Applications wishing to resume an RTSP session on another connection should
|
||||
retreive this info before closing the active connection.
|
||||
retrieve this info before closing the active connection.
|
||||
.IP CURLINFO_RTSP_CLIENT_CSEQ
|
||||
Pass a pointer to a long to receive the next CSeq that will be used by the
|
||||
application.
|
||||
@@ -244,7 +244,7 @@ by the application.
|
||||
unimplemented).\fP
|
||||
|
||||
Applications wishing to resume an RTSP session on another connection should
|
||||
retreive this info before closing the active connection.
|
||||
retrieve this info before closing the active connection.
|
||||
.IP CURLINFO_RTSP_CSEQ_RECV
|
||||
Pass a pointer to a long to receive the most recently received CSeq from the
|
||||
server. If your application encounters a \fICURLE_RTSP_CSEQ_ERROR\fP then you
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" *
|
||||
.\" * This software is licensed as described in the file COPYING, which
|
||||
.\" * you should have received as part of this distribution. The terms
|
||||
@@ -38,8 +38,11 @@ that returns pause signals to the library that it couldn't take care of any
|
||||
data at all, and that data will then be delivered again to the callback when
|
||||
the writing is later unpaused.
|
||||
|
||||
NOTE: while it may feel tempting, take care and notice that you cannot call
|
||||
this function from another thread.
|
||||
While it may feel tempting, take care and notice that you cannot call this
|
||||
function from another thread. To unpause, you may for example call it from the
|
||||
progress callback (see \fIcurl_easy_setopt(3)\fP's
|
||||
\fICURLOPT_PROGRESSFUNCTION\fP), which gets called at least once per second,
|
||||
even if the connection is paused.
|
||||
|
||||
When this function is called to unpause reading, the chance is high that you
|
||||
will get your write callback called before this function returns.
|
||||
@@ -68,6 +71,18 @@ code means something wrong occurred after the new state was set. See the
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.18.0. Before this version, there was no
|
||||
explicit support for pausing transfers.
|
||||
.SH "USAGE WITH THE MULTI-SOCKET INTERFACE"
|
||||
Before libcurl 7.32.0, when a specific handle was unpaused with this function,
|
||||
there was no particular forced rechecking or similar of the socket's state,
|
||||
which made the continuation of the transfer get delayed until next
|
||||
multi-socket call invoke or even longer. Alternatively, the user could
|
||||
forcibly call for example curl_multi_socket_all(3) - with a rather hefty
|
||||
performance penalty.
|
||||
|
||||
Starting in libcurl 7.32.0, unpausing a transfer will schedule a timeout
|
||||
trigger for that handle 1 millisecond into the future, so that a
|
||||
curl_multi_socket_action( ... CURL_SOCKET_TIMEOUT) can be used immediately
|
||||
afterwards to get the transfer going again as desired.
|
||||
.SH "MEMORY USE"
|
||||
When pausing a read by returning the magic return code from a write callback,
|
||||
the read data is already in libcurl's internal buffers so it'll have to keep
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" *
|
||||
.\" * This software is licensed as described in the file COPYING, which
|
||||
.\" * you should have received as part of this distribution. The terms
|
||||
@@ -59,8 +59,13 @@ On success, returns \fBCURLE_OK\fP, stores the received data into
|
||||
|
||||
On failure, returns the appropriate error code.
|
||||
|
||||
If there is no data to read, the function returns \fBCURLE_AGAIN\fP. Use
|
||||
your operating system facilities to wait until the data is ready, and retry.
|
||||
If there is no data to read, the function returns \fBCURLE_AGAIN\fP. Use your
|
||||
operating system facilities to wait until the data is ready, and retry.
|
||||
|
||||
Reading exactly 0 bytes would indicate a closed connection.
|
||||
|
||||
If there's no socket available to use from the previous transfer, this function
|
||||
returns CURLE_UNSUPPORTED_PROTOCOL.
|
||||
.SH EXAMPLE
|
||||
See \fBsendrecv.c\fP in \fBdocs/examples\fP directory for usage example.
|
||||
.SH "SEE ALSO"
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" *
|
||||
.\" * This software is licensed as described in the file COPYING, which
|
||||
.\" * you should have received as part of this distribution. The terms
|
||||
@@ -57,6 +57,9 @@ sent into \fB*n\fP. Note that this may very well be less than the amount you
|
||||
wanted to send.
|
||||
|
||||
On failure, returns the appropriate error code.
|
||||
|
||||
If there's no socket available to use from the previous transfer, this function
|
||||
returns CURLE_UNSUPPORTED_PROTOCOL.
|
||||
.SH EXAMPLE
|
||||
See \fBsendrecv.c\fP in \fBdocs/examples\fP directory for usage example.
|
||||
.SH "SEE ALSO"
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user