Compare commits
	
		
			1191 Commits
		
	
	
		
			curl-7_31_
			...
			curl-7_36_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 4f041c9d6e | ||
|   | 4d06b27921 | ||
|   | 965690f67e | ||
|   | 5019c78095 | ||
|   | 517b06d657 | ||
|   | e798e6759b | ||
|   | b877494a27 | ||
|   | 3ebfaf6a03 | ||
|   | ed02f0abca | ||
|   | 5e097583f7 | ||
|   | 196140dcaf | ||
|   | 4ff71183b9 | ||
|   | 2fc31dcf74 | ||
|   | 715125e790 | ||
|   | 930b81387b | ||
|   | ec0079a99d | ||
|   | 47f8e99e78 | ||
|   | ff25f437a5 | ||
|   | 31265376bc | ||
|   | 7a1fb8e816 | ||
|   | 5017d5ada8 | ||
|   | 4d6108315b | ||
|   | 67061e3f4e | ||
|   | c864d81289 | ||
|   | b4f6cd46eb | ||
|   | 4c599b9d2d | ||
|   | c03243576a | ||
|   | 02bba0ce7d | ||
|   | e8aff0c588 | ||
|   | 9b5b6a2b1a | ||
|   | ca7d1de69c | ||
|   | 61591eee68 | ||
|   | 596800378d | ||
|   | 8c4d6ceec0 | ||
|   | 891ef341b3 | ||
|   | 2465ee7573 | ||
|   | 9787b8e9d4 | ||
|   | dcdbac2568 | ||
|   | ac7118319e | ||
|   | 8ddda0e999 | ||
|   | 74ad0221cc | ||
|   | a55e7f0abd | ||
|   | 63e3e03dae | ||
|   | 6da4085e48 | ||
|   | e591165f94 | ||
|   | e84d0b41f6 | ||
|   | 539412851c | ||
|   | 219a0fbe76 | ||
|   | 0b3750b5c2 | ||
|   | a21c04f391 | ||
|   | c01467b753 | ||
|   | 778e4bb276 | ||
|   | 9cb7802cfd | ||
|   | 6f416fa462 | ||
|   | 420d9ff3eb | ||
|   | 85484355b3 | ||
|   | d8073db304 | ||
|   | 7fef4016de | ||
|   | 68920b6c11 | ||
|   | 46b1d0a047 | ||
|   | eba197161a | ||
|   | 36802d6e0c | ||
|   | f1a9e6858e | ||
|   | 75e996f29f | ||
|   | 5513bbd5c3 | ||
|   | 1f07718123 | ||
|   | cde0cf7c5e | ||
|   | 53f1f4a18e | ||
|   | bd248a0b80 | ||
|   | 219d19a401 | ||
|   | 78f26394dc | ||
|   | 4efa1d29e2 | ||
|   | fd97c17bb7 | ||
|   | 5577540ad5 | ||
|   | 17df2d8f8e | ||
|   | fc59a9e18f | ||
|   | 07d7603b45 | ||
|   | 1a9b58fcb2 | ||
|   | 3228deff40 | ||
|   | e9665e9658 | ||
|   | d48eb1dd69 | ||
|   | 4548e0fe71 | ||
|   | 70052836d1 | ||
|   | 249dc83571 | ||
|   | 0704dd770d | ||
|   | ad388a7d37 | ||
|   | 87683d4b76 | ||
|   | f35668985e | ||
|   | e904b15f21 | ||
|   | 63fc8ee7be | ||
|   | c27cc68815 | ||
|   | 0af2322bc6 | ||
|   | 59b5ef444e | ||
|   | afc6e5004f | ||
|   | 0d9ddf91ca | ||
|   | cc31a4a645 | ||
|   | 665096e24c | ||
|   | d6b9f054e9 | ||
|   | 2249f7fe70 | ||
|   | 705a4cb549 | ||
|   | 6512e93be1 | ||
|   | 3674f2021d | ||
|   | 8c80840d01 | ||
|   | 24e22e1078 | ||
|   | c10bf9bb36 | ||
|   | e6e8b14405 | ||
|   | b914e7ed02 | ||
|   | ee23d13a79 | ||
|   | dcbae71812 | ||
|   | 67f051051f | ||
|   | b98c74b67e | ||
|   | 6969e24aee | ||
|   | e08d0662b7 | ||
|   | b5486adc9b | ||
|   | a660c0dbe6 | ||
|   | 3521e4e40d | ||
|   | 873178a657 | ||
|   | 647f83e809 | ||
|   | 0d6225ad0d | ||
|   | 8749bbe7fd | ||
|   | 03c288202e | ||
|   | 938f93549f | ||
|   | 911a5c3646 | ||
|   | f207f7e427 | ||
|   | b1096d2352 | ||
|   | 452a4d90a4 | ||
|   | 860424bb06 | ||
|   | 035b91a26c | ||
|   | e9dfdef411 | ||
|   | 854aca5420 | ||
|   | 4b4e8a5853 | ||
|   | 184c3e2d37 | ||
|   | b04c158adf | ||
|   | 2111c2ed07 | ||
|   | 1f60728f81 | ||
|   | 0d94640c9b | ||
|   | 575a2b684b | ||
|   | 86f266b004 | ||
|   | 79a9f8c942 | ||
|   | d765099813 | ||
|   | f3bae6ed73 | ||
|   | 013e9a11ff | ||
|   | 77a51364a4 | ||
|   | 6239146e93 | ||
|   | dc0f8c04ec | ||
|   | 2de045ff7c | ||
|   | f80ca7a05a | ||
|   | 89070d0e68 | ||
|   | 779afe3bbf | ||
|   | f3ce1af9fc | ||
|   | 3c2c1f9876 | ||
|   | 8451623b45 | ||
|   | 0a568867c0 | ||
|   | 91c13d759a | ||
|   | 89c29aa70f | ||
|   | 75f00de55c | ||
|   | 69745aaa45 | ||
|   | 01844658df | ||
|   | 38a56a9d94 | ||
|   | 25600bdf75 | ||
|   | 1813a77b02 | ||
|   | d3d871cb4f | ||
|   | db981b7b30 | ||
|   | 378af08c99 | ||
|   | c021a60bcc | ||
|   | bcb32e915e | ||
|   | 0ab97ba009 | ||
|   | bff7398942 | ||
|   | ec9476052d | ||
|   | 8f5a9147be | ||
|   | 82a4d537c3 | ||
|   | 87e873c6d0 | ||
|   | 33224f9bcd | ||
|   | c8d1733d12 | ||
|   | 3a0d1bebba | ||
|   | 909a68c121 | ||
|   | 70bd9784de | ||
|   | daa182afa6 | ||
|   | 230e872dbd | ||
|   | 5a997d97fd | ||
|   | 1861a1de67 | ||
|   | 86a40f5d1a | ||
|   | ae363075e6 | ||
|   | ea3828e0c7 | ||
|   | cc0da321de | ||
|   | 8e62f7a650 | ||
|   | 8cf63f88c2 | ||
|   | c5f8e2f5f4 | ||
|   | 6374ab2a36 | ||
|   | 6b9a3c1865 | ||
|   | 1f148c103c | ||
|   | 132f5edfbd | ||
|   | 2d8623e85d | ||
|   | 85a4df8b79 | ||
|   | e2dae8a7c2 | ||
|   | a3a6b03c30 | ||
|   | 3b929b6a65 | ||
|   | 67d14ab98f | ||
|   | 6c492f34e5 | ||
|   | fa8d7ce4fe | ||
|   | 09d907ee68 | ||
|   | f3a12460ad | ||
|   | 9597f7dfbc | ||
|   | 7969a77735 | ||
|   | 4a8c877273 | ||
|   | 265f2e9ed7 | ||
|   | 1ebf22cc0e | ||
|   | ff92fcfb90 | ||
|   | 8d1377282e | ||
|   | 1505e4612b | ||
|   | b93755df37 | ||
|   | d10065c05a | ||
|   | 456169f9e5 | ||
|   | dd97828df7 | ||
|   | 5204b45ff9 | ||
|   | 225ec4312f | ||
|   | 18b540f9d1 | ||
|   | f8abd56450 | ||
|   | 61ba1daba0 | ||
|   | 06b4275c0d | ||
|   | 133cdd29ea | ||
|   | ff0547e70e | ||
|   | 7d242658ac | ||
|   | dde3081085 | ||
|   | 2dc7ad23fd | ||
|   | e5524b7b25 | ||
|   | 0ea9f70049 | ||
|   | 4082dc9de6 | ||
|   | dbccf497da | ||
|   | 63b26d889f | ||
|   | 4d8db595ca | ||
|   | 6127e54f40 | ||
|   | 8b6654224b | ||
|   | c35d05aa62 | ||
|   | 8034b08e0e | ||
|   | b811200f64 | ||
|   | c1daf6c0cd | ||
|   | cf80b85b66 | ||
|   | 2f89a61cc0 | ||
|   | 0104678c79 | ||
|   | ffb8a21d85 | ||
|   | 9ab0dc618f | ||
|   | 83dbd06936 | ||
|   | e5acae0052 | ||
|   | efc112079c | ||
|   | 2c49f2e3db | ||
|   | 9f42205dcc | ||
|   | 4ea2d5579b | ||
|   | 9f132f9f39 | ||
|   | ca9ab24ed5 | ||
|   | 480ca49ecb | ||
|   | 82f558366f | ||
|   | 6fb34ea6c6 | ||
|   | a738bb1c9f | ||
|   | 0f213fdca1 | ||
|   | be9cc620b5 | ||
|   | c631a54bb6 | ||
|   | 768151449b | ||
|   | 97857de80e | ||
|   | 784f225266 | ||
|   | b58b87e76e | ||
|   | 48c3bed43b | ||
|   | 1c9aaa0bac | ||
|   | c5165b8458 | ||
|   | 88705ef80e | ||
|   | 0952c9abcc | ||
|   | 83f52a455f | ||
|   | a7affd637f | ||
|   | 93f473c78a | ||
|   | a878cb3056 | ||
|   | 0e11307057 | ||
|   | 0f23662af7 | ||
|   | dd011df9e1 | ||
|   | 8e778887b5 | ||
|   | 99b4ff8b6f | ||
|   | 22c198fa89 | ||
|   | c3fe3d9926 | ||
|   | 62e3d66cc6 | ||
|   | b451c10d1e | ||
|   | be84524cc2 | ||
|   | 803581d3e0 | ||
|   | 341d09bc2b | ||
|   | 0070f7a09d | ||
|   | 220bcba93d | ||
|   | eb91e1a58f | ||
|   | 2319221c83 | ||
|   | 914b60c827 | ||
|   | 07b66cbfa4 | ||
|   | 86724581b6 | ||
|   | 665c160f0a | ||
|   | e15e73b741 | ||
|   | 53940f8834 | ||
|   | 8d3608f2ad | ||
|   | 8bcf677a30 | ||
|   | 5e7fe58698 | ||
|   | c3678f3bf6 | ||
|   | 2bf90d0710 | ||
|   | 9873fd5317 | ||
|   | d735d3e803 | ||
|   | 1a20f59237 | ||
|   | f00899d73e | ||
|   | 00b1e52823 | ||
|   | 31860ab8c8 | ||
|   | 2070a140fd | ||
|   | bcb19883a8 | ||
|   | f2e42dd056 | ||
|   | 5a47062cad | ||
|   | 0f46b3b3dd | ||
|   | 23a04863aa | ||
|   | 33f9c05082 | ||
|   | 00787f94b2 | ||
|   | 49b63cf30d | ||
|   | f55f8d4c18 | ||
|   | 88b074df3f | ||
|   | f5860fd5fc | ||
|   | e17446b097 | ||
|   | 0d959c64b2 | ||
|   | 606e67c812 | ||
|   | b4b28c7001 | ||
|   | e6130c0310 | ||
|   | da9864fb72 | ||
|   | 755dc2f058 | ||
|   | 6c014e4283 | ||
|   | 4013a2aa64 | ||
|   | 0b5b52ff2d | ||
|   | 251305cd7f | ||
|   | 852a018e78 | ||
|   | 82de54dd38 | ||
|   | 12ecd56da7 | ||
|   | 6217cf6ba3 | ||
|   | afd288b28f | ||
|   | 39f7e80a52 | ||
|   | b0fa530c98 | ||
|   | 4f334ba017 | ||
|   | 33b8960dc8 | ||
|   | de966b403a | ||
|   | 2cac75c4e4 | ||
|   | aba98991a5 | ||
|   | db1beab1d7 | ||
|   | 93ca1d2065 | ||
|   | e35ffda0b3 | ||
|   | d2671340a6 | ||
|   | ecaf2f02f1 | ||
|   | d4296f6f06 | ||
|   | eb02a99c61 | ||
|   | 3f5546b2be | ||
|   | 345891edba | ||
|   | 821094ba72 | ||
|   | 7e0c2c47ab | ||
|   | 7b774482e7 | ||
|   | 27ecc22649 | ||
|   | 7f807f394f | ||
|   | 9520c62049 | ||
|   | ce82a1be0d | ||
|   | c7a76bb056 | ||
|   | 8b984641f2 | ||
|   | 5b591829b6 | ||
|   | 9d497c6afe | ||
|   | 89dbb6a0da | ||
|   | 2d15958711 | ||
|   | bbc1705fa9 | ||
|   | 87ade5f0eb | ||
|   | a33e7edcec | ||
|   | 0fea86afe3 | ||
|   | 3a4cd2ad8d | ||
|   | 82c472228e | ||
|   | 0089e65008 | ||
|   | 2492fd30e5 | ||
|   | 190e41f840 | ||
|   | 5d25d626b1 | ||
|   | e473a4d2f3 | ||
|   | 7e85964080 | ||
|   | 9bd2fdb8e2 | ||
|   | 3b5c75ef3d | ||
|   | 3b183df9cc | ||
|   | 7cd45b297e | ||
|   | 9362603f05 | ||
|   | 980659a2ca | ||
|   | 041d1e14d6 | ||
|   | 21aa79f463 | ||
|   | 28933f9d30 | ||
|   | 5b2342d377 | ||
|   | 31075a8897 | ||
|   | 2d435c7fb5 | ||
|   | 0151316183 | ||
|   | aa1ee9e7a2 | ||
|   | f61e0a34ea | ||
|   | e35458bc08 | ||
|   | e96b67a70f | ||
|   | 8ae35102c4 | ||
|   | fc0b4b0d31 | ||
|   | 619d1704ae | ||
|   | d5f1590d5c | ||
|   | fca7930dfa | ||
|   | e9c0f1f658 | ||
|   | 279c95b5b3 | ||
|   | 61312fe66f | ||
|   | 149e0c8d10 | ||
|   | 0f4bf77bd3 | ||
|   | ecb0dc4c90 | ||
|   | a6742a1c12 | ||
|   | e209d60713 | ||
|   | 91d62e9abd | ||
|   | 3e17db4882 | ||
|   | ef2d7cb44b | ||
|   | e948b9c6e3 | ||
|   | afb65c6cf3 | ||
|   | 5be92d03b0 | ||
|   | 3bc349b53b | ||
|   | ad39e7ec01 | ||
|   | 98b7fc0195 | ||
|   | f9797871aa | ||
|   | d718abd968 | ||
|   | 190bb785d8 | ||
|   | 5c0eae136b | ||
|   | 5220c1d692 | ||
|   | 84a9f092dc | ||
|   | 4fc8d83f5f | ||
|   | 8fc4abedf1 | ||
|   | c216179af4 | ||
|   | 4c51f2b578 | ||
|   | 2b026784a8 | ||
|   | 3c1519117a | ||
|   | 602d28a210 | ||
|   | 404794e97a | ||
|   | 3b6420c0a5 | ||
|   | 62da1e7458 | ||
|   | bf24b64e83 | ||
|   | d28b70d152 | ||
|   | 231b23acbb | ||
|   | 3529162405 | ||
|   | d237828ebc | ||
|   | c50d3ed075 | ||
|   | 61288cbdef | ||
|   | 42100cdead | ||
|   | 4bb7400529 | ||
|   | 303172d220 | ||
|   | 0f340f0572 | ||
|   | f063773b83 | ||
|   | e9b9e287c1 | ||
|   | 030303fa99 | ||
|   | 5f8f512719 | ||
|   | 6bc9e46bf1 | ||
|   | db11750cfa | ||
|   | 1f47a77b29 | ||
|   | 0757a9b941 | ||
|   | 83ae98c6c6 | ||
|   | 2658da7604 | ||
|   | c16e5dfbc8 | ||
|   | 7de2e03258 | ||
|   | ab71241c88 | ||
|   | e9625c5bc6 | ||
|   | 18a6467c8c | ||
|   | 7b368e7f94 | ||
|   | 34365e4b03 | ||
|   | 60bd22620a | ||
|   | 6e4d4a9b51 | ||
|   | c68758b621 | ||
|   | 73a894170b | ||
|   | 0aafd77fa4 | ||
|   | 9f96f8a5c5 | ||
|   | 01aaad7442 | ||
|   | 610a55388b | ||
|   | 5107d66b2e | ||
|   | 4e1ece2e44 | ||
|   | 28dd47d4d4 | ||
|   | 147b2a546e | ||
|   | 95b5036a59 | ||
|   | 263616202b | ||
|   | c9dd4022f4 | ||
|   | f2d234a4dd | ||
|   | 2a4ee0d221 | ||
|   | f88f9bed00 | ||
|   | 9aa6e4357a | ||
|   | 7b057f53fd | ||
|   | 2dd9bfc5d9 | ||
|   | 0ff0a994ad | ||
|   | e8b57d1e84 | ||
|   | 7fd490732a | ||
|   | 0c762f1c92 | ||
|   | 15bf9389ce | ||
|   | 2618e4caae | ||
|   | 08e57f916c | ||
|   | 6f2d5f0562 | ||
|   | 82bf8edff3 | ||
|   | cd492a3ba8 | ||
|   | 50aac1a37d | ||
|   | 574db1a6fd | ||
|   | 7246255416 | ||
|   | f763d1b1bb | ||
|   | 48cd1292e2 | ||
|   | f718415bc7 | ||
|   | 2715d7f948 | ||
|   | 3db1f3dd81 | ||
|   | 7da9c95bcf | ||
|   | 95ae389e17 | ||
|   | 91735102ac | ||
|   | 248967e300 | ||
|   | cf2051764c | ||
|   | 3ce2a3991b | ||
|   | 195b63f99c | ||
|   | 1deac31eba | ||
|   | bf468fb589 | ||
|   | ca4506b46a | ||
|   | 727d798d68 | ||
|   | 3917d73b36 | ||
|   | 812c5ace75 | ||
|   | c3a02c3e54 | ||
|   | 565c5b3dc3 | ||
|   | 11e8066ef9 | ||
|   | 92b9ae5c5d | ||
|   | a47c142a88 | ||
|   | eccf4fb7ee | ||
|   | 9f260b5d66 | ||
|   | 0452976711 | ||
|   | 94d820b4cb | ||
|   | 1cfb436a2f | ||
|   | fae7db8a31 | ||
|   | 0a898655e8 | ||
|   | 48043f87b6 | ||
|   | b7b126ee41 | ||
|   | 91c8f81d72 | ||
|   | 74476609c3 | ||
|   | 6c62d84232 | ||
|   | c93bd31336 | ||
|   | 933e6c9d16 | ||
|   | da24fbbc00 | ||
|   | 367648d24a | ||
|   | bd3a59ad41 | ||
|   | c0245cc591 | ||
|   | 13c696f37f | ||
|   | 0966b324d9 | ||
|   | c0ef05e675 | ||
|   | 1dc43de0dc | ||
|   | 8a8f9a5d57 | ||
|   | be28223f35 | ||
|   | 8e2d73bbde | ||
|   | dd4d9ea542 | ||
|   | 169fedbdce | ||
|   | 32b9c30e67 | ||
|   | 75cd7fd667 | ||
|   | 7246dffff5 | ||
|   | 41d21e460f | ||
|   | aadca7f418 | ||
|   | 3905bd637d | ||
|   | c4f46e97ca | ||
|   | bd3ca6630a | ||
|   | 92e607abfa | ||
|   | ef118c13ba | ||
|   | 1cf71bd76e | ||
|   | 2c0ecac9d3 | ||
|   | b0b5b51193 | ||
|   | ff9b66a8d4 | ||
|   | e221b55f67 | ||
|   | 865666afca | ||
|   | 7fc9325a52 | ||
|   | 4fb8241add | ||
|   | 30e7e7552b | ||
|   | f58f843f66 | ||
|   | d92de3a7e9 | ||
|   | fe7fc61c6e | ||
|   | ad3836448e | ||
|   | f3ee587775 | ||
|   | c92c30edbd | ||
|   | 4d10f48629 | ||
|   | dc68120e63 | ||
|   | 0db811b69b | ||
|   | d81cbbcc2c | ||
|   | 0dd6522036 | ||
|   | 889cb9c982 | ||
|   | 26ff1ea6c3 | ||
|   | 59f1209fad | ||
|   | 7b9365c65f | ||
|   | a900d45489 | ||
|   | e64f91feb7 | ||
|   | b2a55c8106 | ||
|   | 030a2b8cb8 | ||
|   | edce855943 | ||
|   | 35e476a3f6 | ||
|   | 0434a19431 | ||
|   | 2ff0c6f5f3 | ||
|   | 8a94aedbd6 | ||
|   | 95877cf8ae | ||
|   | d3325ae40a | ||
|   | 23fabf8dea | ||
|   | 7a36b2abc0 | ||
|   | e1c255f388 | ||
|   | 6d3c832a30 | ||
|   | 7935478397 | ||
|   | 5ee64be9c6 | ||
|   | 9f18cf15d5 | ||
|   | bf05da183e | ||
|   | 2c04e8d80c | ||
|   | 925df53580 | ||
|   | 8191800a0c | ||
|   | 2165298fe6 | ||
|   | e885dc85a1 | ||
|   | df58084695 | ||
|   | 3c8c9b2779 | ||
|   | b27dc009cf | ||
|   | 2c7a5578e1 | ||
|   | b56d7cda74 | ||
|   | 8896b56488 | ||
|   | 0d735c29f9 | ||
|   | 3d50e91aee | ||
|   | 0cbfe5a7d5 | ||
|   | eedca5055e | ||
|   | 5d040632ac | ||
|   | 314c3b8480 | ||
|   | d630e1f389 | ||
|   | 0ea4a80bb2 | ||
|   | ed4ce23c23 | ||
|   | 168aa59705 | ||
|   | f71b1ad908 | ||
|   | dac01ff6d7 | ||
|   | 4a9fe26837 | ||
|   | 90ec8763a5 | ||
|   | 796333bc5e | ||
|   | f16c0de4e9 | ||
|   | 786cba1ada | ||
|   | ed1662c374 | ||
|   | 1f0616ea1a | ||
|   | 55250d2d02 | ||
|   | c5d73167a6 | ||
|   | bde901ad89 | ||
|   | 79c77f7c31 | ||
|   | 986c249f2f | ||
|   | 3b8c3eb911 | ||
|   | b29217d0d6 | ||
|   | 534f90f9bf | ||
|   | dbe228353d | ||
|   | bf77101e5c | ||
|   | 2ea9a125a6 | ||
|   | 58a00d6d9f | ||
|   | 57a27528e6 | ||
|   | 632c1edd06 | ||
|   | 434bc09263 | ||
|   | f2584627c8 | ||
|   | 6901861fc9 | ||
|   | d7d8a8f922 | ||
|   | c19cfb79db | ||
|   | 65ce9b6d6c | ||
|   | 5f34a10445 | ||
|   | fa1253aee1 | ||
|   | f833f54979 | ||
|   | e7d77fb3ef | ||
|   | c8e63f247a | ||
|   | 7396ad6e09 | ||
|   | 6d295f8d7d | ||
|   | 5bd999d0c5 | ||
|   | 0f81fbe5da | ||
|   | 9b67960421 | ||
|   | e10a26a9d6 | ||
|   | 7b68b58bc0 | ||
|   | 2d5455feac | ||
|   | ac05c80f19 | ||
|   | 460adfef93 | ||
|   | c876f6ae6d | ||
|   | f49276bfcb | ||
|   | d08ee3c83d | ||
|   | cf7008670b | ||
|   | 558034ab70 | ||
|   | 27b7b1062f | ||
|   | af82661dbd | ||
|   | 76f924131c | ||
|   | 98a5fdaf29 | ||
|   | 1ea05be46d | ||
|   | c9d8c00a41 | ||
|   | 5aa290f0f2 | ||
|   | f0831f7931 | ||
|   | 7fc3b2ce38 | ||
|   | 02fbc26d59 | ||
|   | 0074c9f5d1 | ||
|   | 90acbfd52e | ||
|   | 989b28fe97 | ||
|   | aa61e14dc1 | ||
|   | a84a09ad0b | ||
|   | 66b8557aff | ||
|   | 63cac69c2a | ||
|   | f77d9b6584 | ||
|   | 2736b27df7 | ||
|   | 297644fa70 | ||
|   | 0177f28c51 | ||
|   | 732d10ed6c | ||
|   | 526a1c3b45 | ||
|   | 5b315a273e | ||
|   | 5094bb53f4 | ||
|   | 052f24c9b7 | ||
|   | bce03fe144 | ||
|   | 9a1755264f | ||
|   | 3b59696a93 | ||
|   | cdccb42267 | ||
|   | 753d44fa00 | ||
|   | cfdfdcdd9d | ||
|   | e232f5f3f9 | ||
|   | 43400b4086 | ||
|   | 8179354c2f | ||
|   | f6c335d63f | ||
|   | 2bd72fa61c | ||
|   | e17c1b25bc | ||
|   | 7d1eb66cd7 | ||
|   | 255826c40f | ||
|   | 1d0eead969 | ||
|   | 8005e58983 | ||
|   | 5d415815df | ||
|   | f68559c086 | ||
|   | 08f97f3b1d | ||
|   | b87ba2c942 | ||
|   | e7a2ba41e3 | ||
|   | 6fe619be7a | ||
|   | 1e39b95682 | ||
|   | 8230af0b94 | ||
|   | 1709e5e966 | ||
|   | 7d7df83198 | ||
|   | 7de4cc35f8 | ||
|   | aa0eaef483 | ||
|   | 9f503a254b | ||
|   | d44b014271 | ||
|   | 469b423350 | ||
|   | 0adad07690 | ||
|   | e4670a1029 | ||
|   | 1f0e50f2b9 | ||
|   | 2766262a68 | ||
|   | bdb1f0e53d | ||
|   | 6e3613e6e6 | ||
|   | 1cb5150dba | ||
|   | d24b7953c2 | ||
|   | 13db74ffc3 | ||
|   | 98905aa2c5 | ||
|   | 820ed48a00 | ||
|   | 973cc22529 | ||
|   | 2cc9246477 | ||
|   | 650036633f | ||
|   | 78aee26be6 | ||
|   | 947d431d50 | ||
|   | 58bd0148fb | ||
|   | ca5c5be3e4 | ||
|   | 9bd37a6d27 | ||
|   | 1be69159f3 | ||
|   | a3da0a96e3 | ||
|   | 626f8a85f0 | ||
|   | 867b52a7ac | ||
|   | be31924f8c | ||
|   | f70b2c77f4 | ||
|   | ae495ffcc3 | ||
|   | 0fdfe82c6a | ||
|   | dead10b1b8 | ||
|   | 41d820d2c3 | ||
|   | 5b31b38c27 | ||
|   | 39f4e4fafa | ||
|   | 587811c0a6 | ||
|   | 7f7fbe7fbd | ||
|   | 9b1eb2b421 | ||
|   | 1034aa6680 | ||
|   | 4be0af7f74 | ||
|   | 72f850571d | ||
|   | e179d0eb12 | ||
|   | ce61510127 | ||
|   | 86c64f3daf | ||
|   | 65e556d0ce | ||
|   | 6a1363128f | ||
|   | 75b9b26465 | ||
|   | 2c84ffe154 | ||
|   | e7452415c5 | ||
|   | 87861c9b0e | ||
|   | 4d49ffe165 | ||
|   | f63603dec4 | ||
|   | 0218a737fe | ||
|   | 18ca0aa984 | ||
|   | c4e6c33b13 | ||
|   | d774802eec | ||
|   | 69c0d3fbc8 | ||
|   | 076726f141 | ||
|   | ad34a2d5c8 | ||
|   | 31e106c01c | ||
|   | 1dcc433661 | ||
|   | a106abee62 | ||
|   | 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 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -46,3 +46,4 @@ CHANGES.dist | ||||
| .cproject | ||||
| .settings | ||||
| /[0-9]*.patch | ||||
| .dirstamp | ||||
|   | ||||
							
								
								
									
										11
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| language: c | ||||
|  | ||||
| before_script: | ||||
|   - ./buildconf | ||||
|  | ||||
| compiler: | ||||
|   - clang | ||||
|   - gcc | ||||
|  | ||||
| notifications: | ||||
|   email: false | ||||
| @@ -108,7 +108,11 @@ if(NOT UNIX) | ||||
|     set(HAVE_IN_ADDR_T 0) | ||||
|     set(HAVE_INET_NTOA_R_DECL 0) | ||||
|     set(HAVE_INET_NTOA_R_DECL_REENTRANT 0) | ||||
|     if(ENABLE_IPV6) | ||||
|       set(HAVE_GETADDRINFO 1) | ||||
|     else() | ||||
|       set(HAVE_GETADDRINFO 0) | ||||
|     endif() | ||||
|     set(STDC_HEADERS 1) | ||||
|     set(RETSIGTYPE_TEST 1) | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,24 @@ | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2014, 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. | ||||
| # | ||||
| ########################################################################### | ||||
| # cURL/libcurl CMake script | ||||
| # by Tetetest and Sukender (Benoit Neil) | ||||
|  | ||||
| @@ -23,6 +44,8 @@ include(Utilities) | ||||
|  | ||||
| project( CURL C ) | ||||
|  | ||||
| message(WARNING "the curl cmake build system is poorly maintained. Be aware") | ||||
|  | ||||
| file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS) | ||||
| string (REGEX MATCH "LIBCURL_VERSION_MAJOR[ \t]+([0-9]+)" | ||||
|   LIBCURL_VERSION_MJ ${CURL_VERSION_H_CONTENTS}) | ||||
| @@ -783,6 +806,17 @@ else() | ||||
|   set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT}) | ||||
| endif() | ||||
|  | ||||
| # TODO test which of these headers are required for the typedefs used in curlbuild.h | ||||
| if(WIN32) | ||||
|   set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H}) | ||||
| else() | ||||
|   set(CURL_PULL_SYS_TYPES_H ${HAVE_SYS_TYPES_H}) | ||||
|   set(CURL_PULL_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H}) | ||||
|   set(CURL_PULL_SYS_POLL_H ${HAVE_SYS_POLL_H}) | ||||
| endif() | ||||
| set(CURL_PULL_STDINT_H ${HAVE_STDINT_H}) | ||||
| set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H}) | ||||
|  | ||||
| include(CMake/OtherTests.cmake) | ||||
|  | ||||
| add_definitions(-DHAVE_CONFIG_H) | ||||
|   | ||||
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| COPYRIGHT AND PERMISSION NOTICE | ||||
|  | ||||
| Copyright (c) 1996 - 2013, Daniel Stenberg, <daniel@haxx.se>. | ||||
| Copyright (c) 1996 - 2014, Daniel Stenberg, <daniel@haxx.se>. | ||||
|  | ||||
| All rights reserved. | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2014, 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 | ||||
| @@ -136,24 +136,60 @@ vc-zlib: $(VC) | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.$(VC) cfg=release-zlib | ||||
|  | ||||
| vc-x64-zlib: $(VC) | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib | ||||
|  | ||||
| vc-ssl: $(VC) | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl | ||||
|  | ||||
| vc-winssl: $(VC) | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-winssl WINDOWS_SSPI=1 | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.$(VC) cfg=release-winssl WINDOWS_SSPI=1 | ||||
|  | ||||
| vc-x64-ssl: $(VC) | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl | ||||
|  | ||||
| vc-x64-winssl: $(VC) | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl WINDOWS_SSPI=1 | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl WINDOWS_SSPI=1 | ||||
|  | ||||
| vc-ssl-zlib: $(VC) | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-zlib | ||||
| 	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 | ||||
| @@ -254,6 +290,18 @@ linux-ssl: ssl | ||||
| # We don't need to do anything for vc6. | ||||
| vc6: | ||||
|  | ||||
| # VC7 makefiles are for use with VS.NET and VS.NET 2003 | ||||
| vc7: lib/Makefile.vc7 src/Makefile.vc7 | ||||
|  | ||||
| lib/Makefile.vc7: lib/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s/VC6/VC7/g" lib/Makefile.vc6 > lib/Makefile.vc7 | ||||
|  | ||||
| src/Makefile.vc7: src/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s/VC6/VC7/g" src/Makefile.vc6 > src/Makefile.vc7 | ||||
|  | ||||
| # VC8 makefiles are for use with VS2005 | ||||
| vc8: lib/Makefile.vc8 src/Makefile.vc8 | ||||
|  | ||||
| lib/Makefile.vc8: lib/Makefile.vc6 | ||||
| @@ -286,6 +334,28 @@ src/Makefile.vc10: src/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" src/Makefile.vc6 > src/Makefile.vc10 | ||||
|  | ||||
| # VC11 makefiles are for use with VS2012 | ||||
| vc11: lib/Makefile.vc11 src/Makefile.vc11 | ||||
|  | ||||
| lib/Makefile.vc11: lib/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc11/g" -e "s/VC6/VC11/g" lib/Makefile.vc6 > lib/Makefile.vc11 | ||||
|  | ||||
| src/Makefile.vc11: src/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc11/g" -e "s/VC6/VC11/g" src/Makefile.vc6 > src/Makefile.vc11 | ||||
|  | ||||
| # VC12 makefiles are for use with VS2013 | ||||
| vc12: lib/Makefile.vc12 src/Makefile.vc12 | ||||
|  | ||||
| lib/Makefile.vc12: lib/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" lib/Makefile.vc6 > lib/Makefile.vc12 | ||||
|  | ||||
| src/Makefile.vc12: src/Makefile.vc6 | ||||
| 	@echo "generate $@" | ||||
| 	@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" src/Makefile.vc6 > src/Makefile.vc12 | ||||
|  | ||||
| ca-bundle: lib/mk-ca-bundle.pl | ||||
| 	@echo "generate a fresh ca-bundle.crt" | ||||
| 	@perl $< -b -l -u lib/ca-bundle.crt | ||||
|   | ||||
							
								
								
									
										191
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							
							
						
						
									
										191
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							| @@ -1,71 +1,86 @@ | ||||
| Curl and libcurl 7.31.0 | ||||
| Curl and libcurl 7.36.0 | ||||
|  | ||||
|  Public curl releases:         133 | ||||
|  Command line options:         152 | ||||
|  curl_easy_setopt() options:   199 | ||||
|  Public curl releases:         138 | ||||
|  Command line options:         161 | ||||
|  curl_easy_setopt() options:   206 | ||||
|  Public functions in libcurl:  58 | ||||
|  Known libcurl bindings:       42 | ||||
|  Contributors:                 1005 | ||||
|  Contributors:                 1123 | ||||
|  | ||||
| *** | ||||
|   krb4 support is up for removal. If you care about it at all, speak up | ||||
|   on the curl-library list asap! | ||||
| *** | ||||
| This release includes the following SECURITY ADVISORIES: | ||||
|  | ||||
|  o wrong re-use of connections [16] | ||||
|  o IP address wildcard certificate validation [17] | ||||
|  o not verifying certs for TLS to IP address / Darwinssl [18] | ||||
|  o not verifying certs for TLS to IP address / Winssl [19] | ||||
|  | ||||
| This release includes the following changes: | ||||
|  | ||||
|  o darwinssl: add TLS session resumption | ||||
|  o darwinssl: add TLS crypto authentication | ||||
|  o imap/pop3/smtp: Added support for ;auth=<mech> in the URL | ||||
|  o imap/pop3/smtp: Added support for ;auth=<mech> to CURLOPT_USERPWD | ||||
|  o usercertinmem.c: add example showing user cert in memory | ||||
|  o url: Added smtp and pop3 hostnames to the protocol detection list | ||||
|  o imap/pop3/smtp: Added support for enabling the SASL initial response [8] | ||||
|  o curl -E: allow to use ':' in certificate nicknames [10] | ||||
|  o ntlm: Added support for NTLMv2 [2] | ||||
|  o tool: Added support for URL specific options [3] | ||||
|  o openssl: add ALPN support | ||||
|  o gtls: add ALPN support | ||||
|  o nss: add ALPN and NPN support | ||||
|  o added CURLOPT_EXPECT_100_TIMEOUT_MS [7] | ||||
|  o tool: add --no-alpn and --no-npn | ||||
|  o added CURLOPT_SSL_ENABLE_NPN and CURLOPT_SSL_ENABLE_ALPN | ||||
|  o winssl: enable TLSv1.1 and TLSv1.2 by default | ||||
|  o winssl: TLSv1.2 disables certificate signatures using MD5 hash | ||||
|  o winssl: enable hostname verification of IP address using SAN or CN [11] | ||||
|  o darwinssl: Don't omit CN verification when an IP address is used [12] | ||||
|  o http2: build with current nghttp2 version | ||||
|  o polarssl: dropped support for PolarSSL < 1.3.0 | ||||
|  o openssl: info message with SSL version used | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o SECURITY VULNERABILITY: curl_easy_unescape() may parse data beyond the end | ||||
|    of the input buffer [26] | ||||
|  | ||||
|  o FTP: access files in root dir correctly [1] | ||||
|  o configure: try pthread_create without -lpthread [2] | ||||
|  o FTP: handle a 230 welcome response [3] | ||||
|  o curl-config: don't output static libs when they are disabled | ||||
|  o CURL_CHECK_CA_BUNDLE: don't check for paths when cross-compiling [4] | ||||
|  o Various documentation updates | ||||
|  o getinfo.c: reset timecond when clearing session-info variables [5] | ||||
|  o FILE: prevent an artificial timeout event due to stale speed-check data [6] | ||||
|  o ftp_state_pasv_resp: connect through proxy also when set by env [7] | ||||
|  o sshserver: disable StrictHostKeyChecking | ||||
|  o ftpserver: Fixed imap logout confirmation data | ||||
|  o curl_easy_init: use less mallocs | ||||
|  o smtp: Fixed unknown percentage complete in progress bar | ||||
|  o smtp: Fixed sending of double CRLF caused by first in EOB | ||||
|  o bindlocal: move brace out of #ifdef [9] | ||||
|  o winssl: Fixed invalid memory access during SSL shutdown [11] | ||||
|  o OS X framework: fix invalid symbolic link | ||||
|  o OpenSSL: allow empty server certificate subject [12] | ||||
|  o axtls: prevent memleaks on SSL handshake failures | ||||
|  o cookies: only consider full path matches | ||||
|  o Revert win32 MemoryTracking: wcsdup() _wcsdup() and _tcsdup() [13] | ||||
|  o Curl_cookie_add: handle IPv6 hosts [14] | ||||
|  o ossl_send: SSL_write() returning 0 is an error too | ||||
|  o ossl_recv: SSL_read() returning 0 is an error too | ||||
|  o Digest auth: escape user names with \ or " in them [15] | ||||
|  o curl_formadd.3: fixed wrong "end-marker" syntax [16] | ||||
|  o libcurl-tutorial.3: fix incorrect backslash [17] | ||||
|  o curl_multi_wait: reduce timeout if the multi handle wants to [18] | ||||
|  o tests/Makefile: typo in the perlcheck target [19] | ||||
|  o axtls: honor disabled VERIFYHOST | ||||
|  o OpenSSL: avoid double free in the PKCS12 certificate code [20] | ||||
|  o multi_socket: reduce timeout inaccuracy margin [21] | ||||
|  o digest: support auth-int for empty entity body [22] | ||||
|  o axtls: now done non-blocking | ||||
|  o lib1900: use tutil_tvnow instead of gettimeofday | ||||
|  o curl_easy_perform: avoid busy-looping [23] | ||||
|  o CURLOPT_COOKIELIST: take cookie share lock [24] | ||||
|  o multi_socket: react on socket close immediately [25] | ||||
|  o nss: allow to use ECC ciphers if NSS implements them [1] | ||||
|  o netrc: Fixed a memory leak in an OOM condition | ||||
|  o ftp: fixed a memory leak on wildcard error path | ||||
|  o pipeline: Fixed a NULL pointer dereference on OOM | ||||
|  o nss: prefer highest available TLS version | ||||
|  o 100-continue: fix timeout condition [4] | ||||
|  o ssh: Fixed a NULL pointer dereference on OOM condition | ||||
|  o formpost: use semicolon in multipart/mixed [5] | ||||
|  o --help: add missing --tlsv1.x options | ||||
|  o formdata: Fixed memory leak on OOM condition | ||||
|  o ConnectionExists: reusing possible HTTP+NTLM connections better [6] | ||||
|  o mingw32: fix compilation | ||||
|  o chunked decoder: track overflows correctly [8] | ||||
|  o curl_easy_setopt.3: add CURL_HTTP_VERSION_2_0 | ||||
|  o dict: fix memory leak in OOM exit path | ||||
|  o valgrind: added suppression on optimized code | ||||
|  o curl: output protocol headers using binary mode | ||||
|  o tool: Added URL index to password prompt for multiple operations | ||||
|  o ConnectionExists: re-use non-NTLM connections better [9] | ||||
|  o axtls: call ssl_read repeatedly | ||||
|  o multi: make MAXCONNECTS default 4 x number of easy handles function | ||||
|  o configure: Fix the --disable-crypto-auth option | ||||
|  o multi: ignore SIGPIPE internally | ||||
|  o curl.1: update the description of --tlsv1 | ||||
|  o SFTP: skip reading the dir when NOBODY=1 [10] | ||||
|  o easy: Fixed a memory leak on OOM condition | ||||
|  o tool: Fixed incorrect return code when setting HTTP request fails | ||||
|  o configure: Tiny fix to honor POSIX | ||||
|  o tool: Do not output libcurl source for the information only parameters | ||||
|  o Rework Open Watcom make files to use standard Wmake features | ||||
|  o x509asn: moved out Curl_verifyhost from NSS builds | ||||
|  o configure: call it GSS-API | ||||
|  o hostcheck: Curl_cert_hostcheck is not used by NSS builds | ||||
|  o multi_runsingle: move timestamp into INIT [13] | ||||
|  o remote_port: allow connect to port 0 | ||||
|  o parse_remote_port: error out on illegal port numbers better | ||||
|  o ssh: Pass errors from libssh2_sftp_read up the stack | ||||
|  o docs: remove documentation on setting up krb4 support | ||||
|  o polarssl: build fixes to work with PolarSSL 1.3.x | ||||
|  o polarssl: fix possible handshake timeout issue in multi | ||||
|  o nss: allow to enable/disable cipher-suites better | ||||
|  o ssh: prevent a logic error that could result in an infinite loop | ||||
|  o http2: free resources on disconnect | ||||
|  o polarssl: avoid extra newlines in debug messages | ||||
|  o rtsp: parse "Session:" header properly [14] | ||||
|  o trynextip: don't store 'ai' on failed connects | ||||
|  o Curl_cert_hostcheck: strip trailing dots in host name and wildcard | ||||
|  | ||||
| This release includes the following known bugs: | ||||
|  | ||||
| @@ -74,43 +89,33 @@ 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: | ||||
|  | ||||
|  David Strauss, Kamil Dudka, Steve Holme, Nick Zitzmann, Sam Deane, Duncan, | ||||
|  Anders Havn, Dan Fandrich, Paul Howarth, Dave Reisner, Wouter Van Rooy, | ||||
|  Linus Nielsen Feltzing, Ishan SinghLevett, Alessandro Ghedini, | ||||
|  Ludovico Cavedon, Zdenek Pavlas, Zekun Ni, Lars Johannesen, Marc Hoersken, | ||||
|  Renaud Guillard, John Gardiner Myers, Jared Jennings, Eric Hu, | ||||
|  Yamada Yasuharu, Stefan Neis, Mike Giancola, Eric S. Raymond, Andrii Moiseiev, | ||||
|  Christian Weisgerber, Peter Gal, Aleksey Tulinov, Hang Su, Sergei Nikulov, | ||||
|  Miguel Angel, Nach M. S., Benjamin Gilbert, Erik Johansson, Timo Sirainen, | ||||
|  Guenter Knauf | ||||
|   Adam Sampson, Arvid Norberg, Brad Spencer, Colin Hogben, Dan Fandrich, | ||||
|   Daniel Stenberg, David Ryskalczyk, Fabian Frank, Gaël PORTAY, Gisle Vanem, | ||||
|   Hubert Kario, Jeff King, Jiri Malak, Kamil Dudka, Maks Naumov, Marc Hoersken, | ||||
|   Michael Osipov, Mike Hasselberg, Nick Zitzmann, Patrick Monnerat, Prash Dush, | ||||
|   Remi Gacogne, Rob Davies, Romulo A. Ceccon, Shao Shuchao, Steve Holme, | ||||
|   Tatsuhiro Tsujikawa, Thomas Braun, Tiit Pikma, Yehezkel Horowitz, | ||||
|  | ||||
|         Thanks! (and sorry if I forgot to mention someone) | ||||
|  | ||||
| References to bug reports and discussions on issues: | ||||
|  | ||||
|  [1] = http://curl.haxx.se/mail/lib-2013-04/0142.html | ||||
|  [2] = http://curl.haxx.se/bug/view.cgi?id=1216 | ||||
|  [3] = http://curl.haxx.se/mail/lib-2013-02/0102.html | ||||
|  [4] = http://curl.haxx.se/mail/lib-2013-04/0294.html | ||||
|  [5] = http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=705783 | ||||
|  [6] = https://bugzilla.redhat.com/906031 | ||||
|  [7] = http://curl.haxx.se/bug/view.cgi?id=1218 | ||||
|  [8] = http://curl.haxx.se/mail/lib-2012-03/0114.html | ||||
|  [9] = http://curl.haxx.se/mail/lib-2013-05/0000.html | ||||
|  [10] = http://curl.haxx.se/bug/view.cgi?id=1196 | ||||
|  [11] = http://curl.haxx.se/bug/view.cgi?id=1219 | ||||
|  [12] = http://curl.haxx.se/bug/view.cgi?id=1220 | ||||
|  [13] = http://curl.haxx.se/mail/lib-2013-05/0070.html | ||||
|  [14] = http://curl.haxx.se/bug/view.cgi?id=1221 | ||||
|  [15] = http://curl.haxx.se/bug/view.cgi?id=1230 | ||||
|  [16] = http://curl.haxx.se/bug/view.cgi?id=1233 | ||||
|  [17] = http://curl.haxx.se/bug/view.cgi?id=1234 | ||||
|  [18] = http://curl.haxx.se/bug/view.cgi?id=1224 | ||||
|  [19] = http://curl.haxx.se/bug/view.cgi?id=1239 | ||||
|  [20] = http://curl.haxx.se/bug/view.cgi?id=1236 | ||||
|  [21] = http://curl.haxx.se/bug/view.cgi?id=1228 | ||||
|  [22] = http://curl.haxx.se/bug/view.cgi?id=1235 | ||||
|  [23] = http://curl.haxx.se/bug/view.cgi?id=1238 | ||||
|  [24] = http://curl.haxx.se/bug/view.cgi?id=1215 | ||||
|  [25] = http://curl.haxx.se/bug/view.cgi?id=1248 | ||||
|  [26] = http://curl.haxx.se/docs/adv_20130622.html | ||||
|  [1] = https://bugzilla.redhat.com/1058776 | ||||
|  [2] = http://curl.haxx.se/mail/lib-2014-01/0183.html | ||||
|  [3] = http://curl.haxx.se/mail/archive-2013-11/0006.html | ||||
|  [4] = http://curl.haxx.se/bug/view.cgi?id=1334 | ||||
|  [5] = http://curl.haxx.se/bug/view.cgi?id=1333 | ||||
|  [6] = http://curl.haxx.se/mail/lib-2014-02/0100.html | ||||
|  [7] = http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTEXPECT100TIMEOUTMS | ||||
|  [8] = http://curl.haxx.se/mail/lib-2014-02/0097.html | ||||
|  [9] = http://thread.gmane.org/gmane.comp.version-control.git/242213 | ||||
|  [10] = http://curl.haxx.se/mail/lib-2014-02/0155.html | ||||
|  [11] = http://curl.haxx.se/mail/lib-2014-02/0243.html | ||||
|  [12] = https://github.com/bagder/curl/pull/93 | ||||
|  [13] = http://curl.haxx.se/mail/lib-2014-02/0036.html | ||||
|  [14] = http://curl.haxx.se/mail/lib-2014-03/0134.html | ||||
|  [15] = http://curl.haxx.se/bug/view.cgi?id=1337 | ||||
|  [16] = http://curl.haxx.se/docs/adv_20140326A.html | ||||
|  [17] = http://curl.haxx.se/docs/adv_20140326B.html | ||||
|  [18] = http://curl.haxx.se/docs/adv_20140326C.html | ||||
|  [19] = http://curl.haxx.se/docs/adv_20140326D.html | ||||
|   | ||||
							
								
								
									
										13
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -2619,18 +2619,18 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]), | ||||
|     fi | ||||
|     capath="$want_capath" | ||||
|     ca="no" | ||||
|   elif test "x$cross_compiling" != "xyes"; then | ||||
|     dnl NOT cross-compiling and... | ||||
|     dnl neither of the --with-ca-* options are provided | ||||
|  | ||||
|   else | ||||
|     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$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 place | ||||
|       dnl in case we find no other | ||||
|         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 | ||||
| @@ -2662,6 +2662,7 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]), | ||||
|       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'"' | ||||
|   | ||||
							
								
								
									
										281
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										281
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2014, 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 | ||||
| @@ -31,7 +31,7 @@ XC_OVR_ZZ60 | ||||
| CURL_OVERRIDE_AUTOCONF | ||||
|  | ||||
| dnl configure script copyright | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2013 Daniel Stenberg, <daniel@haxx.se> | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2014 Daniel Stenberg, <daniel@haxx.se> | ||||
| This configure script may be copied, distributed and modified under the | ||||
| terms of the curl license; see COPYING for more details]) | ||||
|  | ||||
| @@ -126,7 +126,7 @@ fi | ||||
| dnl figure out the libcurl version | ||||
| CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curlver.h` | ||||
| XC_CHECK_PROG_CC | ||||
| AM_INIT_AUTOMAKE | ||||
| XC_AUTOMAKE | ||||
| AC_MSG_CHECKING([curl version]) | ||||
| AC_MSG_RESULT($CURLVERSION) | ||||
|  | ||||
| @@ -150,7 +150,6 @@ dnl initialize all the info variables | ||||
|     curl_ssl_msg="no      (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls,winssl,darwinssl} )" | ||||
|     curl_ssh_msg="no      (--with-libssh2)" | ||||
|    curl_zlib_msg="no      (--with-zlib)" | ||||
|    curl_krb4_msg="no      (--with-krb4*)" | ||||
|     curl_gss_msg="no      (--with-gssapi)" | ||||
|  curl_spnego_msg="no      (--with-spnego)" | ||||
| curl_tls_srp_msg="no      (--enable-tls-srp)" | ||||
| @@ -1066,6 +1065,7 @@ AC_HELP_STRING([--disable-ipv6],[Disable ipv6 support]), | ||||
|   AC_TRY_RUN([ /* is AF_INET6 available? */ | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <stdlib.h> /* for exit() */ | ||||
| main() | ||||
| { | ||||
|  if (socket(AF_INET6, SOCK_STREAM, 0) < 0) | ||||
| @@ -1134,101 +1134,6 @@ no) | ||||
|         ;; | ||||
| esac | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of Kerberos4 libraries and headers | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| AC_ARG_WITH(krb4-includes, | ||||
| AC_HELP_STRING([--with-krb4-includes=DIR], | ||||
|                [Specify location of kerberos4 headers]),[ | ||||
|  CPPFLAGS="$CPPFLAGS -I$withval" | ||||
|  KRB4INC="$withval" | ||||
|  want_krb4=yes | ||||
|  ]) | ||||
|  | ||||
| AC_ARG_WITH(krb4-libs, | ||||
| AC_HELP_STRING([--with-krb4-libs=DIR],[Specify location of kerberos4 libs]),[ | ||||
|  LDFLAGS="$LDFLAGS -L$withval" | ||||
|  KRB4LIB="$withval" | ||||
|  want_krb4=yes | ||||
|  ]) | ||||
|  | ||||
|  | ||||
| OPT_KRB4=off | ||||
| AC_ARG_WITH(krb4,dnl | ||||
| AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[ | ||||
|   OPT_KRB4="$withval" | ||||
|   if test X"$OPT_KRB4" != Xno; then | ||||
|     want_krb4="yes" | ||||
|     if test X"$OPT_KRB4" != Xyes; then | ||||
|       LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" | ||||
|       KRB4LIB="$OPT_KRB4/lib$libsuff" | ||||
|       CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" | ||||
|       KRB4INC="$OPT_KRB4/include" | ||||
|     fi | ||||
|   fi | ||||
|  ]) | ||||
|  | ||||
| AC_MSG_CHECKING([if Kerberos4 support is requested]) | ||||
|  | ||||
| if test "$want_krb4" = yes | ||||
| then | ||||
|   if test "$ipv6" = "yes"; then | ||||
|     echo krb4 is not compatible with IPv6 | ||||
|     exit 1 | ||||
|   fi | ||||
|   AC_MSG_RESULT(yes) | ||||
|  | ||||
|   dnl Check for & handle argument to --with-krb4 | ||||
|  | ||||
|   AC_MSG_CHECKING(where to look for Kerberos4) | ||||
|   if test X"$OPT_KRB4" = Xyes | ||||
|   then | ||||
|     AC_MSG_RESULT([defaults]) | ||||
|   else | ||||
|     AC_MSG_RESULT([libs in $KRB4LIB, headers in $KRB4INC]) | ||||
|   fi | ||||
|  | ||||
|   dnl Check for DES library | ||||
|   AC_CHECK_LIB(des, des_pcbc_encrypt, | ||||
|   [ | ||||
|     AC_CHECK_HEADERS(des.h) | ||||
|  | ||||
|     dnl resolv lib? | ||||
|     AC_CHECK_FUNC(res_search, , [AC_CHECK_LIB(resolv, res_search)]) | ||||
|  | ||||
|     dnl Check for the Kerberos4 library | ||||
|     AC_CHECK_LIB(krb, krb_net_read, | ||||
|     [ | ||||
|       dnl Check for header files | ||||
|       AC_CHECK_HEADERS(krb.h) | ||||
|  | ||||
|       dnl we found the required libraries, add to LIBS | ||||
|       LIBS="-lkrb -lcom_err -ldes $LIBS" | ||||
|  | ||||
|       dnl Check for function krb_get_our_ip_for_realm | ||||
|       dnl this is needed for NAT networks | ||||
|       AC_CHECK_FUNCS(krb_get_our_ip_for_realm) | ||||
|  | ||||
|       dnl add define KRB4 | ||||
|       AC_DEFINE(HAVE_KRB4, 1, | ||||
|       [if you have the Kerberos4 libraries (including -ldes)]) | ||||
|  | ||||
|       dnl substitute it too! | ||||
|       KRB4_ENABLED=1 | ||||
|       AC_SUBST(KRB4_ENABLED) | ||||
|  | ||||
|       curl_krb4_msg="enabled" | ||||
|  | ||||
|       dnl the krb4 stuff needs a strlcpy() | ||||
|       AC_CHECK_FUNCS(strlcpy) | ||||
|  | ||||
|     ]) | ||||
|   ]) | ||||
| else | ||||
|   AC_MSG_RESULT(no) | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for FBopenssl(SPNEGO) libraries | ||||
| dnl ********************************************************************** | ||||
| @@ -1268,26 +1173,26 @@ dnl ********************************************************************** | ||||
| dnl Check for GSS-API libraries | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl check for gss stuff in the /usr as default | ||||
| dnl check for GSS-API stuff in the /usr as default | ||||
|  | ||||
| GSSAPI_ROOT="/usr" | ||||
| AC_ARG_WITH(gssapi-includes, | ||||
|   AC_HELP_STRING([--with-gssapi-includes=DIR], | ||||
|                  [Specify location of GSSAPI header]), | ||||
|                  [Specify location of GSS-API headers]), | ||||
|   [ GSSAPI_INCS="-I$withval" | ||||
|     want_gss="yes" ] | ||||
| ) | ||||
|  | ||||
| AC_ARG_WITH(gssapi-libs, | ||||
|   AC_HELP_STRING([--with-gssapi-libs=DIR], | ||||
|                  [Specify location of GSSAPI libs]), | ||||
|                  [Specify location of GSS-API libs]), | ||||
|   [ GSSAPI_LIB_DIR="-L$withval" | ||||
|     want_gss="yes" ] | ||||
| ) | ||||
|  | ||||
| AC_ARG_WITH(gssapi, | ||||
|   AC_HELP_STRING([--with-gssapi=DIR], | ||||
|                  [Where to look for GSSAPI]), [ | ||||
|                  [Where to look for GSS-API]), [ | ||||
|   GSSAPI_ROOT="$withval" | ||||
|   if test x"$GSSAPI_ROOT" != xno; then | ||||
|     want_gss="yes" | ||||
| @@ -1299,7 +1204,7 @@ AC_ARG_WITH(gssapi, | ||||
| ]) | ||||
|  | ||||
| save_CPPFLAGS="$CPPFLAGS" | ||||
| AC_MSG_CHECKING([if GSSAPI support is requested]) | ||||
| AC_MSG_CHECKING([if GSS-API support is requested]) | ||||
| if test x"$want_gss" = xyes; then | ||||
|   AC_MSG_RESULT(yes) | ||||
|  | ||||
| @@ -1316,7 +1221,7 @@ if test x"$want_gss" = xyes; then | ||||
|   AC_CHECK_HEADER(gss.h, | ||||
|     [ | ||||
|       dnl found in the given dirs | ||||
|       AC_DEFINE(HAVE_GSSGNU, 1, [if you have the GNU gssapi libraries]) | ||||
|       AC_DEFINE(HAVE_GSSGNU, 1, [if you have GNU GSS]) | ||||
|       gnu_gss=yes | ||||
|     ], | ||||
|     [ | ||||
| @@ -1337,19 +1242,19 @@ AC_INCLUDES_DEFAULT | ||||
|         AC_CHECK_HEADER(gssapi.h, | ||||
|             [ | ||||
|               dnl found | ||||
|               AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries]) | ||||
|               AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have Heimdal]) | ||||
|             ], | ||||
|             [ | ||||
|               dnl no header found, disabling GSS | ||||
|               want_gss=no | ||||
|               AC_MSG_WARN(disabling GSSAPI since no header files was found) | ||||
|               AC_MSG_WARN(disabling GSS-API support since no header files were found) | ||||
|             ] | ||||
|           ) | ||||
|       else | ||||
|         dnl MIT found | ||||
|         AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries]) | ||||
|         dnl check if we have a really old MIT kerberos (<= 1.2) | ||||
|         AC_MSG_CHECKING([if gssapi headers declare GSS_C_NT_HOSTBASED_SERVICE]) | ||||
|         AC_DEFINE(HAVE_GSSMIT, 1, [if you have MIT Kerberos]) | ||||
|         dnl check if we have a really old MIT Kerberos version (<= 1.2) | ||||
|         AC_MSG_CHECKING([if GSS-API headers declare GSS_C_NT_HOSTBASED_SERVICE]) | ||||
|         AC_COMPILE_IFELSE([ | ||||
|           AC_LANG_PROGRAM([[ | ||||
| #include <gssapi/gssapi.h> | ||||
| @@ -1367,7 +1272,7 @@ AC_INCLUDES_DEFAULT | ||||
|         ],[ | ||||
|           AC_MSG_RESULT([no]) | ||||
|           AC_DEFINE(HAVE_OLD_GSSMIT, 1, | ||||
|             [if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE]) | ||||
|             [if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE]) | ||||
|         ]) | ||||
|       fi | ||||
|     ] | ||||
| @@ -1376,9 +1281,9 @@ else | ||||
|   AC_MSG_RESULT(no) | ||||
| fi | ||||
| if test x"$want_gss" = xyes; then | ||||
|   AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries]) | ||||
|   AC_DEFINE(HAVE_GSSAPI, 1, [if you have GSS-API libraries]) | ||||
|  | ||||
|   curl_gss_msg="enabled (MIT/Heimdal)" | ||||
|   curl_gss_msg="enabled (MIT Kerberos/Heimdal)" | ||||
|  | ||||
|   if test -n "$gnu_gss"; then | ||||
|     curl_gss_msg="enabled (GNU GSS)" | ||||
| @@ -1389,6 +1294,12 @@ if test x"$want_gss" = xyes; then | ||||
|      *-*-darwin*) | ||||
|         LIBS="-lgssapi_krb5 -lresolv $LIBS" | ||||
|         ;; | ||||
|      *-hp-hpux*) | ||||
|         if test "$GSSAPI_ROOT" != "yes"; then | ||||
|            LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff" | ||||
|         fi | ||||
|         LIBS="-lgss $LIBS" | ||||
|         ;; | ||||
|      *) | ||||
|         if test -f "$GSSAPI_ROOT/bin/krb5-config"; then | ||||
|            dnl krb5-config doesn't have --libs-only-L or similar, put everything | ||||
| @@ -1405,7 +1316,14 @@ if test x"$want_gss" = xyes; then | ||||
|      esac | ||||
|   else | ||||
|      LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" | ||||
|      case $host in | ||||
|      *-hp-hpux*) | ||||
|         LIBS="-lgss $LIBS" | ||||
|         ;; | ||||
|      *) | ||||
|         LIBS="-lgssapi $LIBS" | ||||
|         ;; | ||||
|      esac | ||||
|   fi | ||||
| else | ||||
|   CPPFLAGS="$save_CPPFLAGS" | ||||
| @@ -1676,7 +1594,10 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then | ||||
|                     ENGINE_cleanup \ | ||||
|                     CRYPTO_cleanup_all_ex_data \ | ||||
|                     SSL_get_shutdown \ | ||||
|                     SSLv2_client_method ) | ||||
|                     SSLv2_client_method \ | ||||
|                     SSL_CTX_set_next_proto_select_cb \ | ||||
|                     SSL_CTX_set_alpn_protos \ | ||||
|                     SSL_CTX_set_alpn_select_cb ) | ||||
|  | ||||
|     dnl Make an attempt to detect if this is actually yassl's headers and | ||||
|     dnl OpenSSL emulation layer. We still leave everything else believing | ||||
| @@ -2079,6 +2000,9 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then | ||||
|     if test "x$USE_CYASSL" = "xyes"; then | ||||
|       AC_MSG_NOTICE([detected CyaSSL]) | ||||
|  | ||||
|       dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined! | ||||
|       AC_CHECK_SIZEOF(long long) | ||||
|  | ||||
|       LIBS="-lcyassl -lm $LIBS" | ||||
|  | ||||
|       if test -n "$cyassllib"; then | ||||
| @@ -2163,8 +2087,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then | ||||
|          CPPFLAGS="$CPPFLAGS $addcflags" | ||||
|       fi | ||||
|  | ||||
|       dnl The function PK11_CreateGenericObject is needed to load libnsspem.so | ||||
|       AC_CHECK_LIB(nss3, PK11_CreateGenericObject, | ||||
|       dnl The function SSL_VersionRangeSet() is needed to enable TLS > 1.0 | ||||
|       AC_CHECK_LIB(nss3, SSL_VersionRangeSet, | ||||
|        [ | ||||
|        AC_DEFINE(USE_NSS, 1, [if NSS is enabled]) | ||||
|        AC_SUBST(USE_NSS, [1]) | ||||
| @@ -2180,14 +2104,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then | ||||
|       if test "x$USE_NSS" = "xyes"; then | ||||
|         AC_MSG_NOTICE([detected NSS version $version]) | ||||
|  | ||||
|         dnl NSS_InitContext() was introduced in NSS 3.12.5 and helps to prevent | ||||
|         dnl collisions on NSS initialization/shutdown with other libraries | ||||
|         AC_CHECK_FUNC(NSS_InitContext, | ||||
|         [ | ||||
|           AC_DEFINE(HAVE_NSS_INITCONTEXT, 1, [if you have the NSS_InitContext function]) | ||||
|           AC_SUBST(HAVE_NSS_INITCONTEXT, [1]) | ||||
|         ]) | ||||
|  | ||||
|         dnl when shared libs were found in a path that the run-time | ||||
|         dnl linker doesn't search through, we need to add it to | ||||
|         dnl LD_LIBRARY_PATH to prevent further configure tests to fail | ||||
| @@ -2553,19 +2469,19 @@ AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shar | ||||
|         AC_MSG_RESULT(yes) | ||||
|         if test "x$OPENSSL_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="OPENSSL_" | ||||
|         elif test "x$GNUTLS_ENABLED" == "x1"; then | ||||
|         elif test "x$GNUTLS_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="GNUTLS_" | ||||
|         elif test "x$NSS_ENABLED" == "x1"; then | ||||
|         elif test "x$NSS_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="NSS_" | ||||
|         elif test "x$POLARSSL_ENABLED" == "x1"; then | ||||
|         elif test "x$POLARSSL_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="POLARSSL_" | ||||
|         elif test "x$CYASSL_ENABLED" == "x1"; then | ||||
|         elif test "x$CYASSL_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="CYASSL_" | ||||
|         elif test "x$AXTLS_ENABLED" == "x1"; then | ||||
|         elif test "x$AXTLS_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="AXTLS_" | ||||
|         elif test "x$WINSSL_ENABLED" == "x1"; then | ||||
|         elif test "x$WINSSL_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="WINSSL_" | ||||
|         elif test "x$DARWINSSL_ENABLED" == "x1"; then | ||||
|         elif test "x$DARWINSSL_ENABLED" = "x1"; then | ||||
|           versioned_symbols_flavour="DARWINSSL_" | ||||
|         else | ||||
|           versioned_symbols_flavour="" | ||||
| @@ -2808,6 +2724,92 @@ dnl http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \ | ||||
| dnl genprogc/thread_quick_ref.htm | ||||
|  | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for nghttp2 | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| AC_MSG_CHECKING([whether to build with nghttp2]) | ||||
| OPT_H2="no" | ||||
| AC_ARG_WITH(nghttp2, | ||||
| AC_HELP_STRING([--with-nghttp2=PATH],[Enable nghttp2 usage]) | ||||
| AC_HELP_STRING([--without-nghttp2],[Disable nghttp2 usage]), | ||||
|   [OPT_H2=$withval]) | ||||
| case "$OPT_H2" in | ||||
|   no) | ||||
|     dnl --without-nghttp2 option used | ||||
|     want_idn="no" | ||||
|     AC_MSG_RESULT([no]) | ||||
|     ;; | ||||
|   default) | ||||
|     dnl configure option not specified | ||||
|     want_h2="no" | ||||
|     want_h2_path="default" | ||||
|     AC_MSG_RESULT([no]) | ||||
|     ;; | ||||
|   yes) | ||||
|     dnl --with-nghttp2 option used without path | ||||
|     want_h2="yes" | ||||
|     want_h2_path="" | ||||
|     AC_MSG_RESULT([yes]) | ||||
|     ;; | ||||
|   *) | ||||
|     dnl --with-nghttp2 option used with path | ||||
|     want_h2="yes" | ||||
|     want_h2_path="$withval" | ||||
|     AC_MSG_RESULT([yes ($withval)]) | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| curl_h2_msg="disabled (--with-nghttp2)" | ||||
| if test X"$OPT_H2" != Xno; then | ||||
|   dnl backup the pre-librtmp variables | ||||
|   CLEANLDFLAGS="$LDFLAGS" | ||||
|   CLEANCPPFLAGS="$CPPFLAGS" | ||||
|   CLEANLIBS="$LIBS" | ||||
|  | ||||
|   h2pcdir=${want_h2_path}/lib/pkgconfig | ||||
|   CURL_CHECK_PKGCONFIG(libnghttp2, $h2pcdir) | ||||
|  | ||||
|   if test "$PKGCONFIG" != "no" ; then | ||||
|     LIB_H2=`CURL_EXPORT_PCDIR([$h2pcdir]) | ||||
|       $PKGCONFIG --libs-only-l libnghttp2` | ||||
|     AC_MSG_NOTICE([-l is $LIB_H2]) | ||||
|  | ||||
|     CPP_H2=`CURL_EXPORT_PCDIR([$h2pcdir]) dnl | ||||
|       $PKGCONFIG --cflags-only-I libnghttp2` | ||||
|     AC_MSG_NOTICE([-I is $CPP_H2]) | ||||
|  | ||||
|     LD_H2=`CURL_EXPORT_PCDIR([$h2pcdir]) | ||||
|       $PKGCONFIG --libs-only-L libnghttp2` | ||||
|     AC_MSG_NOTICE([-L is $LD_H2]) | ||||
|  | ||||
|   else | ||||
|     dnl To avoid link errors, we do not allow --libnghttp2 without | ||||
|     dnl a pkgconfig file | ||||
|     AC_MSG_ERROR([--with-nghttp2 was specified but could not find libnghttp2 pkg-config file.]) | ||||
|   fi | ||||
|  | ||||
|   LDFLAGS="$LDFLAGS $LD_H2" | ||||
|   CPPFLAGS="$CPPFLAGS $CPP_H2" | ||||
|   LIBS="$LIB_H2 $LIBS" | ||||
|  | ||||
|   AC_CHECK_LIB(nghttp2, nghttp2_session_client_new, | ||||
|     [ | ||||
|      AC_CHECK_HEADERS(nghttp2/nghttp2.h, | ||||
|         curl_h2_msg="enabled (nghttp2)" | ||||
|         NGHTTP2_ENABLED=1 | ||||
|         AC_DEFINE(USE_NGHTTP2, 1, [if nghttp2 is in use]) | ||||
|         AC_SUBST(USE_NGHTTP2, [1]) | ||||
|      ) | ||||
|     ], | ||||
|       dnl not found, revert back to clean variables | ||||
|       LDFLAGS=$CLEANLDFLAGS | ||||
|       CPPFLAGS=$CLEANCPPFLAGS | ||||
|       LIBS=$CLEANLIBS | ||||
|   ) | ||||
|  | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Back to "normal" configuring | ||||
| dnl ********************************************************************** | ||||
| @@ -3247,6 +3249,7 @@ AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]), | ||||
|   no) | ||||
|        AC_MSG_RESULT(no) | ||||
|        AC_DEFINE(CURL_DISABLE_CRYPTO_AUTH, 1, [to disable cryptographic authentication]) | ||||
|        CURL_DISABLE_CRYPTO_AUTH=1 | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
| @@ -3365,9 +3368,6 @@ if test "x$USE_SSLEAY" = "x1"; then | ||||
| elif test -n "$SSL_ENABLED"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" | ||||
| fi | ||||
| if test "@KRB4_ENABLED@" = "x1"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES KRB4" | ||||
| fi | ||||
| if test "x$IPV6_ENABLED" = "x1"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES IPv6" | ||||
| fi | ||||
| @@ -3383,7 +3383,8 @@ fi | ||||
| if test "x$USE_WINDOWS_SSPI" = "x1"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES SSPI" | ||||
| fi | ||||
| if test "x$CURL_DISABLE_HTTP" != "x1"; then | ||||
| if test "x$CURL_DISABLE_HTTP" != "x1" -a \ | ||||
| 	"x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then | ||||
|   if test "x$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ | ||||
|       -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ | ||||
|       -o "x$DARWINSSL_ENABLED" = "x1"; then | ||||
| @@ -3397,6 +3398,10 @@ if test "x$USE_TLS_SRP" = "x1"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP" | ||||
| fi | ||||
|  | ||||
| if test "x$USE_NGHTTP2" = "x1"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2" | ||||
| fi | ||||
|  | ||||
| AC_SUBST(SUPPORT_FEATURES) | ||||
|  | ||||
| dnl For supported protocols in pkg-config file | ||||
| @@ -3531,6 +3536,8 @@ AC_OUTPUT | ||||
|  | ||||
| CURL_GENERATE_CONFIGUREHELP_PM | ||||
|  | ||||
| XC_AMEND_DISTCLEAN([lib src tests/unit tests/server tests/libtest docs/examples]) | ||||
|  | ||||
| AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|  | ||||
|   curl version:     ${CURLVERSION} | ||||
| @@ -3540,8 +3547,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|   SSL support:      ${curl_ssl_msg} | ||||
|   SSH support:      ${curl_ssh_msg} | ||||
|   zlib support:     ${curl_zlib_msg} | ||||
|   krb4 support:     ${curl_krb4_msg} | ||||
|   GSSAPI support:   ${curl_gss_msg} | ||||
|   GSS-API support:  ${curl_gss_msg} | ||||
|   SPNEGO support:   ${curl_spnego_msg} | ||||
|   TLS-SRP support:  ${curl_tls_srp_msg} | ||||
|   resolver:         ${curl_res_msg} | ||||
| @@ -3559,6 +3565,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|   RTSP support:     ${curl_rtsp_msg} | ||||
|   RTMP support:     ${curl_rtmp_msg} | ||||
|   metalink support: ${curl_mtlnk_msg} | ||||
|   HTTP2 support:    ${curl_h2_msg} | ||||
|   Protocols:        ${SUPPORT_PROTOCOLS} | ||||
| ]) | ||||
|  | ||||
|   | ||||
							
								
								
									
										65
									
								
								contributors.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										65
									
								
								contributors.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| #!/bin/sh | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 2013-2014, 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 | ||||
| # awk them into RELEASE-NOTES format | ||||
| git log $start..HEAD | \ | ||||
| egrep '(Author|Commit|by):' | \ | ||||
| cut -d: -f2- | \ | ||||
| cut '-d<' -f1 | \ | ||||
| sed -e 's/^ //' -e 's/ $//g' | \ | ||||
| grep ' ' | \ | ||||
| sort -u | | ||||
| awk '{ | ||||
|  num++; | ||||
|  n = sprintf("%s%s%s,", n, length(n)?" ":"", $0); | ||||
|  #print n; | ||||
|  if(length(n) > 78) { | ||||
|    printf("  %s\n", p); | ||||
|    n=sprintf("%s,", $0); | ||||
|  } | ||||
|  p=n; | ||||
|  | ||||
| } | ||||
|  | ||||
|  END { | ||||
|    printf("  %s\n", p); | ||||
|    printf("  (%d contributors)\n", num); | ||||
|  } | ||||
|  | ||||
| ' | ||||
| @@ -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 | ||||
|   | ||||
| @@ -59,7 +59,7 @@ GnuTLS | ||||
|  OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl | ||||
|  without including any Original BSD licensed code. | ||||
|  | ||||
|  I believe Debian is the first (only?) distro that provides libcurl/GnutTLS | ||||
|  I believe Debian is the first (only?) distro that provides libcurl/GnuTLS | ||||
|  packages. | ||||
|  | ||||
| yassl | ||||
| @@ -72,20 +72,20 @@ GnuTLS vs OpenSSL vs yassl | ||||
|  | ||||
|  While these three libraries offer similar features, they are not equal. | ||||
|  libcurl does not (yet) offer a standardized stable ABI if you decide to | ||||
|  switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS | ||||
|  switch from using libcurl-openssl to libcurl-gnutls or vice-versa. The GnuTLS | ||||
|  and yassl support is very recent in libcurl and it has not been tested nor | ||||
|  used very extensively, while the OpenSSL equivalent code has been used and | ||||
|  thus matured since 1999. | ||||
|  | ||||
|  GnuTLS | ||||
|    - LGPL licensened | ||||
|    - LGPL licensed | ||||
|    - supports SRP | ||||
|    - lacks SSLv2 support | ||||
|    - lacks MD2 support (used by at least some CA certs) | ||||
|    - lacks the crypto functions libcurl uses for NTLM | ||||
|  | ||||
|  OpenSSL | ||||
|    - Original BSD licensened | ||||
|    - Original BSD licensed | ||||
|    - lacks SRP | ||||
|    - supports SSLv2 | ||||
|    - older and more widely used | ||||
|   | ||||
							
								
								
									
										104
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -202,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 | ||||
|   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? | ||||
|  | ||||
| @@ -263,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. | ||||
| @@ -424,7 +422,7 @@ FAQ | ||||
|  | ||||
|   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 | ||||
|   WinSSL (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 | ||||
|  | ||||
| @@ -620,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 | ||||
|   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? | ||||
|  | ||||
| @@ -644,23 +642,27 @@ 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 | ||||
|  | ||||
|   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. | ||||
|  | ||||
|   A client certificate is always used together with a private key, and the | ||||
|   private key has a pass phrase that protects it. | ||||
|  | ||||
|   - 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. | ||||
|   SERVER CERTIFICATE | ||||
|  | ||||
|   - 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 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 | ||||
| @@ -669,9 +671,9 @@ FAQ | ||||
|   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. | ||||
|   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? | ||||
|  | ||||
| @@ -794,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? | ||||
|  | ||||
| @@ -968,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 | ||||
| @@ -1270,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? | ||||
|  | ||||
|   | ||||
| @@ -55,7 +55,7 @@ HTTP | ||||
|  - reads/writes the netscape cookie file format | ||||
|  - custom headers (replace/remove internally generated headers) | ||||
|  - custom user-agent string | ||||
|  - custom referer string | ||||
|  - custom referrer string | ||||
|  - range | ||||
|  - proxy authentication | ||||
|  - time conditions | ||||
| @@ -161,8 +161,8 @@ IMAP | ||||
|  - 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 | ||||
|  - select a mailbox with support for verifying the UIDVALIDITY | ||||
|  - fetch e-mails with support for specifying 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 | ||||
| @@ -176,14 +176,14 @@ IMAPS (*1) | ||||
| FOOTNOTES | ||||
| ========= | ||||
|  | ||||
|   *1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, schannel (native | ||||
|   *1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, WinSSL (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 | ||||
|   *4 = requires FBopenssl | ||||
|   *5 = requires a krb4 library, such as the MIT one or similar | ||||
|   *6 = requires c-ares | ||||
|   *7 = requires OpenSSL, NSS, qssl, schannel or Secure Transport; GnuTLS, for | ||||
|   *7 = requires OpenSSL, NSS, qssl, WinSSL or Secure Transport; GnuTLS, for | ||||
|        example, only supports SSLv3 and TLSv1 | ||||
|   *8 = requires libssh2 | ||||
|   *9 = requires OpenSSL, GnuTLS, NSS, yassl, Secure Transport or SSPI (native | ||||
|   | ||||
							
								
								
									
										23
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -115,18 +115,6 @@ UNIX | ||||
|  | ||||
|        ./configure --disable-thread | ||||
|  | ||||
|      To build curl with kerberos4 support enabled, curl requires the krb4 libs | ||||
|      and headers installed. You can then use a set of options to tell | ||||
|      configure where those are: | ||||
|  | ||||
|           --with-krb4-includes[=DIR]   Specify location of kerberos4 headers | ||||
|           --with-krb4-libs[=DIR]       Specify location of kerberos4 libs | ||||
|           --with-krb4[=DIR]            where to look for Kerberos4 | ||||
|  | ||||
|      In most cases, /usr/athena is the install prefix and then it works with | ||||
|  | ||||
|        ./configure --with-krb4=/usr/athena | ||||
|  | ||||
|      If you're a curl developer and use gcc, you might want to enable more | ||||
|      debug options with the --enable-debug option. | ||||
|  | ||||
| @@ -993,6 +981,7 @@ REDUCING SIZE | ||||
|      --disable-verbose (eliminates debugging strings and error code strings) | ||||
|      --enable-hidden-symbols (eliminates unneeded symbols in the shared library) | ||||
|      --without-libidn (disables support for the libidn DNS library) | ||||
|      --without-librtmp (disables support for RTMP) | ||||
|      --without-ssl (disables support for SSL/TLS) | ||||
|      --without-zlib (disables support for on-the-fly decompression) | ||||
|  | ||||
| @@ -1011,9 +1000,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 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). | ||||
|    libcurl library for i386 Linux platforms that is only 114 KiB in size, and | ||||
|    an FTP-only library that is 115 KiB in size (as of libcurl version 7.35.0, | ||||
|    using gcc 4.8.2). | ||||
|  | ||||
|    You may find that statically linking libcurl to your application will | ||||
|    result in a lower total size than dynamically linking. | ||||
| @@ -1025,7 +1014,6 @@ REDUCING SIZE | ||||
|    command line.  Following is a list of appropriate key words: | ||||
|  | ||||
|      --disable-cookies          !cookies | ||||
|      --disable-crypto-auth      !HTTP\ Digest\ auth !HTTP\ proxy\ Digest\ auth | ||||
|      --disable-manual           !--manual | ||||
|      --disable-proxy            !HTTP\ proxy !proxytunnel !SOCKS4 !SOCKS5 | ||||
|  | ||||
| @@ -1045,7 +1033,7 @@ 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 iOS | ||||
|         - Cell Linux | ||||
| @@ -1116,6 +1104,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/ | ||||
|   | ||||
| @@ -71,7 +71,7 @@ Command Line CMake | ||||
|  | ||||
|     $ make install | ||||
|  | ||||
|     (The teste suit does not work with the cmake build) | ||||
|     (The test suite does not work with the cmake build) | ||||
|  | ||||
| ccmake | ||||
| ========= | ||||
|   | ||||
							
								
								
									
										122
									
								
								docs/INTERNALS
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								docs/INTERNALS
									
									
									
									
									
								
							| @@ -43,8 +43,9 @@ Portability | ||||
|  openldap     2.0 | ||||
|  MIT krb5 lib 1.2.4 | ||||
|  qsossl       V5R3M0 | ||||
|  NSS          3.12.x | ||||
|  NSS          3.14.x | ||||
|  axTLS        1.2.7 | ||||
|  PolarSSL     1.3.0 | ||||
|  Heimdal      ? | ||||
|  | ||||
|  On systems where configure runs, we aim at working on them all - if they have | ||||
| @@ -111,6 +112,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 | ||||
| @@ -135,16 +139,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). | ||||
| @@ -160,10 +166,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 | ||||
| @@ -182,10 +185,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 | ||||
| @@ -207,33 +209,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 connections. | ||||
|  | ||||
|  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) | ||||
|  | ||||
| @@ -316,48 +296,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 | ||||
|    connection 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 | ||||
| ============= | ||||
| @@ -368,10 +338,10 @@ SSL libraries | ||||
|  in future libcurl versions. | ||||
|  | ||||
|  To deal with this internally in the best way possible, we have a generic SSL | ||||
|  function API as provided by the sslgen.[ch] system, and they are the only SSL | ||||
|  functions we must use from within libcurl. sslgen is then crafted to use the | ||||
|  function API as provided by the vtls.[ch] system, and they are the only SSL | ||||
|  functions we must use from within libcurl. vtls is then crafted to use the | ||||
|  appropriate lower-level function calls to whatever SSL library that is in | ||||
|  use. | ||||
|  use. For example vtls/openssl.[ch] for the OpenSSL library. | ||||
|  | ||||
| Library Symbols | ||||
| =============== | ||||
| @@ -408,12 +378,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/tool_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. | ||||
|  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 | ||||
| @@ -425,8 +395,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,31 +3,61 @@ 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! | ||||
|  | ||||
| 87. -J/--remote-header-name doesn't decode %-encoded file names. RFC6266 | ||||
|   details how it should be done. The can of worm is basically that we have no | ||||
|   charset handling in curl and ascii >=128 is a challenge for us. Not to | ||||
|   mention that decoding also means that we need to check for nastiness that is | ||||
|   attempted, like "../" sequences and the like. Probably everything to the left | ||||
|   of any embedded slashes should be cut off. | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1294 | ||||
|  | ||||
| 86. The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 | ||||
|   and SMTP if a failure occurs during the authentication phase of a | ||||
|   connection. | ||||
|  | ||||
| 85. Wrong STARTTRANSFER timer accounting for POST requests | ||||
|   Timer works fine with GET requests, but while using POST the time for | ||||
|   CURLINFO_STARTTRANSFER_TIME is wrong. While using POST | ||||
|   CURLINFO_STARTTRANSFER_TIME minus CURLINFO_PRETRANSFER_TIME is near to zero | ||||
|   every time. | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1213 | ||||
|  | ||||
| 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 | ||||
| 81. When using -J (with -O), automatically 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=3439999 | ||||
|   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=3438362 | ||||
|   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 | ||||
|   "abuses" the underlying connection re-use system and if connections are | ||||
| @@ -39,12 +69,12 @@ may have been fixed since this was written! | ||||
|   option as for all other operating systems. | ||||
|  | ||||
| 75. NTLM authentication involving unicode user name or password only works | ||||
|   properly if built with UNICODE defined together with the schannel/winssl | ||||
|   properly if built with UNICODE defined together with the WinSSL/schannel | ||||
|   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 | ||||
|   The WinSSL/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 | ||||
| @@ -52,7 +82,7 @@ may have been fixed since this was written! | ||||
|   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 | ||||
| @@ -70,7 +100,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 | ||||
| @@ -96,19 +126,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 | ||||
| @@ -132,12 +155,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 | ||||
| @@ -150,7 +173,7 @@ may have been fixed since this was written! | ||||
|  | ||||
| 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 | ||||
| @@ -165,13 +188,12 @@ 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: | ||||
|   B) libcurl doesn't support FTPS over a SOCKS proxy. | ||||
| @@ -180,12 +202,6 @@ may have been fixed since this was written! | ||||
|   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: | ||||
| @@ -223,7 +239,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 | ||||
|   specific 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 connection 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 entire 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 issuing 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 during 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. | ||||
| @@ -105,7 +105,7 @@ MAIL ETIQUETTE | ||||
|   No matter what, we NEVER EVER respond to trolls or spammers on the list. If | ||||
|   you believe the list admin should do something particular, contact him/her | ||||
|   off-list. The subject will be taken care of as good as possible to prevent | ||||
|   repeated offences, but responding on the list to such messages never lead to | ||||
|   repeated offenses, but responding on the list to such messages never lead to | ||||
|   anything good and only puts the light even more on the offender: which was | ||||
|   the entire purpose of it getting to the list in the first place. | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2014, 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 | ||||
| @@ -22,7 +22,8 @@ | ||||
|  | ||||
| AUTOMAKE_OPTIONS = foreign no-dependencies | ||||
|  | ||||
| man_MANS = curl.1 curl-config.1 mk-ca-bundle.1 | ||||
| man_MANS = curl.1 curl-config.1 | ||||
| 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 | ||||
|  | ||||
| @@ -36,7 +37,8 @@ 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 HTTP-COOKIES | ||||
|  MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS SECURITY RELEASE-PROCEDURE  \ | ||||
|  SSL-PROBLEMS | ||||
|  | ||||
| MAN2HTML= roffit < $< >$@ | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ README.netware | ||||
|  | ||||
|   Curl has been successfully compiled with gcc / nlmconv on different flavours | ||||
|   of Linux as well as with the official Metrowerks CodeWarrior compiler. | ||||
|   While not being the main development target, a continously growing share of | ||||
|   While not being the main development target, a continuously growing share of | ||||
|   curl users are NetWare-based, specially also consuming the lib from PHP. | ||||
|  | ||||
|   The unix-style man pages are tricky to read on windows, so therefore are all | ||||
|   | ||||
							
								
								
									
										53
									
								
								docs/RELEASE-PROCEDURE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								docs/RELEASE-PROCEDURE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
|                             | (__| |_| |  _ <| |___ | ||||
|                              \___|\___/|_| \_\_____| | ||||
|  | ||||
| curl release procedure - how to do a release | ||||
| ============================================ | ||||
|  | ||||
| [in the source code repo] | ||||
|  | ||||
| - edit RELEASE-NOTES to be accurate | ||||
|  | ||||
| - update docs/THANKS | ||||
|  | ||||
| - make sure all relevant changes are committed on the master branch | ||||
|  | ||||
| - tag the git repo in this style: 'git tag -a curl-7_34_0'. -a annotates the | ||||
|   tag and we use underscores instead of dots in the version number.  | ||||
|     | ||||
| - run "./maketgz 7.34.0" to build the release tarballs. It is important that | ||||
|   you run this on a machine with the correct set of autotools etc installed | ||||
|   as this is what then will be shipped and used by most users on *nix like | ||||
|   systems. | ||||
|  | ||||
| - push the git commits and the new tag | ||||
|  | ||||
| - gpg sign the 4 tarballs as maketgz suggests | ||||
|  | ||||
| - upload the 8 resulting files to the primary download directory | ||||
|  | ||||
| [data in the curl-www repo] | ||||
|  | ||||
| - edit Makefile (version number and date), | ||||
|   _newslog.html (announce the new release) and | ||||
|   _changes.html (insert changes+bugfixes from RELEASE-NOTES) | ||||
|  | ||||
| - commit all local changes | ||||
|  | ||||
| - tag the repo with the same tag as used for the source repo | ||||
|  | ||||
| - make sure all relevant changes are committed and pushed on the master branch | ||||
|  | ||||
|   (the web site then updates its contents automatically) | ||||
|  | ||||
| [inform] | ||||
|  | ||||
| - send an email to curl-users, curl-announce and curl-library. Insert the | ||||
|   RELEASE-NOTES into the mail. | ||||
|  | ||||
| [celebrate] | ||||
|  | ||||
| - suitable beverage intake is encouraged for the festivities | ||||
							
								
								
									
										91
									
								
								docs/SECURITY
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								docs/SECURITY
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
|                             | (__| |_| |  _ <| |___ | ||||
|                              \___|\___/|_| \_\_____| | ||||
|  | ||||
| CURL SECURITY FOR DEVELOPERS | ||||
|  | ||||
| This document is intended to provide guidance to curl developers on how | ||||
| security vulnerabilities should be handled. | ||||
|  | ||||
| PUBLISHING INFORMATION | ||||
|  | ||||
| All known and public curl or libcurl related vulnerabilities are listed at | ||||
| http://curl.haxx.se/docs/security.html | ||||
|  | ||||
| Security vulnerabilities should not be entered in the project's public bug | ||||
| tracker unless the necessary configuration is in place to limit access to the | ||||
| issue to only the reporter and the project's security team. | ||||
|  | ||||
| VULNERABILITY HANDLING | ||||
|  | ||||
| The typical process for handling a new security vulnerability is as follows. | ||||
|  | ||||
| No information should be made public about a vulnerability until it is | ||||
| formally announced at the end of this process. That means, for example that a | ||||
| bug tracker entry must NOT be created to track the issue since that will make | ||||
| the issue public and it should not be discussed on any of the project's public | ||||
| mailing lists. Also messages associated with any commits should not make | ||||
| any reference to the security nature of the commit if done prior to the public | ||||
| announcement. | ||||
|  | ||||
| - The person discovering the issue, the reporter, reports the vulnerability | ||||
|   privately to curl-security@haxx.se. That's an email alias that reaches a | ||||
|   handful of selected and trusted people. | ||||
|  | ||||
| - Messages that do not relate to the reporting or managing of an undisclosed | ||||
|   security vulnerability in curl or libcurl are ignored and no further action | ||||
|   is required. | ||||
|  | ||||
| - A person in the security team sends an e-mail to the original reporter to | ||||
|   acknowledge the report. | ||||
|  | ||||
| - The security team investigates the report and either rejects it or accepts | ||||
|   it. | ||||
|  | ||||
| - If the report is rejected, the team writes to the reporter to explain why. | ||||
|  | ||||
| - If the report is accepted, the team writes to the reporter to let him/her | ||||
|   know it is accepted and that they are working on a fix. | ||||
|  | ||||
| - The security team discusses the problem, works out a fix, considers the | ||||
|   impact of the problem and suggests a release schedule. This discussion | ||||
|   should involve the reporter as much as possible. | ||||
|  | ||||
| - The release of the information should be "as soon as possible" and is most | ||||
|   often synced with an upcoming release that contains the fix. If the | ||||
|   reporter, or anyone else, thinks the next planned release is too far away | ||||
|   then a separate earlier release for security reasons should be considered. | ||||
|  | ||||
| - Write a security advisory draft about the problem that explains what the | ||||
|   problem is, its impact, which versions it affects, solutions or | ||||
|   workarounds, when the release is out and make sure to credit all | ||||
|   contributors properly. | ||||
|  | ||||
| - Request a CVE number from distros@openwall.org[1] when also informing and | ||||
|   preparing them for the upcoming public security vulnerability announcement - | ||||
|   attach the advisory draft for information. Note that 'distros' won't accept | ||||
|   an embargo longer than 19 days. | ||||
|  | ||||
| - Update the "security advisory" with the CVE number. | ||||
|  | ||||
| - The security team commits the fix in a private branch. The commit message | ||||
|   should ideally contain the CVE number. This fix is usually also distributed | ||||
|   to the 'distros' mailing list to allow them to use the fix prior to the | ||||
|   public announcement. | ||||
|  | ||||
| - At the day of the next release, the private branch is merged into the master | ||||
|   branch and pushed. Once pushed, the information is accessible to the public | ||||
|   and the actual release should follow suit immediately afterwards. | ||||
|  | ||||
| - The project team creates a release that includes the fix. | ||||
|  | ||||
| - The project team announces the release and the vulnerability to the world in | ||||
|   the same manner we always announce releases. It gets sent to the | ||||
|   curl-announce, curl-library and curl-users mailing lists. | ||||
|  | ||||
| - The security web page on the web site should get the new vulnerability | ||||
|   mentioned. | ||||
|  | ||||
| [1] = http://oss-security.openwall.org/wiki/mailing-lists/distros | ||||
							
								
								
									
										67
									
								
								docs/SSL-PROBLEMS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								docs/SSL-PROBLEMS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
|                             | (__| |_| |  _ <| |___ | ||||
|                              \___|\___/|_| \_\_____| | ||||
|  | ||||
| SSL problems | ||||
|  | ||||
|   First, let's establish that we often refer to TLS and SSL interchangeably as | ||||
|   SSL here. The current protocol is called TLS, it was called SSL a long time | ||||
|   ago. | ||||
|  | ||||
|   There are several known reasons why a connection that involves SSL might | ||||
|   fail. This is a document that attempts to details the most common ones and | ||||
|   how to mitigate them. | ||||
|  | ||||
| CA certs | ||||
|  | ||||
|   CA certs are used to digitally verify the server's certificate. You need a | ||||
|   "ca bundle" for this. See lots of more details on this in the SSLCERTS | ||||
|   document. | ||||
|  | ||||
| CA bundle missing intermediate certificates | ||||
|  | ||||
|   When using said CA bundle to verify a server cert, you will experience | ||||
|   problems if your CA cert does not have the certificates for the | ||||
|   intermediates in the whole trust chain. | ||||
|  | ||||
| SSL version | ||||
|  | ||||
|   Some broken servers fail to support the protocol negotiation properly that | ||||
|   SSL servers are supposed to handle. This may cause the connection to fail | ||||
|   completely. Sometimes you may need to explicitly select a SSL version to use | ||||
|   when connecting to make the connection succeed. | ||||
|  | ||||
|   An additional complication can be that modern SSL libraries sometimes are | ||||
|   built with support for older SSL and TLS versions disabled! | ||||
|  | ||||
| SSL ciphers | ||||
|  | ||||
|   Clients give servers a list of ciphers to select from. If the list doesn't | ||||
|   include any ciphers the server wants/can use, the connection handshake | ||||
|   fails. | ||||
|  | ||||
|   curl has recently disabled the user of a whole bunch of seriously insecure | ||||
|   ciphers from its default set (slightly depending on SSL backend in use). | ||||
|  | ||||
|   You may have to explicitly provide an alternative list of ciphers for curl | ||||
|   to use to allow the server to use a WEAK cipher for you. | ||||
|  | ||||
|   Note that these weak ciphers are identified as flawed. For example, this | ||||
|   includes symmetric ciphers with less than 128 bit keys and RC4. | ||||
|  | ||||
|   References: | ||||
|  | ||||
|   http://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01 | ||||
|    | ||||
| Allow BEAST | ||||
|  | ||||
|   BEAST is the name of a TLS 1.0 attack that surfaced 2011. When adding means | ||||
|   to mitigate this attack, it turned out that some broken servers out there in | ||||
|   the wild didn't work properly with the BEAST mitigation in place. | ||||
|  | ||||
|   To make such broken servers work, the --ssl-allow-beast option was | ||||
|   introduced. Exactly as it sounds, it re-introduces the BEAST vulnerability | ||||
|   but on the other hand it allows curl to connect to that kind of strange | ||||
|   servers. | ||||
| @@ -110,7 +110,7 @@ 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 version 3.12.0 or later is detected. To check which | ||||
| ertdb format your distribution provides, examine the default | ||||
| certdb 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. | ||||
|   | ||||
							
								
								
									
										112
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -6,9 +6,11 @@ | ||||
|  | ||||
| Aaron Oneal | ||||
| Aaron Orenstein | ||||
| Abram Pousada | ||||
| Adam D. Moss | ||||
| Adam Light | ||||
| Adam Piggott | ||||
| Adam Sampson | ||||
| Adam Tkac | ||||
| Adrian Schuur | ||||
| Adriano Meirelles | ||||
| @@ -21,11 +23,13 @@ Albert Choy | ||||
| Ale Vesely | ||||
| Alejandro Alvarez | ||||
| Aleksandar Milivojevic | ||||
| Aleksey Tulinov | ||||
| Alessandro Ghedini | ||||
| Alessandro Vesely | ||||
| Alex Bligh | ||||
| Alex Fishman | ||||
| Alex Gruz | ||||
| Alex McLellan | ||||
| Alex Neblett | ||||
| Alex Suykov | ||||
| Alex Vinnik | ||||
| @@ -47,11 +51,13 @@ 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 | ||||
| @@ -59,6 +65,7 @@ Andreas Schuldei | ||||
| Andreas Wurf | ||||
| Andrei Benea | ||||
| Andrei Cipu | ||||
| Andrej E Baranov | ||||
| Andres Garcia | ||||
| Andrew Benham | ||||
| Andrew Biggs | ||||
| @@ -69,6 +76,7 @@ Andrew Kurushin | ||||
| Andrew Moise | ||||
| Andrew Wansink | ||||
| Andrew de los Reyes | ||||
| Andrii Moiseiev | ||||
| Andrés García | ||||
| Andy Cedilnik | ||||
| Andy Serpa | ||||
| @@ -87,12 +95,14 @@ Arnaud Compan | ||||
| Arnaud Ebalard | ||||
| Arthur Murray | ||||
| Arve Knudsen | ||||
| Arvid Norberg | ||||
| Ates Goral | ||||
| Augustus Saunders | ||||
| Avery Fay | ||||
| Axel Tillequin | ||||
| Balaji Parasuram | ||||
| Balint Szilakszi | ||||
| Barry Abrahamson | ||||
| Bart Whiteley | ||||
| Bas Mevissen | ||||
| Ben Darnell | ||||
| @@ -103,10 +113,13 @@ Ben Van Hof | ||||
| Ben Winslow | ||||
| Benbuck Nason | ||||
| Benjamin Gerard | ||||
| Benjamin Gilbert | ||||
| Benjamin Johnson | ||||
| Benoit Sigoure | ||||
| Bernard Leak | ||||
| Bernhard Reutner-Fischer | ||||
| Bertrand Demiddelaer | ||||
| Bill Doyle | ||||
| Bill Egert | ||||
| Bill Hoffman | ||||
| Bill Middlecamp | ||||
| @@ -122,6 +135,7 @@ Bogdan Nicula | ||||
| Brad Burdick | ||||
| Brad Hards | ||||
| Brad King | ||||
| Brad Spencer | ||||
| Bradford Bruce | ||||
| Brandon Wang | ||||
| Brendan Jurd | ||||
| @@ -136,6 +150,7 @@ Bruce Mitchener | ||||
| Bruno de Carvalho | ||||
| Bryan Henderson | ||||
| Bryan Kemp | ||||
| Byrial Jensen | ||||
| Cameron Kaiser | ||||
| Camille Moncelier | ||||
| Caolan McNamara | ||||
| @@ -145,9 +160,11 @@ Cedric Deltheil | ||||
| Chad Monroe | ||||
| Chandrakant Bagul | ||||
| Charles Kerr | ||||
| Chen Prog | ||||
| Chih-Chung Chang | ||||
| Chris "Bob Bob" | ||||
| Chris Combes | ||||
| Chris Conlon | ||||
| Chris Conroy | ||||
| Chris Deidun | ||||
| Chris Flerackers | ||||
| @@ -162,6 +179,7 @@ Christian Kurz | ||||
| Christian Robottom Reis | ||||
| Christian Schmitz | ||||
| Christian Vogt | ||||
| Christian Weisgerber | ||||
| Christophe Demory | ||||
| Christophe Legry | ||||
| Christopher Conroy | ||||
| @@ -174,6 +192,7 @@ Clarence Gardner | ||||
| Clemens Gruber | ||||
| Clifford Wolf | ||||
| Cody Jones | ||||
| Colby Ranger | ||||
| Colin Hogben | ||||
| Colin Watson | ||||
| Colm Buckley | ||||
| @@ -187,6 +206,7 @@ Cristian Rodríguez | ||||
| Curt Bogmine | ||||
| Cyrill Osterwalder | ||||
| Cédric Deltheil | ||||
| D. Flinkmann | ||||
| Dag Ekengren | ||||
| Dagobert Michelsen | ||||
| Damien Adant | ||||
| @@ -214,6 +234,7 @@ Dave Halbakken | ||||
| Dave Hamilton | ||||
| Dave May | ||||
| Dave Reisner | ||||
| Dave Thompson | ||||
| Dave Vasilevsky | ||||
| David Bau | ||||
| David Binderman | ||||
| @@ -233,16 +254,21 @@ David McCreedy | ||||
| David Odin | ||||
| David Phillips | ||||
| David Rosenstrauch | ||||
| David Ryskalczyk | ||||
| David Shaw | ||||
| David Strauss | ||||
| David Tarendash | ||||
| David Thiel | ||||
| David Walser | ||||
| David Wright | ||||
| David Yan | ||||
| Dengminwen | ||||
| Derek Higgins | ||||
| Detlef Schmier | ||||
| Didier Brisebourg | ||||
| Diego Casorran | ||||
| Dima Barsky | ||||
| Dima Tisnek | ||||
| Dimitre Dimitrov | ||||
| Dimitris Sarris | ||||
| Dinar | ||||
| @@ -266,6 +292,7 @@ Douglas R. Horner | ||||
| Douglas Steinwand | ||||
| Dov Murik | ||||
| Duane Cathey | ||||
| Duncan | ||||
| Duncan Mac-Vicar Prett | ||||
| Dustin Boswell | ||||
| Dylan Ellicott | ||||
| @@ -274,11 +301,13 @@ Early Ehlinger | ||||
| Ebenezer Ikonne | ||||
| Edin Kadribasic | ||||
| Eduard Bloch | ||||
| Edward Rudd | ||||
| Edward Sheldrake | ||||
| Eelco Dolstra | ||||
| Eetu Ojanen | ||||
| Eldar Zaitov | ||||
| Ellis Pritchard | ||||
| Elmira A Semenova | ||||
| Emanuele Bovisio | ||||
| Emil Romanus | ||||
| Emiliano Ida | ||||
| @@ -288,27 +317,34 @@ Eric Cooper | ||||
| Eric Hu | ||||
| Eric Landes | ||||
| Eric Lavigne | ||||
| Eric Lubin | ||||
| 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 Frank | ||||
| Fabian Hiernaux | ||||
| Fabian Keil | ||||
| Fabrizio Ammollo | ||||
| Fedor Karpelevitch | ||||
| Felix Yan | ||||
| Felix von Leitner | ||||
| Feng Tu | ||||
| Florian Schoppmann | ||||
| Forrest Cahoon | ||||
| Francois Charlier | ||||
| Frank Hempel | ||||
| Frank Keeney | ||||
| Frank McGeough | ||||
| @@ -329,11 +365,14 @@ Gautam Kachroo | ||||
| Gautam Mani | ||||
| Gavrie Philipson | ||||
| Gaz Iqbal | ||||
| Gaël Portay | ||||
| Geoff Beier | ||||
| Georg Horn | ||||
| Georg Huettenegger | ||||
| Georg Lippitsch | ||||
| Georg Wicherski | ||||
| Gerd v. Egidy | ||||
| Gergely Nagy | ||||
| Gerhard Herre | ||||
| Gerrit Bruchhäuser | ||||
| Ghennadi Procopciuc | ||||
| @@ -348,7 +387,10 @@ Giuseppe Attardi | ||||
| Giuseppe D'Ambrosio | ||||
| Glen Nakamura | ||||
| Glen Scott | ||||
| Glenn Sheridan | ||||
| Gokhan Sengun | ||||
| Gordon Marler | ||||
| Gorilla Maguila | ||||
| Grant Erickson | ||||
| Greg Hewgill | ||||
| Greg Morse | ||||
| @@ -364,14 +406,17 @@ Gwenole Beauchesne | ||||
| Götz Babin-Ebell | ||||
| Hamish Mackenzie | ||||
| Hang Kin Lau | ||||
| Hang Su | ||||
| Hanno Kranzhoff | ||||
| Hans Steegers | ||||
| Hans-Jurgen May | ||||
| Hardeep Singh | ||||
| Harshal Pradhan | ||||
| Hauke Duden | ||||
| He Qin | ||||
| Heikki Korpela | ||||
| Heinrich Ko | ||||
| Heinrich Schaefer | ||||
| Hendrik Visage | ||||
| Henrik Storner | ||||
| Henry Ludemann | ||||
| @@ -381,6 +426,7 @@ Ho-chi Chen | ||||
| Hoi-Ho Chan | ||||
| Hongli Lai | ||||
| Howard Chu | ||||
| Hubert Kario | ||||
| Hzhijun | ||||
| Ian D Allen | ||||
| Ian Ford | ||||
| @@ -392,12 +438,14 @@ Ignacio Vazquez-Abrams | ||||
| Igor Franchuk | ||||
| Igor Novoseltsev | ||||
| Igor Polyakov | ||||
| Iida Yosiaki | ||||
| Ilguiz Latypov | ||||
| Ilja van Sprundel | ||||
| Immanuel Gregoire | ||||
| Ingmar Runge | ||||
| Ingo Ralf Blum | ||||
| Ingo Wilken | ||||
| Ishan SinghLevett | ||||
| Jack Zhang | ||||
| Jacky Lam | ||||
| Jacob Meuser | ||||
| @@ -407,6 +455,7 @@ James Bursa | ||||
| James Cheng | ||||
| James Clancy | ||||
| James Cone | ||||
| James Dury | ||||
| James Gallagher | ||||
| James Griffiths | ||||
| James Housley | ||||
| @@ -419,12 +468,14 @@ Jan Koen Annot | ||||
| Jan Kunder | ||||
| Jan Schaumann | ||||
| Jan Van Boghout | ||||
| Jared Jennings | ||||
| Jared Lundell | ||||
| Jari Sundell | ||||
| Jason Glasgow | ||||
| Jason Liu | ||||
| Jason McDonald | ||||
| Jason S. Priebe | ||||
| Javier Barroso | ||||
| Jay Austin | ||||
| Jayesh A Shah | ||||
| Jaz Fresh | ||||
| @@ -433,9 +484,12 @@ Jean-Claude Chauve | ||||
| Jean-Francois Bertrand | ||||
| Jean-Louis Lemaire | ||||
| Jean-Marc Ranger | ||||
| Jean-Noel Rouvignac | ||||
| Jean-Philippe Barrette-LaPierre | ||||
| Jeff Connelly | ||||
| Jeff Hodges | ||||
| Jeff Johnson | ||||
| Jeff King | ||||
| Jeff Lawson | ||||
| Jeff Phillips | ||||
| Jeff Pohlmeyer | ||||
| @@ -445,6 +499,7 @@ Jeremy Friesner | ||||
| Jeremy Huddleston | ||||
| Jerome Muffat-Meridol | ||||
| Jerome Vouillon | ||||
| Jerry Krinock | ||||
| Jerry Wu | ||||
| Jes Badwal | ||||
| Jesper Jensen | ||||
| @@ -456,6 +511,7 @@ Jim Hollinger | ||||
| Jim Meyering | ||||
| Jiri Hruska | ||||
| Jiri Jaburek | ||||
| Jiri Malak | ||||
| Jocelyn Jaubert | ||||
| Joe Halpin | ||||
| Joe Malicki | ||||
| @@ -469,7 +525,9 @@ Johannes Bauer | ||||
| John Bradshaw | ||||
| John Crow | ||||
| John Dennis | ||||
| John Dunn | ||||
| John E. Malmberg | ||||
| John Gardiner Myers | ||||
| John Janssen | ||||
| John Joseph Bachir | ||||
| John Kelly | ||||
| @@ -511,6 +569,8 @@ Julien Royer | ||||
| Jun-ichiro itojun Hagino | ||||
| Jurij Smakov | ||||
| Justin Fletcher | ||||
| Justin Karneges | ||||
| Justin Maggard | ||||
| Jörg Mueller-Tolk | ||||
| Jörn Hartroth | ||||
| Kai Engert | ||||
| @@ -544,11 +604,13 @@ Kimmo Kinnunen | ||||
| Kjell Ericson | ||||
| Kjetil Jacobsen | ||||
| Klevtsov Vadim | ||||
| Konstantin Isakov | ||||
| Kris Kennaway | ||||
| Krishnendu Majumdar | ||||
| Krister Johansen | ||||
| Kristian Gunstone | ||||
| Kristian Köhntopp | ||||
| Kyle L. Huff | ||||
| Kyle Sallee | ||||
| Lachlan O'Dea | ||||
| Larry Campbell | ||||
| @@ -556,12 +618,14 @@ Larry Fahnoe | ||||
| Lars Buitinck | ||||
| Lars Gustafsson | ||||
| Lars J. Aas | ||||
| Lars Johannesen | ||||
| Lars Nilsson | ||||
| Lars Torben Wilson | ||||
| Lau Hang Kin | ||||
| Laurent Rabret | ||||
| Legoff Vincent | ||||
| Lehel Bernadt | ||||
| Leif W | ||||
| Len Krause | ||||
| Lenaic Lefever | ||||
| Lenny Rachitsky | ||||
| @@ -578,23 +642,29 @@ Loren Kirkby | ||||
| Luca Altea | ||||
| Luca Alteas | ||||
| Lucas Adamski | ||||
| Ludovico Cavedon | ||||
| Lukasz Czekierda | ||||
| Luke Amery | ||||
| Luke Call | ||||
| Luke Dashjr | ||||
| Luong Dinh Dung | ||||
| Maciej Karpiuk | ||||
| Maciej W. Rozycki | ||||
| Maks Naumov | ||||
| Mamoru Tasaka | ||||
| Mandy Wu | ||||
| Manfred Schwarb | ||||
| Manuel Massing | ||||
| Marc Boucher | ||||
| Marc Deslauriers | ||||
| Marc Doughty | ||||
| Marc Hoersken | ||||
| Marc Kleine-Budde | ||||
| Marcel Raad | ||||
| Marcel Roelofs | ||||
| Marcelo Juchem | ||||
| Marcin Adamski | ||||
| Marcin Gryszkalis | ||||
| Marcin Konicki | ||||
| Marco G. Salvagno | ||||
| Marco Maggi | ||||
| @@ -649,6 +719,7 @@ Maxim Prohorov | ||||
| Maxime Larocque | ||||
| Mehmet Bozkurt | ||||
| Mekonikum | ||||
| Melissa Mears | ||||
| Mettgut Jamalla | ||||
| Michael Benedict | ||||
| Michael Calmer | ||||
| @@ -660,6 +731,7 @@ Michael Jahn | ||||
| Michael Jerris | ||||
| Michael Mealling | ||||
| Michael Mueller | ||||
| Michael Osipov | ||||
| Michael Smith | ||||
| Michael Stillwell | ||||
| Michael Wallner | ||||
| @@ -668,22 +740,28 @@ 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 Hasselberg | ||||
| Mike Hommey | ||||
| Mike Mio | ||||
| Mike Power | ||||
| Mike Protts | ||||
| Mike Revi | ||||
| Miklos Nemeth | ||||
| Mitz Wark | ||||
| Mohamed Lrhazi | ||||
| Mohammad AlSaleh | ||||
| Mohun Biswas | ||||
| Moonesamy | ||||
| Myk Taylor | ||||
| Nach M. S. | ||||
| Nathan Coulter | ||||
| Nathan O'Sullivan | ||||
| Nathanael Nerode | ||||
| @@ -718,6 +796,7 @@ Olaf Flebbe | ||||
| Olaf Stueben | ||||
| Olaf Stüben | ||||
| Oliver Gondža | ||||
| Oliver Kuckertz | ||||
| Olivier Berger | ||||
| Oren Tirosh | ||||
| Ori Avtalion | ||||
| @@ -725,6 +804,7 @@ Oscar Koeroo | ||||
| Oscar Norlander | ||||
| P R Schaffner | ||||
| Paolo Piacentini | ||||
| Paras Sethia | ||||
| Pascal Terjan | ||||
| Pasha Kuznetsov | ||||
| Pat Ray | ||||
| @@ -736,8 +816,10 @@ Patrick Scott | ||||
| Patrick Smith | ||||
| Patrik Thunstrom | ||||
| Pau Garcia i Quiles | ||||
| Paul Donohue | ||||
| Paul Harrington | ||||
| Paul Howarth | ||||
| Paul Marks | ||||
| Paul Marquis | ||||
| Paul Moore | ||||
| Paul Nolan | ||||
| @@ -752,6 +834,7 @@ Pedro Neves | ||||
| Pete Su | ||||
| Peter Bray | ||||
| Peter Forret | ||||
| Peter Gal | ||||
| Peter Heuchert | ||||
| Peter Hjalmarsson | ||||
| Peter Korsgaard | ||||
| @@ -765,6 +848,9 @@ Peter Todd | ||||
| Peter Verhas | ||||
| Peter Wullinger | ||||
| Peteris Krumins | ||||
| Petr Bahula | ||||
| Petr Novak | ||||
| Petr Pisar | ||||
| Phil Blundell | ||||
| Phil Karn | ||||
| Phil Lisiecki | ||||
| @@ -782,6 +868,8 @@ Pierre Joye | ||||
| Pierre Ynard | ||||
| Pooyan McSporran | ||||
| Pramod Sharma | ||||
| Prash Dush | ||||
| Priyanka Shah | ||||
| Puneet Pawaia | ||||
| Quagmire | ||||
| Quanah Gibson-Mount | ||||
| @@ -801,9 +889,11 @@ Ravi Pratap | ||||
| Ray Dassen | ||||
| Ray Pekowski | ||||
| Reinout van Schouwen | ||||
| Remi Gacogne | ||||
| Renato Botelho | ||||
| Renaud Chaillat | ||||
| Renaud Duhaut | ||||
| Renaud Guillard | ||||
| Rene Bernhardt | ||||
| Rene Rebe | ||||
| Reuven Wachtfogel | ||||
| @@ -823,6 +913,7 @@ Richard Silverman | ||||
| Rick Jones | ||||
| Rick Richardson | ||||
| Rob Crittenden | ||||
| Rob Davies | ||||
| Rob Jones | ||||
| Rob Stanzel | ||||
| Rob Ward | ||||
| @@ -847,6 +938,7 @@ Roland Zimmermann | ||||
| Rolland Dudemaine | ||||
| Roman Koifman | ||||
| Roman Mamedov | ||||
| Romulo A. Ceccon | ||||
| Ron Zapp | ||||
| Rosimildo da Silva | ||||
| Roy Shan | ||||
| @@ -856,6 +948,7 @@ Rutger Hofman | ||||
| Ryan Chan | ||||
| Ryan Nelson | ||||
| Ryan Schmidt | ||||
| Rémy Léone | ||||
| S. Moonesamy | ||||
| Salvador Dávila | ||||
| Salvatore Sorrentino | ||||
| @@ -881,11 +974,14 @@ Sebastian Rasmussen | ||||
| Sebastien Willemijns | ||||
| Senthil Raja Velu | ||||
| Sergei Nikulov | ||||
| Sergey Tatarincev | ||||
| Sergio Ballestrero | ||||
| Seshubabu Pasam | ||||
| Sh Diao | ||||
| Shao Shuchao | ||||
| Sharad Gupta | ||||
| Shard | ||||
| Shawn Landden | ||||
| Shawn Poulson | ||||
| Shmulik Regev | ||||
| Siddhartha Prakash Jain | ||||
| @@ -903,6 +999,7 @@ Stan van de Burgt | ||||
| Stanislav Ivochkin | ||||
| Stefan Esser | ||||
| Stefan Krause | ||||
| Stefan Neis | ||||
| Stefan Teleman | ||||
| Stefan Tomanek | ||||
| Stefan Ulrich | ||||
| @@ -935,12 +1032,14 @@ Taneli Vahakangas | ||||
| Tanguy Fautre | ||||
| Tatsuhiro Tsujikawa | ||||
| Temprimus | ||||
| Thomas Braun | ||||
| Thomas J. Moore | ||||
| Thomas Klausner | ||||
| Thomas L. Shinnick | ||||
| Thomas Lopatic | ||||
| Thomas Schwinge | ||||
| Thomas Tonino | ||||
| Tiit Pikma | ||||
| Tim Ansell | ||||
| Tim Baker | ||||
| Tim Bartley | ||||
| @@ -950,7 +1049,9 @@ Tim Harder | ||||
| Tim Heckman | ||||
| Tim Newsome | ||||
| Tim Sneddon | ||||
| Timo Sirainen | ||||
| Tinus van den Berg | ||||
| Tobias Markus | ||||
| Tobias Rundström | ||||
| Toby Peterson | ||||
| Todd A Ouska | ||||
| @@ -967,6 +1068,7 @@ Tom Mueller | ||||
| Tom Regner | ||||
| Tom Wright | ||||
| Tom Zerucha | ||||
| Tomas Hoger | ||||
| Tomas Mlcoch | ||||
| Tomas Pospisek | ||||
| Tomas Szepe | ||||
| @@ -984,12 +1086,15 @@ Traian Nicolescu | ||||
| Troels Walsted Hansen | ||||
| Troy Engel | ||||
| Tupone Alfredo | ||||
| Tyler Hall | ||||
| Ulf Härnhammar | ||||
| Ulf Samuelsson | ||||
| Ulrich Doehner | ||||
| Ulrich Zadow | ||||
| Venkat Akella | ||||
| Victor Snezhko | ||||
| Vikram Saxena | ||||
| Viktor Szakáts | ||||
| Vilmos Nebehaj | ||||
| Vincent Bronner | ||||
| Vincent Le Normand | ||||
| @@ -1011,19 +1116,26 @@ Wesley Laxton | ||||
| Wesley Miaw | ||||
| Wez Furlong | ||||
| Wilfredo Sanchez | ||||
| Will Dietz | ||||
| Willem Sparreboom | ||||
| Wojciech Zwiefka | ||||
| Wouter Van Rooy | ||||
| Wu Yongzheng | ||||
| Xavier Bouchoux | ||||
| Yaakov Selkowitz | ||||
| Yamada Yasuharu | ||||
| Yang Tse | ||||
| Yarram Sunil | ||||
| Yehezkel Horowitz | ||||
| Yehoshua Hershberg | ||||
| Yi Huang | ||||
| Yingwei Liu | ||||
| Yukihiro Kawada | ||||
| Yuriy Sosov | ||||
| Yves Arrouye | ||||
| Yves Lejeune | ||||
| Zdenek Pavlas | ||||
| Zekun Ni | ||||
| Zmey Petroff | ||||
| Zvi Har'El | ||||
| nk | ||||
|   | ||||
							
								
								
									
										166
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -16,8 +16,9 @@ | ||||
|  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 Modified buffer size approach | ||||
|  1.7 Detect when called from witin callbacks | ||||
|  1.8 Allow SSL (HTTPS) to proxy | ||||
|  | ||||
|  2. libcurl - multi interface | ||||
|  2.1 More non-blocking | ||||
| @@ -31,14 +32,14 @@ | ||||
|  4.2 Alter passive/active on failure and retry | ||||
|  4.3 Earlier bad letter detection | ||||
|  4.4 REST for large files | ||||
|  4.5 FTP proxy support | ||||
|  4.6 ASCII support | ||||
|  4.5 ASCII support | ||||
|  | ||||
|  5. HTTP | ||||
|  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 | ||||
|  5.4 SPDY | ||||
|  5.5 auth= in URLs | ||||
|  | ||||
|  6. TELNET | ||||
|  6.1 ditch stdin | ||||
| @@ -48,17 +49,14 @@ | ||||
|  | ||||
|  7. SMTP | ||||
|  7.1 Pipelining | ||||
|  7.2 Graceful base64 decoding failure | ||||
|  7.3 Enhanced capability support | ||||
|  7.2 Enhanced capability support | ||||
|   | ||||
|  8. POP3 | ||||
|  8.1 Pipelining | ||||
|  8.2 Graceful base64 decoding failure | ||||
|  8.3 Enhanced capability support | ||||
|  8.2 Enhanced capability support | ||||
|   | ||||
|  9. IMAP | ||||
|  9.1 Graceful base64 decoding failure | ||||
|  9.2 Enhanced capability support | ||||
|  9.1 Enhanced capability support | ||||
|   | ||||
|  10. LDAP | ||||
|  10.1 SASL based authentication mechanisms | ||||
| @@ -73,9 +71,8 @@ | ||||
|  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 | ||||
|  12.7 improve configure --with-ssl | ||||
|  12.8 Support DANE | ||||
|  | ||||
|  13. GnuTLS | ||||
|  13.1 SSL engine stuff | ||||
| @@ -90,9 +87,8 @@ | ||||
|  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 | ||||
|  15.6 warning when setting an option | ||||
|  15.7 IPv6 addresses with globbing | ||||
|  | ||||
|  16. Build | ||||
|  16.1 roffit | ||||
| @@ -157,26 +153,39 @@ | ||||
|  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 | ||||
| 1.6 Modified buffer size approach | ||||
|  | ||||
|  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. | ||||
|  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. | ||||
|  | ||||
| 1.7 Happy Eyeball dual stack connect | ||||
|  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. | ||||
|  | ||||
|  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 | ||||
|  option existing simultaneously there are reasons to reconsider internal | ||||
|  choices. | ||||
|  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. | ||||
|  | ||||
|  To make libcurl do blazing fast IPv6 in a dual-stack configuration, this needs | ||||
|  to be addressed: | ||||
|  Dynamically allocate buffer size depending on protocol in use in combination | ||||
|  with freeing it after each individual transfer? Other suggestions? | ||||
|  | ||||
| 1.7 Detect when called from witin callbacks | ||||
|  | ||||
|  We should set a state variable before calling callbacks, so that we | ||||
|  subsequently can add code within libcurl that returns error if called within | ||||
|  callbacks for when that's not supported. | ||||
|  | ||||
| 1.8 Allow SSL (HTTPS) to proxy | ||||
|  | ||||
|  To prevent local users from snooping on your traffic to the proxy. Supported | ||||
|  by Chrome already: | ||||
|  http://www.chromium.org/developers/design-documents/secure-web-proxy | ||||
|  | ||||
|     http://tools.ietf.org/html/rfc6555 | ||||
|  | ||||
| 2. libcurl - multi interface | ||||
|  | ||||
| @@ -233,13 +242,7 @@ | ||||
|  the server doesn't set the pointer to the requested index. The tricky | ||||
|  (impossible?) part is to figure out if the server did the right thing or not. | ||||
|  | ||||
| 4.5 FTP proxy support | ||||
|  | ||||
|  Support the most common FTP proxies, Philip Newton provided a list allegedly | ||||
|  from ncftp. This is not a subject without debate, and is probably not really | ||||
|  suitable for libcurl.  http://curl.haxx.se/mail/archive-2003-04/0126.html | ||||
|  | ||||
| 4.6 ASCII support | ||||
| 4.5 ASCII support | ||||
|  | ||||
|  FTP ASCII transfers do not follow RFC959. They don't convert the data | ||||
|  accordingly. | ||||
| @@ -269,24 +272,25 @@ | ||||
|  headers use a default value so only headers that need to be moved have to be | ||||
|  specified. | ||||
|  | ||||
| 5.4 HTTP2/SPDY | ||||
| 5.4 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. | ||||
|  Chrome and Firefox already support SPDY and lots of web services do. There's | ||||
|  a library for us to use for this (spdylay) that has a similar API and the | ||||
|  same author as nghttp2. | ||||
|  | ||||
|  It would make sense to implement SPDY support now and later transition into | ||||
|  or add HTTP2 support as well. | ||||
|  spdylay: https://github.com/tatsuhiro-t/spdylay | ||||
|  | ||||
|  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. | ||||
| 5.5 auth= in URLs | ||||
|  | ||||
|  Add the ability to specify the preferred authentication mechanism to use by | ||||
|  using ;auth=<mech> in the login part of the URL. | ||||
|  | ||||
|  For example: | ||||
|  | ||||
|  http://test:pass;auth=NTLM@example.com would be equivalent to specifing --user | ||||
|  test:pass;auth=NTLM or --user test:pass --ntlm from the command line.  | ||||
|  | ||||
|  Additionally this should be implemented for proxy base URLs as well. | ||||
|  | ||||
| 6. TELNET | ||||
|  | ||||
| @@ -318,14 +322,7 @@ to provide the data to send. | ||||
|  | ||||
|  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 | ||||
| 7.2 Enhanced capability support | ||||
|  | ||||
|  Add the ability, for an application that uses libcurl, to obtain the list of | ||||
|  capabilities returned from the EHLO command. | ||||
| @@ -336,28 +333,14 @@ to provide the data to send. | ||||
|  | ||||
|  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 | ||||
| 8.2 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 | ||||
| 9.1 Enhanced capability support | ||||
|  | ||||
|  Add the ability, for an application that uses libcurl, to obtain the list of | ||||
|  capabilities returned from the CAPABILITY command. | ||||
| @@ -421,17 +404,12 @@ to provide the data to send. | ||||
|  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! | ||||
|  | ||||
| 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/). | ||||
|  | ||||
| 12.8 improve configure --with-ssl | ||||
| 12.7 improve configure --with-ssl | ||||
|  | ||||
|  make the configure --with-ssl option first check for OpenSSL, then GnuTLS, | ||||
|  then NSS... | ||||
|  | ||||
| 12.9 Support DANE | ||||
| 12.8 Support DANE | ||||
|  | ||||
|  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. | ||||
| @@ -505,27 +483,13 @@ to provide the data to send. | ||||
|  which should overwrite the program reasonable defaults (plain/text, | ||||
|  8bit...) | ||||
|  | ||||
| 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, | ||||
|  similar to this: | ||||
|  | ||||
|     curl --data foo --url url.com : \ | ||||
|         --url url2.com : \ | ||||
|         --url url3.com --data foo3 | ||||
|  | ||||
|  (More details: http://curl.haxx.se/mail/archive-2004-07/0133.html) | ||||
|  | ||||
|  The example would do a POST-GET-POST combination on a single command line. | ||||
|  | ||||
| 15.7 warning when setting an option | ||||
| 15.6 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. | ||||
|  | ||||
| 15.8 IPv6 addresses with globbing | ||||
| 15.7 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 | ||||
| @@ -601,7 +565,7 @@ to provide the data to send. | ||||
|  for applications to differentiate on TCP vs UDP and even HTTP vs FTP and | ||||
|  similar. | ||||
|  | ||||
| 10. Next major release | ||||
| 19. Next major release | ||||
|  | ||||
| 19.1 cleanup return codes | ||||
|  | ||||
|   | ||||
| @@ -1,16 +1,72 @@ | ||||
| Online:  http://curl.haxx.se/docs/httpscripting.html | ||||
| Date:    Jan 19, 2011 | ||||
| Updated: Dec 24, 2013 (http://curl.haxx.se/docs/httpscripting.html) | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
|                             | (__| |_| |  _ <| |___ | ||||
|                              \___|\___/|_| \_\_____| | ||||
|  | ||||
|                 The Art Of Scripting HTTP Requests Using Curl | ||||
|                 ============================================= | ||||
|  | ||||
|  This document will assume that you're familiar with HTML and general | ||||
|  networking. | ||||
| The Art Of Scripting HTTP Requests Using Curl | ||||
|  | ||||
|  The possibility to write scripts is essential to make a good computer | ||||
|  system. Unix' capability to be extended by shell scripts and various tools to | ||||
|  run various automated commands and scripts is one reason why it has succeeded | ||||
|  so well. | ||||
|  1. HTTP Scripting | ||||
|  1.1 Background | ||||
|  1.2 The HTTP Protocol | ||||
|  1.3 See the Protocol | ||||
|  1.4 See the Timing | ||||
|  1.5 See the Response | ||||
|  2. URL | ||||
|  2.1 Spec | ||||
|  2.2 Host | ||||
|  2.3 Port number | ||||
|  2.4 User name and password | ||||
|  2.5 Path part | ||||
|  3. Fetch a page | ||||
|  3.1 GET | ||||
|  3.2 HEAD | ||||
|  4. HTML forms | ||||
|  4.1 Forms explained | ||||
|  4.2 GET | ||||
|  4.3 POST | ||||
|  4.4 File Upload POST | ||||
|  4.5 Hidden Fields | ||||
|  4.6 Figure Out What A POST Looks Like | ||||
|  5. HTTP upload | ||||
|  5.1 PUT | ||||
|  6. HTTP Authentication | ||||
|  6.1 Basic Authentication | ||||
|  6.2 Other Authentication | ||||
|  6.3 Proxy Authentication | ||||
|  6.4 Hiding credentials | ||||
|  7. More HTTP Headers | ||||
|  7.1 Referer | ||||
|  7.2 User Agent | ||||
|  8. Redirects | ||||
|  8.1 Location header | ||||
|  8.2 Other redirects | ||||
|  9. Cookies | ||||
|  9.1 Cookie Basics | ||||
|  9.2 Cookie options | ||||
|  10. HTTPS | ||||
|  10.1 HTTPS is HTTP secure | ||||
|  10.2 Certificates | ||||
|  11. Custom Request Elements | ||||
|  11.1 Modify method and headers | ||||
|  11.2 More on changed methods | ||||
|  12. Web Login | ||||
|  12.1 Some login tricks | ||||
|  13. Debug | ||||
|  13.1 Some debug tricks | ||||
|  14. References | ||||
|  14.1 Standards | ||||
|  14.2 Sites | ||||
|  | ||||
| ============================================================================== | ||||
|  | ||||
| 1. HTTP Scripting | ||||
|  | ||||
|  1.1 Background | ||||
|  | ||||
|  This document assumes that you're familiar with HTML and general networking. | ||||
|  | ||||
|  The increasing amount of applications moving to the web has made "HTTP | ||||
|  Scripting" more frequently requested and wanted. To be able to automatically | ||||
| @@ -27,7 +83,7 @@ Date:    Jan 19, 2011 | ||||
|  to glue everything together using some kind of script language or repeated | ||||
|  manual invokes. | ||||
|  | ||||
| 1. The HTTP Protocol | ||||
|  1.2 The HTTP Protocol | ||||
|  | ||||
|  HTTP is the protocol used to fetch data from web servers. It is a very simple | ||||
|  protocol that is built upon TCP/IP. The protocol also allows information to | ||||
| @@ -44,7 +100,7 @@ Date:    Jan 19, 2011 | ||||
|  well), response headers and most often also a response body. The "body" part | ||||
|  is the plain data you requested, like the actual HTML or the image etc. | ||||
|  | ||||
|  1.1 See the Protocol | ||||
|  1.3 See the Protocol | ||||
|  | ||||
|   Using curl's option --verbose (-v as a short option) will display what kind | ||||
|   of commands curl sends to the server, as well as a few other informational | ||||
| @@ -59,13 +115,88 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|       curl --trace-ascii debugdump.txt http://www.example.com/ | ||||
|  | ||||
|  1.4 See the Timing | ||||
|  | ||||
|   Many times you may wonder what exactly is taking all the time, or you just | ||||
|   want to know the amount of milliseconds between two points in a | ||||
|   transfer. For those, and other similar situations, the --trace-time option | ||||
|   is what you need. It'll prepend the time to each trace output line: | ||||
|  | ||||
|       curl --trace-ascii d.txt --trace-time http://example.com/ | ||||
|  | ||||
|  1.5 See the Response | ||||
|  | ||||
|   By default curl sends the response to stdout. You need to redirect it | ||||
|   somewhere to avoid that, most often that is done with -o or -O. | ||||
|  | ||||
| 2. URL | ||||
|  | ||||
|  2.1 Spec | ||||
|  | ||||
|  The Uniform Resource Locator format is how you specify the address of a | ||||
|  particular resource on the Internet. You know these, you've seen URLs like | ||||
|  http://curl.haxx.se or https://yourbank.com a million times. | ||||
|  http://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the | ||||
|  canonical spec. | ||||
|  | ||||
| 3. GET a page | ||||
|  2.2 Host | ||||
|  | ||||
|  The host name is usually resolved using DNS or your /etc/hosts file to an IP | ||||
|  address and that's what curl will communicate with. Alternatively you specify | ||||
|  the IP address directly in the URL instead of a name. | ||||
|  | ||||
|  For development and other trying out situation, you can point out a different | ||||
|  IP address for a host name than what would otherwise be used, by using curl's | ||||
|  --resolve option: | ||||
|  | ||||
|       curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/ | ||||
|   | ||||
|  2.3 Port number | ||||
|  | ||||
|  Each protocol curl supports operate on a default port number, be it over TCP | ||||
|  or in some cases UDP. Normally you don't have to take that into | ||||
|  consideration, but at times you run test servers on other ports or | ||||
|  similar. Then you can specify the port number in the URL with a colon and a | ||||
|  number immediately following the host name. Like when doing HTTP to port | ||||
|  1234: | ||||
|  | ||||
|       curl http://www.example.org:1234/ | ||||
|  | ||||
|  The port number you specify in the URL is the number that the server uses to | ||||
|  offer its services. Sometimes you may use a local proxy, and then you may | ||||
|  need to specify that proxy's port number separate on what curl needs to | ||||
|  connect to locally. Like when using a HTTP proxy on port 4321: | ||||
|  | ||||
|       curl --proxy http://proxy.example.org:4321 http://remote.example.org/ | ||||
|  | ||||
|  2.4 User name and password | ||||
|  | ||||
|  Some services are setup to require HTTP authentication and then you need to | ||||
|  provide name and password which then is transferred to the remote site in | ||||
|  various ways depending on the exact authentication protocol used. | ||||
|  | ||||
|  You can opt to either insert the user and password in the URL or you can | ||||
|  provide them separately: | ||||
|  | ||||
|       curl http://user:password@example.org/ | ||||
|  | ||||
|  or | ||||
|  | ||||
|       curl -u user:password http://example.org/ | ||||
|  | ||||
|  You need to pay attention that this kind of HTTP authentication is not what | ||||
|  is usually done and requested by user-oriented web sites these days. They | ||||
|  tend to use forms and cookies instead. | ||||
|  | ||||
|  2.5 Path part | ||||
|  | ||||
|  The path part is just sent off to the server to request that it sends back | ||||
|  the associated response. The path is what is to the right side of the slash | ||||
|  that follows the host name and possibly port number. | ||||
|  | ||||
|  | ||||
| 3. Fetch a page | ||||
|  | ||||
|  3.1 GET | ||||
|  | ||||
|  The simplest and most common request/operation made using HTTP is to get a | ||||
|  URL. The URL could itself refer to a web page, an image or a file. The client | ||||
| @@ -79,10 +210,23 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|  All HTTP replies contain a set of response headers that are normally hidden, | ||||
|  use curl's --include (-i) option to display them as well as the rest of the | ||||
|  document. You can also ask the remote server for ONLY the headers by using | ||||
|  the --head (-I) option (which will make curl issue a HEAD request). | ||||
|  document. | ||||
|  | ||||
| 4. Forms | ||||
|  3.2 HEAD | ||||
|  | ||||
|  You can ask the remote server for ONLY the headers by using the --head (-I) | ||||
|  option which will make curl issue a HEAD request. In some special cases | ||||
|  servers deny the HEAD method while others still work, which is a particular | ||||
|  kind of annoyance. | ||||
|  | ||||
|  The HEAD method is defined and made so that the server returns the headers | ||||
|  exactly the way it would do for a GET, but without a body. It means that you | ||||
|  may see a Content-Length: in the response headers, but there must not be an | ||||
|  actual body in the HEAD response. | ||||
|  | ||||
| 4. HTML forms | ||||
|  | ||||
|  4.1 Forms explained | ||||
|  | ||||
|  Forms are the general way a web site can present a HTML page with fields for | ||||
|  the user to enter data in, and then press some kind of 'OK' or 'submit' | ||||
| @@ -95,7 +239,7 @@ Date:    Jan 19, 2011 | ||||
|  Of course there has to be some kind of program in the server end to receive | ||||
|  the data you send. You cannot just invent something out of the air. | ||||
|  | ||||
|  4.1 GET | ||||
|  4.2 GET | ||||
|  | ||||
|   A GET-form uses the method GET, as specified in HTML like: | ||||
|  | ||||
| @@ -121,7 +265,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK" | ||||
|  | ||||
|  4.2 POST | ||||
|  4.3 POST | ||||
|  | ||||
|   The GET method makes all input field names get displayed in the URL field of | ||||
|   your browser. That's generally a good thing when you want to be able to | ||||
| @@ -158,7 +302,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl --data-urlencode "name=I am Daniel" http://www.example.com | ||||
|  | ||||
|  4.3 File Upload POST | ||||
|  4.4 File Upload POST | ||||
|  | ||||
|   Back in late 1995 they defined an additional way to post data over HTTP. It | ||||
|   is documented in the RFC 1867, why this method sometimes is referred to as | ||||
| @@ -179,7 +323,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl --form upload=@localfilename --form press=OK [URL] | ||||
|  | ||||
|  4.4 Hidden Fields | ||||
|  4.5 Hidden Fields | ||||
|  | ||||
|   A very common way for HTML based application to pass state information | ||||
|   between pages is to add hidden fields to the forms. Hidden fields are | ||||
| @@ -200,7 +344,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl --data "birthyear=1905&press=OK&person=daniel" [URL] | ||||
|  | ||||
|  4.5 Figure Out What A POST Looks Like | ||||
|  4.6 Figure Out What A POST Looks Like | ||||
|  | ||||
|   When you're about fill in a form and send to a server by using curl instead | ||||
|   of a browser, you're of course very interested in sending a POST exactly the | ||||
| @@ -213,7 +357,9 @@ Date:    Jan 19, 2011 | ||||
|   You will then clearly see the data get appended to the URL, separated with a | ||||
|   '?'-letter as GET forms are supposed to. | ||||
|  | ||||
| 5. PUT | ||||
| 5. HTTP upload | ||||
|  | ||||
|  5.1 PUT | ||||
|  | ||||
|  The perhaps best way to upload data to a HTTP server is to use PUT. Then | ||||
|  again, this of course requires that someone put a program or script on the | ||||
| @@ -225,6 +371,8 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
| 6. HTTP Authentication | ||||
|  | ||||
|  6.1 Basic Authentication | ||||
|  | ||||
|  HTTP Authentication is the ability to tell the server your username and | ||||
|  password so that it can verify that you're allowed to do the request you're | ||||
|  doing. The Basic authentication used in HTTP (which is the type curl uses by | ||||
| @@ -236,10 +384,14 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl --user name:password http://www.example.com | ||||
|  | ||||
|  6.2 Other Authentication | ||||
|  | ||||
|  The site might require a different authentication method (check the headers | ||||
|  returned by the server), and then --ntlm, --digest, --negotiate or even | ||||
|  --anyauth might be options that suit you. | ||||
|  | ||||
|  6.3 Proxy Authentication | ||||
|  | ||||
|  Sometimes your HTTP access is only available through the use of a HTTP | ||||
|  proxy. This seems to be especially common at various companies. A HTTP proxy | ||||
|  may require its own user and password to allow the client to get through to | ||||
| @@ -253,6 +405,8 @@ Date:    Jan 19, 2011 | ||||
|  If you use any one these user+password options but leave out the password | ||||
|  part, curl will prompt for the password interactively. | ||||
|  | ||||
|  6.4 Hiding credentials | ||||
|  | ||||
|  Do note that when a program is run, its parameters might be possible to see | ||||
|  when listing the running processes of the system. Thus, other users may be | ||||
|  able to watch your passwords if you pass them as plain command line | ||||
| @@ -262,7 +416,9 @@ Date:    Jan 19, 2011 | ||||
|  many web sites will not use this concept when they provide logins etc. See | ||||
|  the Web Login chapter further below for more details on that. | ||||
|  | ||||
| 7. Referer | ||||
| 7. More HTTP Headers | ||||
|  | ||||
|  7.1 Referer | ||||
|  | ||||
|  A HTTP request may include a 'referer' field (yes it is misspelled), which | ||||
|  can be used to tell from which URL the client got to this particular | ||||
| @@ -276,7 +432,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl --referer http://www.example.come http://www.example.com | ||||
|  | ||||
| 8. User Agent | ||||
|  7.2 User Agent | ||||
|  | ||||
|  Very similar to the referer field, all HTTP requests may set the User-Agent | ||||
|  field. It names what user agent (client) that is being used. Many | ||||
| @@ -298,7 +454,9 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|   curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] | ||||
|  | ||||
| 9. Redirects | ||||
| 8. Redirects | ||||
|  | ||||
|  8.1 Location header | ||||
|  | ||||
|  When a resource is requested from a server, the reply from the server may | ||||
|  include a hint about where the browser should go next to find this page, or a | ||||
| @@ -318,7 +476,16 @@ Date:    Jan 19, 2011 | ||||
|  only use POST in the first request, and then revert to GET in the following | ||||
|  operations. | ||||
|  | ||||
| 10. Cookies | ||||
|  8.2 Other redirects | ||||
|  | ||||
|  Browser typically support at least two other ways of redirects that curl | ||||
|  doesn't: first the html may contain a meta refresh tag that asks the browser | ||||
|  to load a specific URL after a set number of seconds, or it may use | ||||
|  javascript to do it. | ||||
|  | ||||
| 9. Cookies | ||||
|  | ||||
|  9.1 Cookie Basics | ||||
|  | ||||
|  The way the web browsers do "client side state control" is by using | ||||
|  cookies. Cookies are just names with associated contents. The cookies are | ||||
| @@ -335,6 +502,8 @@ Date:    Jan 19, 2011 | ||||
|  must be able to record and send back cookies the way the web application | ||||
|  expects them. The same way browsers deal with them. | ||||
|  | ||||
|  9.2 Cookie options | ||||
|  | ||||
|  The simplest way to send a few cookies to the server when getting a page with | ||||
|  curl is to add them on the command line like: | ||||
|  | ||||
| @@ -351,7 +520,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|  Curl has a full blown cookie parsing engine built-in that comes to use if you | ||||
|  want to reconnect to a server and use cookies that were stored from a | ||||
|  previous connection (or handicrafted manually to fool the server into | ||||
|  previous connection (or hand-crafted manually to fool the server into | ||||
|  believing you had a previous connection). To use previously stored cookies, | ||||
|  you run curl like: | ||||
|  | ||||
| @@ -366,16 +535,18 @@ Date:    Jan 19, 2011 | ||||
|         curl --cookie nada --location http://www.example.com | ||||
|  | ||||
|  Curl has the ability to read and write cookie files that use the same file | ||||
|  format that Netscape and Mozilla do. It is a convenient way to share cookies | ||||
|  between browsers and automatic scripts. The --cookie (-b) switch | ||||
|  automatically detects if a given file is such a cookie file and parses it, | ||||
|  and by using the --cookie-jar (-c) option you'll make curl write a new cookie | ||||
|  file at the end of an operation: | ||||
|  format that Netscape and Mozilla once used. It is a convenient way to share | ||||
|  cookies between scripts or invokes. The --cookie (-b) switch automatically | ||||
|  detects if a given file is such a cookie file and parses it, and by using the | ||||
|  --cookie-jar (-c) option you'll make curl write a new cookie file at the end | ||||
|  of an operation: | ||||
|  | ||||
|         curl --cookie cookies.txt --cookie-jar newcookies.txt \ | ||||
|         http://www.example.com | ||||
|  | ||||
| 11. HTTPS | ||||
| 10. HTTPS | ||||
|  | ||||
|  10.1 HTTPS is HTTP secure | ||||
|  | ||||
|  There are a few ways to do secure HTTP transfers. The by far most common | ||||
|  protocol for doing this is what is generally known as HTTPS, HTTP over | ||||
| @@ -391,7 +562,7 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl https://secure.example.com | ||||
|  | ||||
|  11.1 Certificates | ||||
|  10.2 Certificates | ||||
|  | ||||
|   In the HTTPS world, you use certificates to validate that you are the one | ||||
|   you claim to be, as an addition to normal passwords. Curl supports client- | ||||
| @@ -413,7 +584,9 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         http://curl.haxx.se/docs/sslcerts.html | ||||
|  | ||||
| 12. Custom Request Elements | ||||
| 11. Custom Request Elements | ||||
|  | ||||
| 11.1 Modify method and headers | ||||
|  | ||||
|  Doing fancy stuff, you may need to add or change elements of a single curl | ||||
|  request. | ||||
| @@ -434,7 +607,26 @@ Date:    Jan 19, 2011 | ||||
|  | ||||
|         curl --header "Destination: http://nowhere" http://example.com | ||||
|  | ||||
| 13. Web Login | ||||
|  11.2 More on changed methods | ||||
|  | ||||
|  It should be noted that curl selects which methods to use on its own | ||||
|  depending on what action to ask for. -d will do POST, -I will do HEAD and so | ||||
|  on. If you use the --request / -X option you can change the method keyword | ||||
|  curl selects, but you will not modify curl's behavior. This means that if you | ||||
|  for example use -d "data" to do a POST, you can modify the method to a | ||||
|  PROPFIND with -X and curl will still think it sends a POST. You can change | ||||
|  the normal GET to a POST method by simply adding -X POST in a command line | ||||
|  like: | ||||
|  | ||||
|         curl -X POST http://example.org/ | ||||
|  | ||||
|  ... but curl will still think and act as if it sent a GET so it won't send any | ||||
|  request body etc. | ||||
|  | ||||
|  | ||||
| 12. Web Login | ||||
|  | ||||
|  12.1 Some login tricks | ||||
|  | ||||
|  While not strictly just HTTP related, it still cause a lot of people problems | ||||
|  so here's the executive run-down of how the vast majority of all login forms | ||||
| @@ -453,7 +645,7 @@ Date:    Jan 19, 2011 | ||||
|  sometimes they use such code to set or modify cookie contents. Possibly they | ||||
|  do that to prevent programmed logins, like this manual describes how to... | ||||
|  Anyway, if reading the code isn't enough to let you repeat the behavior | ||||
|  manually, capturing the HTTP requests done by your browers and analyzing the | ||||
|  manually, capturing the HTTP requests done by your browsers and analyzing the | ||||
|  sent cookies is usually a working method to work out how to shortcut the | ||||
|  javascript need. | ||||
|  | ||||
| @@ -463,7 +655,9 @@ Date:    Jan 19, 2011 | ||||
|  to do a proper login POST. Remember that the contents need to be URL encoded | ||||
|  when sent in a normal POST. | ||||
|  | ||||
| 14. Debug | ||||
| 13. Debug | ||||
|  | ||||
|  13.1 Some debug tricks | ||||
|  | ||||
|  Many times when you run curl on a site, you'll notice that the site doesn't | ||||
|  seem to respond the same way to your curl requests as it does to your | ||||
| @@ -483,25 +677,30 @@ Date:    Jan 19, 2011 | ||||
|  * Set referer like it is set by the browser | ||||
|  | ||||
|  * If you use POST, make sure you send all the fields and in the same order as | ||||
|    the browser does it. (See chapter 4.5 above) | ||||
|  the browser does it. | ||||
|  | ||||
|  A very good helper to make sure you do this right, is the LiveHTTPHeader tool | ||||
|  that lets you view all headers you send and receive with Mozilla/Firefox | ||||
|  (even when using HTTPS). | ||||
|  (even when using HTTPS). Chrome features similar functionality out of the box | ||||
|  among the developer's tools. | ||||
|  | ||||
|  A more raw approach is to capture the HTTP traffic on the network with tools | ||||
|  such as ethereal or tcpdump and check what headers that were sent and | ||||
|  received by the browser. (HTTPS makes this technique inefficient.) | ||||
|  | ||||
| 15. References | ||||
| 14. References | ||||
|  | ||||
|  14.1 Standards | ||||
|  | ||||
|  RFC 2616 is a must to read if you want in-depth understanding of the HTTP | ||||
|  protocol. | ||||
|  protocol | ||||
|  | ||||
|  RFC 3986 explains the URL syntax. | ||||
|  RFC 3986 explains the URL syntax | ||||
|  | ||||
|  RFC 2109 defines how cookies are supposed to work. | ||||
|  RFC 1867 defines the HTTP post upload format | ||||
|  | ||||
|  RFC 1867 defines the HTTP post upload format. | ||||
|  RFC 6525 defines how HTTP cookies work | ||||
|  | ||||
|  14.2 Sites | ||||
|  | ||||
|  http://curl.haxx.se is the home of the cURL project | ||||
|   | ||||
							
								
								
									
										286
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										286
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -103,6 +103,18 @@ any response data to the terminal. | ||||
| If you prefer a progress "bar" instead of the regular meter, \fI-#\fP is your | ||||
| friend. | ||||
| .SH OPTIONS | ||||
| Options start with one or two dashes. Many of the options require an addition | ||||
| value next to it. | ||||
|  | ||||
| The short "single-dash" form of the options, -d for example, may be used with | ||||
| or without a space between it and its value, although a space is a recommended | ||||
| separator. The long "double-dash" form, --data for example, requires a space | ||||
| between it and its value. | ||||
|  | ||||
| Short version options that don't need any additional values can be used | ||||
| immediately next to each other, like for example you can specify all the | ||||
| options -O, -L and -v at once as -OLv. | ||||
|  | ||||
| In general, all boolean options are enabled with --\fBoption\fP and yet again | ||||
| disabled with --\fBno-\fPoption. That is, you use the exact same option name | ||||
| but prefix it with "no-". However, in this list we mostly only list and show | ||||
| @@ -112,12 +124,38 @@ same command line option.) | ||||
| .IP "-#, --progress-bar" | ||||
| Make curl display progress as a simple progress bar instead of the standard, | ||||
| more informational, meter. | ||||
| .IP "-:, --next" | ||||
| Tells curl to use a separate operation for the following URL and associated | ||||
| options. This allows you to send several URL requests, each with their own | ||||
| specific options, for example, such as different user names or custom requests | ||||
| for each. (Added in 7.36.0) | ||||
| .IP "-0, --http1.0" | ||||
| (HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its | ||||
| internally preferred: HTTP 1.1. | ||||
| (HTTP) Tells curl to use HTTP version 1.0 instead of using its internally | ||||
| preferred: HTTP 1.1. | ||||
| .IP "--http1.1" | ||||
| (HTTP) Tells curl to use HTTP version 1.1. This is the internal default | ||||
| version. (Added in 7.33.0) | ||||
| .IP "--http2" | ||||
| (HTTP) Tells curl to issue its requests using HTTP 2. This requires that the | ||||
| underlying libcurl was built to support it. (Added in 7.33.0) | ||||
| .IP "--no-npn" | ||||
| Disable the NPN TLS extension. NPN is enabled by default if libcurl was built | ||||
| with an SSL library that supports NPN. NPN is used by a libcurl that supports | ||||
| HTTP 2 to negotiate HTTP 2 support with the server during https sessions. | ||||
|  | ||||
| (Added in 7.36.0) | ||||
| .IP "--no-alpn" | ||||
| Disable the ALPN TLS extension. ALPN is enabled by default if libcurl was built | ||||
| with an SSL library that supports ALPN. ALPN is used by a libcurl that supports | ||||
| HTTP 2 to negotiate HTTP 2 support with the server during https sessions. | ||||
|  | ||||
| (Added in 7.36.0) | ||||
| .IP "-1, --tlsv1" | ||||
| (SSL) | ||||
| Forces curl to use TLS version 1 when negotiating with a remote TLS server. | ||||
| Forces curl to use TLS version 1.x when negotiating with a remote TLS server. | ||||
| You can use options \fI--tlsv1.0\fP, \fI--tlsv1.1\fP, and \fI--tlsv1.2\fP to | ||||
| control the TLS version more precisely (if the SSL backend in use supports such | ||||
| a level of control). | ||||
| .IP "-2, --sslv2" | ||||
| (SSL) | ||||
| Forces curl to use SSL version 2 when negotiating with a remote SSL server. | ||||
| @@ -230,7 +268,9 @@ server sends an unsupported encoding, curl will report an error. | ||||
| .IP "--connect-timeout <seconds>" | ||||
| Maximum time in seconds that you allow the connection to the server to take. | ||||
| This only limits the connection phase, once curl has connected this option is | ||||
| of no more use. See also the \fI-m, --max-time\fP option. | ||||
| of no more use.  Since 7.32.0, this option accepts decimal values, but the | ||||
| actual timeout will decrease in accuracy as the specified timeout increases in | ||||
| decimal precision. See also the \fI-m, --max-time\fP option. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--create-dirs" | ||||
| @@ -267,10 +307,11 @@ data pieces specified will be merged together with a separating | ||||
| chunk that looks like \&'name=daniel&skill=lousy'. | ||||
|  | ||||
| If you start the data with the letter @, the rest should be a file name to | ||||
| read the data from, or - if you want curl to read the data from stdin.  The | ||||
| contents of the file must already be URL-encoded. Multiple files can also be | ||||
| specified. Posting data from a file named 'foobar' would thus be done with | ||||
| \fI--data @foobar\fP. | ||||
| read the data from, or - if you want curl to read the data from | ||||
| stdin. Multiple files can also be specified. Posting data from a file | ||||
| named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is | ||||
| told to read from a file like that, carriage returns and newlines will be | ||||
| stripped out. | ||||
| .IP "-D, --dump-header <file>" | ||||
| Write the protocol headers to the specified file. | ||||
|  | ||||
| @@ -292,7 +333,7 @@ whatsoever. | ||||
|  | ||||
| If you start the data with the letter @, the rest should be a filename.  Data | ||||
| is posted in a similar manner as \fI--data-ascii\fP does, except that newlines | ||||
| are preserved and conversions are never done. | ||||
| and carriage returns are preserved and conversions are never done. | ||||
|  | ||||
| If this option is used several times, the ones following the first will append | ||||
| data as described in \fI-d, --data\fP. | ||||
| @@ -367,8 +408,41 @@ is an alias for \fB--disable-epsv\fP. | ||||
|  | ||||
| Disabling EPSV only changes the passive behavior. If you want to switch to | ||||
| active mode you need to use \fI-P, --ftp-port\fP. | ||||
| .IP "--dns-interface <interface>" | ||||
| Tell curl to send outgoing DNS requests through <interface>. This option | ||||
| is a counterpart to \fI--interface\fP (which does not affect DNS). The | ||||
| supplied string must be an interface name (not an address). | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one. (Added in | ||||
| 7.33.0) | ||||
| .IP "--dns-ipv4-addr <ip-address>" | ||||
| Tell curl to bind to <ip-address> when making IPv4 DNS requests, so that | ||||
| the DNS requests originate from this address. The argument should be a | ||||
| single IPv4 address. | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one.  (Added in | ||||
| 7.33.0) | ||||
| .IP "--dns-ipv6-addr <ip-address>" | ||||
| Tell curl to bind to <ip-address> when making IPv6 DNS requests, so that | ||||
| the DNS requests originate from this address. The argument should be a | ||||
| single IPv6 address. | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one.  (Added in | ||||
| 7.33.0) | ||||
| .IP "--dns-servers <ip-address,ip-address>" | ||||
| Set the list of DNS servers to be used instead of the system default. | ||||
| The list of IP addresses should be separated with commas. Port numbers | ||||
| may also optionally be given as \fI:<port-number>\fP after each IP | ||||
| address. | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one.  (Added in | ||||
| 7.33.0) | ||||
| .IP "-e, --referer <URL>" | ||||
| (HTTP) Sends the "Referer Page" information to the HTTP server. This can also | ||||
| (HTTP) Sends the "Referrer Page" information to the HTTP server. This can also | ||||
| be set with the \fI-H, --header\fP flag of course.  When used with | ||||
| \fI-L, --location\fP you can append ";auto" to the --referer URL to make curl | ||||
| automatically set the previous URL when it follows a Location: header. The | ||||
| @@ -378,7 +452,8 @@ If this option is used several times, the last one will be used. | ||||
| .IP "-E, --cert <certificate[:password]>" | ||||
| (SSL) Tells curl to use the specified client certificate file when getting a | ||||
| file with HTTPS, FTPS or another SSL-based protocol. The certificate must be | ||||
| in PEM format.  If the optional password isn't specified, it will be queried | ||||
| in PKCS#12 format if using Secure Transport, or PEM format if using any other | ||||
| engine.  If the optional password isn't specified, it will be queried | ||||
| for on the terminal. Note that this option assumes a \&"certificate" file that | ||||
| is the private key and the private certificate concatenated! See \fI--cert\fP | ||||
| and \fI--key\fP to specify them independently. | ||||
| @@ -393,7 +468,11 @@ nickname contains ":", it needs to be preceded by "\\" so that it is not | ||||
| recognized as password delimiter.  If the nickname contains "\\", it needs to | ||||
| be escaped as "\\\\" so that it is not recognized as an escape character. | ||||
|  | ||||
| (iOS and Mac OS X only) If curl is built against Secure Transport, then the certificate string must match the name of a certificate that's in the system or user keychain. The private key corresponding to the certificate, and certificate chain (if any),  must also be present in the keychain. | ||||
| (iOS and Mac OS X only) If curl is built against Secure Transport, then the | ||||
| certificate string can either be the name of a certificate/private key in the | ||||
| system or user keychain, or the path to a PKCS#12-encoded certificate and | ||||
| private key. If you want to use a file from the current directory, please | ||||
| precede it with "./" prefix, in order to avoid confusion with a nickname. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--engine <name>" | ||||
| @@ -587,10 +666,10 @@ you can specify URLs that contain the letters {}[] without having them being | ||||
| interpreted by curl itself. Note that these letters are not normal legal URL | ||||
| contents but they should be encoded according to the URI standard. | ||||
| .IP "-G, --get" | ||||
| When used, this option will make all data specified with \fI-d, --data\fP or | ||||
| \fI--data-binary\fP to be used in an HTTP GET request instead of the POST | ||||
| request that otherwise would be used. The data will be appended to the URL | ||||
| with a '?' separator. | ||||
| When used, this option will make all data specified with \fI-d, --data\fP, | ||||
| \fI--data-binary\fP or \fI--data-urlencode\fP to be used in an HTTP GET | ||||
| request instead of the POST request that otherwise would be used. The data | ||||
| will be appended to the URL with a '?' separator. | ||||
|  | ||||
| If used in combination with -I, the POST data will instead be appended to the | ||||
| URL with a HEAD request. | ||||
| @@ -652,6 +731,9 @@ cookies when they're closed down. | ||||
| (HTTP) This option tells the \fI-O, --remote-name\fP option to use the | ||||
| server-specified Content-Disposition filename instead of extracting a filename | ||||
| from the URL. | ||||
|  | ||||
| There's no attempt to decode %-sequences (yet) in the provided file name, so | ||||
| this option may provide you with rather unexpected file names. | ||||
| .IP "-k, --insecure" | ||||
| (SSL) This option explicitly allows curl to perform "insecure" SSL connections | ||||
| and transfers. All SSL connections are attempted to be made secure by using | ||||
| @@ -663,16 +745,21 @@ See this online resource for further details: | ||||
| .IP "-K, --config <config file>" | ||||
| Specify which config file to read curl arguments from. The config file is a | ||||
| text file in which command line arguments can be written which then will be | ||||
| used as if they were written on the actual command line. Options and their | ||||
| parameters must be specified on the same config file line, separated by | ||||
| whitespace, colon, the equals sign or any combination thereof (however, | ||||
| the preferred separator is the equals sign). If the parameter is to contain | ||||
| whitespace, the parameter must be enclosed within quotes. Within double | ||||
| quotes, the following escape sequences are available: \\\\, \\", \\t, \\n, | ||||
| \\r and \\v. A backslash preceding any other letter is ignored. If the | ||||
| first column of a config line is a '#' character, the rest of the line will be | ||||
| treated as a comment. Only write one option per physical line in the config | ||||
| file. | ||||
| used as if they were written on the actual command line. | ||||
|  | ||||
| Options and their parameters must be specified on the same config file line, | ||||
| separated by whitespace, colon, or the equals sign. Long option names can | ||||
| optionally be given in the config file without the initial double dashes and | ||||
| if so, the colon or equals characters can be used as separators. If the option | ||||
| is specified with one or two dashes, there can be no colon or equals character | ||||
| between the option and its parameter. | ||||
|  | ||||
| If the parameter is to contain whitespace, the parameter must be enclosed | ||||
| within quotes. Within double quotes, the following escape sequences are | ||||
| available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash preceding any other | ||||
| letter is ignored. If the first column of a config line is a '#' character, | ||||
| the rest of the line will be treated as a comment. Only write one option per | ||||
| physical line in the config file. | ||||
|  | ||||
| Specify the filename to -K, --config as '-' to make curl read the file from | ||||
| stdin. | ||||
| @@ -683,9 +770,6 @@ line. So, it could look similar to this: | ||||
|  | ||||
| url = "http://curl.haxx.se/docs/" | ||||
|  | ||||
| Long option names can optionally be given in the config file without the | ||||
| initial double dashes. | ||||
|  | ||||
| When curl is invoked, it always (unless \fI-q\fP is used) checks for a default | ||||
| config file and uses it if found. The default config file is checked for in | ||||
| the following places in this order: | ||||
| @@ -747,15 +831,23 @@ see if your curl supports it. | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-l, --list-only" | ||||
| (FTP) | ||||
| When listing an FTP directory, this switch forces a name-only view. | ||||
| Especially useful if you want to machine-parse the contents of an FTP | ||||
| directory since the normal directory view doesn't use a standard look | ||||
| or format. | ||||
| When listing an FTP directory, this switch forces a name-only view. This is | ||||
| especially useful if the user wants to machine-parse the contents of an FTP | ||||
| directory since the normal directory view doesn't use a standard look or | ||||
| format. When used like this, the option causes a NLST command to be sent to | ||||
| the server instead of LIST. | ||||
|  | ||||
| This option causes an FTP NLST command to be sent.  Some FTP servers | ||||
| list only files in their response to NLST; they do not include | ||||
| subdirectories and symbolic links. | ||||
| Note: Some FTP servers list only files in their response to NLST; they do not | ||||
| include sub-directories and symbolic links. | ||||
|  | ||||
| (POP3) | ||||
| When retrieving a specific email from POP3, this switch forces a LIST command | ||||
| to be performed instead of RETR. This is particularly useful if the user wants | ||||
| to see if a specific message id exists on the server and what size it is. | ||||
|  | ||||
| Note: When combined with \fI-X, --request <command>\fP, this option can be used | ||||
| to send an UIDL command instead, so the user may use the email's unique | ||||
| identifier rather than it's message id to make the request. (Added in 7.21.5) | ||||
| .IP "-L, --location" | ||||
| (HTTP/HTTPS) If the server reports that the requested page has moved to a | ||||
| different location (indicated with a Location: header and a 3XX response code), | ||||
| @@ -810,7 +902,10 @@ Basic authentication). | ||||
| .IP "-m, --max-time <seconds>" | ||||
| Maximum time in seconds that you allow the whole operation to take.  This is | ||||
| useful for preventing your batch jobs from hanging for hours due to slow | ||||
| networks or links going down.  See also the \fI--connect-timeout\fP option. | ||||
| networks or links going down.  Since 7.32.0, this option accepts decimal | ||||
| values, but the actual timeout will decrease in accuracy as the specified | ||||
| timeout increases in decimal precision.  See also the \fI--connect-timeout\fP | ||||
| option. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--mail-auth <address>" | ||||
| @@ -832,10 +927,18 @@ return with exit code 63. | ||||
| files this option has no effect even if the file transfer ends up being larger | ||||
| than this given limit. This concerns both FTP and HTTP transfers. | ||||
| .IP "--mail-rcpt <address>" | ||||
| (SMTP) Specify a single address that the given mail should get sent to. This | ||||
| option can be used multiple times to specify many recipients. | ||||
| (SMTP) Specify a single address, user name or mailing list name. | ||||
|  | ||||
| (Added in 7.20.0) | ||||
| When performing a mail transfer, the recipient should specify a valid email | ||||
| address to send the mail to. (Added in 7.20.0) | ||||
|  | ||||
| When performing an address verification (VRFY command), the recipient should be | ||||
| specified as the user name or user name and domain (as per Section 3.5 of | ||||
| RFC5321). (Added in 7.34.0) | ||||
|  | ||||
| When performing a mailing list expand (EXPN command), the recipient should be | ||||
| specified using the mailing list name, such as "Friends" or "London-Office". | ||||
| (Added in 7.34.0) | ||||
| .IP "--max-redirs <num>" | ||||
| Set maximum number of redirection-followings allowed. If \fI-L, --location\fP | ||||
| is used, this option can be used to prevent curl from following redirections | ||||
| @@ -991,7 +1094,19 @@ Consequentially, the file will be saved in the current working directory. If | ||||
| you want the file saved in a different directory, make sure you change current | ||||
| working directory before you invoke curl with the \fB-O, --remote-name\fP flag! | ||||
|  | ||||
| There is no URL decoding done on the file name. If it has %20 or other URL | ||||
| encoded parts of the name, they will end up as-is as file name. | ||||
|  | ||||
| You may use this option as many times as the number of URLs you have. | ||||
| .IP "--oauth2-bearer" | ||||
| (IMAP, POP3, SMTP) | ||||
| Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token | ||||
| is used in conjunction with the user name which can be specified as part of the | ||||
| \fI--url\fP or \fI-u, --user\fP options. | ||||
|  | ||||
| The Bearer Token and user name are formatted according to RFC 6750. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-p, --proxytunnel" | ||||
| When an HTTP proxy is used (\fI-x, --proxy\fP), this option will cause non-HTTP | ||||
| protocols to attempt to tunnel through the proxy instead of merely using it to | ||||
| @@ -1043,6 +1158,13 @@ ubiquitous in web browsers, so curl does the conversion by default to maintain | ||||
| consistency. However, a server may require a POST to remain a POST after such | ||||
| a redirection. This option is meaningful only when using \fI-L, --location\fP | ||||
| (Added in 7.19.1) | ||||
| .IP "--post303" | ||||
| (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert POST requests | ||||
| into GET requests when following a 303 redirection. The non-RFC behaviour is | ||||
| ubiquitous in web browsers, so curl does the conversion by default to maintain | ||||
| consistency. However, a server may require a POST to remain a POST after such | ||||
| a redirection. This option is meaningful only when using \fI-L, --location\fP | ||||
| (Added in 7.26.0) | ||||
| .IP "--proto <protocols>" | ||||
| Tells curl to use the listed protocols for its initial retrieval. Protocols | ||||
| are evaluated left to right, are comma separated, and are each a protocol | ||||
| @@ -1280,6 +1402,9 @@ If this option is used several times, the last one will be used. | ||||
| Silent or quiet mode. Don't show progress meter or error messages.  Makes Curl | ||||
| mute. It will still output the data you ask for, potentially even to the | ||||
| terminal/stdout unless you redirect it. | ||||
| .IP "--sasl-ir" | ||||
| Enable initial response in SASL authentication. | ||||
| (Added in 7.31.0) | ||||
| .IP "-S, --show-error" | ||||
| When used with \fI-s\fP it makes curl show an error message if it fails. | ||||
| .IP "--ssl" | ||||
| @@ -1299,7 +1424,7 @@ option name can still be used but will be removed in a future version. | ||||
| .IP "--ssl-allow-beast" | ||||
| (SSL) This option tells curl to not work around a security flaw in the SSL3 | ||||
| and TLS1.0 protocols known as BEAST.  If this option isn't used, the SSL layer | ||||
| may use work-arounds known to cause interoperability problems with some older | ||||
| may use workarounds known to cause interoperability problems with some older | ||||
| SSL implementations. WARNING: this option loosens the SSL security, and by | ||||
| using this flag you ask for exactly that.  (Added in 7.25.0) | ||||
| .IP "--socks4 <host[:port]>" | ||||
| @@ -1418,14 +1543,26 @@ Set TLS authentication type. Currently, the only supported option is "SRP", | ||||
| for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are | ||||
| specified but \fI--tlsauthtype\fP is not, then this option defaults to "SRP". | ||||
| (Added in 7.21.4) | ||||
| .IP "--tlsuser <user>" | ||||
| Set username for use with the TLS authentication method specified with | ||||
| \fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also be set.  (Added in | ||||
| 7.21.4) | ||||
| .IP "--tlspassword <password>" | ||||
| Set password for use with the TLS authentication method specified with | ||||
| \fI--tlsauthtype\fP. Requires that \fI--tlsuser\fP also be set.  (Added in | ||||
| 7.21.4) | ||||
| .IP "--tlsuser <user>" | ||||
| Set username for use with the TLS authentication method specified with | ||||
| \fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also be set.  (Added in | ||||
| 7.21.4) | ||||
| .IP "--tlsv1.0" | ||||
| (SSL) | ||||
| Forces curl to use TLS version 1.0 when negotiating with a remote TLS server. | ||||
| (Added in 7.34.0) | ||||
| .IP "--tlsv1.1" | ||||
| (SSL) | ||||
| Forces curl to use TLS version 1.1 when negotiating with a remote TLS server. | ||||
| (Added in 7.34.0) | ||||
| .IP "--tlsv1.2" | ||||
| (SSL) | ||||
| Forces curl to use TLS version 1.2 when negotiating with a remote TLS server. | ||||
| (Added in 7.34.0) | ||||
| .IP "--tr-encoding" | ||||
| (HTTP) Request a compressed Transfer-Encoding response using one of the | ||||
| algorithms curl supports, and uncompress the data while receiving it. | ||||
| @@ -1455,16 +1592,23 @@ If this option is used several times, the last one will be used. | ||||
| .IP "--trace-time" | ||||
| Prepends a time stamp to each trace or verbose line that curl displays. | ||||
| (Added in 7.14.0) | ||||
| .IP "-u, --user <user:password>" | ||||
| Specify the user name and password to use for server authentication. Overrides | ||||
| \fI-n, --netrc\fP and \fI--netrc-optional\fP. | ||||
| .IP "-u, --user <user:password;options>" | ||||
| Specify the user name, password and optional login options to use for server | ||||
| authentication. Overrides \fI-n, --netrc\fP and \fI--netrc-optional\fP. | ||||
|  | ||||
| If you just give the user name (without entering a colon) curl will prompt for | ||||
| a password. | ||||
| If you simply specify the user name, with or without the login options, curl | ||||
| will prompt for a password. | ||||
|  | ||||
| If you use an SSPI-enabled curl binary and do NTLM authentication, you can | ||||
| force curl to pick up the user name and password from your environment by | ||||
| simply specifying a single colon with this option: "-u :". | ||||
| If you use an SSPI-enabled curl binary and perform NTLM authentication, you | ||||
| can force curl to select the user name and password from your environment by | ||||
| simply specifying a single colon with this option: "-u :" or by specifying the | ||||
| login options on their own, for example "-u ;auth=NTLM". | ||||
|  | ||||
| You can use the optional login options part to specify protocol specific | ||||
| options that may be used during authentication. At present only IMAP, POP3 and | ||||
| SMTP support login options as part of the user login information. For more | ||||
| information about the login options please see RFC 2384, RFC 5092 and IETF | ||||
| draft draft-earhart-url-smtp-00.txt (Added in 7.31.0).  | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-U, --proxy-user <user:password>" | ||||
| @@ -1625,8 +1769,16 @@ to follow location: headers. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-x, --proxy <[protocol://][user:password@]proxyhost[:port]>" | ||||
| Use the specified HTTP proxy. If the port number is not specified, it is | ||||
| assumed at port 1080. | ||||
| Use the specified proxy. | ||||
|  | ||||
| The proxy string can be specified with a protocol:// prefix to specify | ||||
| alternative proxy protocols. Use socks4://, socks4a://, socks5:// or | ||||
| socks5h:// to request the specific SOCKS version to be used. No protocol | ||||
| specified, http:// and all others will be treated as HTTP proxies. (The | ||||
| protocol support was added in curl 7.21.7) | ||||
|  | ||||
| If the port number is not specified in the proxy string, it is assumed to be | ||||
| 1080. | ||||
|  | ||||
| This option overrides existing environment variables that set the proxy to | ||||
| use. If there's an environment variable setting a proxy, you can set proxy to | ||||
| @@ -1645,11 +1797,6 @@ The proxy host can be specified the exact same way as the proxy environment | ||||
| variables, including the protocol prefix (http://) and the embedded user + | ||||
| password. | ||||
|  | ||||
| From 7.21.7, the proxy string may be specified with a protocol:// prefix to | ||||
| specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or | ||||
| socks5h:// to request the specific SOCKS version to be used. No protocol | ||||
| specified, http:// and all others will be treated as HTTP proxies. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-X, --request <command>" | ||||
| (HTTP) Specifies a custom request method to use when communicating with the | ||||
| @@ -1671,11 +1818,20 @@ option. | ||||
| Specifies a custom FTP command to use instead of LIST when doing file lists | ||||
| with FTP. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| (POP3) | ||||
| Specifies a custom POP3 command to use instead of LIST or RETR. (Added in | ||||
| 7.26.0) | ||||
|  | ||||
| (IMAP) | ||||
| Specifies a custom IMAP command to use instead of LIST. (Added in 7.30.0) | ||||
|  | ||||
| (SMTP) | ||||
| Specifies a custom SMTP command to use instead of HELP or VRFY. (Added in 7.34.0) | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--xattr" | ||||
| When saving output to a file, this option tells curl to store certain file | ||||
| metadata in extened file attributes. Currently, the URL is stored in the | ||||
| metadata in extended file attributes. Currently, the URL is stored in the | ||||
| xdg.origin.url attribute and, for HTTP, the content type is stored in | ||||
| the mime_type attribute. If the file system does not support extended | ||||
| attributes, a warning is issued. | ||||
| @@ -1695,7 +1851,7 @@ speed-time seconds it gets aborted. speed-time is set with \fI-y\fP and is 30 | ||||
| if not set. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-z/--time-cond <date expression>|<file>" | ||||
| .IP "-z, --time-cond <date expression>|<file>" | ||||
| (HTTP/FTP) Request a file that has been modified later than the given time and | ||||
| date, or one that has been modified before that time. The <date expression> | ||||
| can be all sorts of date strings or if it doesn't match any internal ones, it | ||||
| @@ -1965,6 +2121,8 @@ RTSP: mismatch of Session Identifiers | ||||
| unable to parse FTP file list | ||||
| .IP 88 | ||||
| FTP chunk callback reported error | ||||
| .IP 89 | ||||
| No connection available, the session will be queued | ||||
| .IP XX | ||||
| More error codes will appear here in future releases. The existing ones | ||||
| are meant to never change. | ||||
|   | ||||
							
								
								
									
										28
									
								
								docs/examples/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								docs/examples/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -20,15 +20,39 @@ httpcustomheader | ||||
| httpput | ||||
| https | ||||
| imap | ||||
| imap-append | ||||
| imap-copy | ||||
| imap-create | ||||
| imap-delete | ||||
| imap-examine | ||||
| imap-fetch | ||||
| imap-list | ||||
| imap-multi | ||||
| imap-noop | ||||
| imap-search | ||||
| imap-ssl | ||||
| imap-store | ||||
| imap-tls | ||||
| multi-app | ||||
| multi-debugcallback | ||||
| multi-double | ||||
| multi-post | ||||
| multi-single | ||||
| persistant | ||||
| pop3-dele | ||||
| pop3-list | ||||
| pop3-multi | ||||
| pop3-noop | ||||
| pop3-retr | ||||
| pop3-ssl | ||||
| pop3-stat | ||||
| pop3-tls | ||||
| pop3-top | ||||
| pop3-uidl | ||||
| pop3s | ||||
| pop3slist | ||||
| post-callback | ||||
| postinmemory | ||||
| postit2 | ||||
| progressfunc | ||||
| resolve | ||||
| @@ -40,8 +64,12 @@ simple | ||||
| simplepost | ||||
| simplesmtp | ||||
| simplessl | ||||
| smtp-expn | ||||
| smtp-mail | ||||
| smtp-multi | ||||
| smtp-ssl | ||||
| smtp-tls | ||||
| smtp-vrfy | ||||
| url2file | ||||
| usercertinmem | ||||
| xmlstream | ||||
|   | ||||
| @@ -4,9 +4,12 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \ | ||||
|   https multi-app multi-debugcallback multi-double multi-post multi-single \ | ||||
|   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 sftpget ftpsget \ | ||||
|   usercertinmem | ||||
|   smtp-mail smtp-multi smtp-ssl smtp-tls smtp-vrfy smtp-expn rtsp \ | ||||
|   externalsocket resolve progressfunc pop3-retr pop3-list pop3-uidl pop3-dele \ | ||||
|   pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi imap-list \ | ||||
|   imap-lsub imap-fetch imap-store imap-append imap-examine imap-search \ | ||||
|   imap-create imap-delete imap-copy imap-noop imap-ssl imap-tls imap-multi \ | ||||
|   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. | ||||
| @@ -14,4 +17,4 @@ 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 href_extractor.c asiohiper.cpp \ | ||||
|   multi-uv.c xmlstream.c | ||||
|   multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -133,7 +133,6 @@ static void mcode_or_die(const char *where, CURLMcode 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; | ||||
|   | ||||
| @@ -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 | ||||
| @@ -98,10 +98,6 @@ int main(void) | ||||
|      * 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); | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -104,7 +104,6 @@ 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; | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -125,7 +125,6 @@ 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; | ||||
|   | ||||
| @@ -22,8 +22,6 @@ | ||||
| #include <stdio.h> | ||||
| #include <fcntl.h> | ||||
| #include <sys/stat.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* | ||||
| @@ -59,7 +57,6 @@ int main(int argc, char **argv) | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   FILE * hd_src ; | ||||
|   int hd ; | ||||
|   struct stat file_info; | ||||
|  | ||||
|   char *file; | ||||
| @@ -72,9 +69,7 @@ int main(int argc, char **argv) | ||||
|   url = argv[2]; | ||||
|  | ||||
|   /* get the file size of the local file */ | ||||
|   hd = open(file, O_RDONLY) ; | ||||
|   fstat(hd, &file_info); | ||||
|   close(hd) ; | ||||
|   stat(file, &file_info); | ||||
|  | ||||
|   /* get a FILE * of the same file, could also be made with | ||||
|      fdopen() from the previous descriptor, but hey this is just | ||||
|   | ||||
							
								
								
									
										115
									
								
								docs/examples/imap-append.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								docs/examples/imap-append.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to send mail using libcurl's IMAP | ||||
|  * capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| #define FROM    "<sender@example.org>" | ||||
| #define TO      "<addressee@example.net>" | ||||
| #define CC      "<info@example.org>" | ||||
|  | ||||
| static const char *payload_text[] = { | ||||
|   "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", | ||||
|   "To: " TO "\r\n", | ||||
|   "From: " FROM "(Example User)\r\n", | ||||
|   "Cc: " CC "(Another example User)\r\n", | ||||
|   "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n", | ||||
|   "Subject: IMAP example message\r\n", | ||||
|   "\r\n", /* empty line to divide headers from body, see RFC5322 */ | ||||
|   "The body of the message starts here.\r\n", | ||||
|   "\r\n", | ||||
|   "It could be a lot of lines, could be MIME encoded, whatever.\r\n", | ||||
|   "Check RFC5322.\r\n", | ||||
|   NULL | ||||
| }; | ||||
|  | ||||
| struct upload_status { | ||||
|   int lines_read; | ||||
| }; | ||||
|  | ||||
| static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) | ||||
| { | ||||
|   struct upload_status *upload_ctx = (struct upload_status *)userp; | ||||
|   const char *data; | ||||
|  | ||||
|   if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   data = payload_text[upload_ctx->lines_read]; | ||||
|  | ||||
|   if(data) { | ||||
|     size_t len = strlen(data); | ||||
|     memcpy(ptr, data, len); | ||||
|     upload_ctx->lines_read++; | ||||
|  | ||||
|     return len; | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|   struct upload_status upload_ctx; | ||||
|  | ||||
|   upload_ctx.lines_read = 0; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This will create a new message 100. Note that you should perform an | ||||
|      * EXAMINE command to obtain the UID of the next message to create and a | ||||
|      * SELECT to ensure you are creating the message in the OUTBOX. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/100"); | ||||
|  | ||||
|     /* In this case, we're using a callback function to specify the data. You | ||||
|      * could just use the CURLOPT_READDATA option to specify a FILE pointer to | ||||
|      * read from. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); | ||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); | ||||
|     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); | ||||
|  | ||||
|     /* Perform the append */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										65
									
								
								docs/examples/imap-copy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								docs/examples/imap-copy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to copy a mail from one mailbox folder | ||||
|  * to another using libcurl's IMAP capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is source mailbox folder to select */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX"); | ||||
|  | ||||
|     /* Set the COPY command specifing the message ID and destination folder */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "COPY 1 FOLDER"); | ||||
|  | ||||
|     /* Note that to perform a move operation you will need to perform the copy, | ||||
|      * then mark the original mail as Deleted and EXPUNGE or CLOSE. Please see | ||||
|      * imap-store.c for more information on deleting messages. */ | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										61
									
								
								docs/examples/imap-create.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/examples/imap-create.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to create a new mailbox folder using | ||||
|  * libcurl's IMAP capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); | ||||
|  | ||||
|     /* Set the CREATE command specifing the new folder name */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "CREATE FOLDER"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										61
									
								
								docs/examples/imap-delete.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/examples/imap-delete.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to delete an existing mailbox folder | ||||
|  * using libcurl's IMAP capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); | ||||
|  | ||||
|     /* Set the DELETE command specifing the existing folder */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE FOLDER"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										61
									
								
								docs/examples/imap-examine.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/examples/imap-examine.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to obtain information about a mailbox | ||||
|  * folder using libcurl's IMAP capabilities via the EXAMINE command. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); | ||||
|  | ||||
|     /* Set the EXAMINE command specifing the mailbox folder */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXAMINE OUTBOX"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -22,6 +22,12 @@ | ||||
| #include <stdio.h> | ||||
| #include <curl/curl.h> | ||||
| 
 | ||||
| /* This is a simple example showing how to fetch mail using libcurl's IMAP
 | ||||
|  * capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
| 
 | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
| @@ -30,15 +36,23 @@ int main(void) | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
| 
 | ||||
|     /* This will fetch the mailbox named "foobar" */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/foobar"); | ||||
|     /* This will fetch message 1 from the user's inbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1"); | ||||
| 
 | ||||
|     /* Perform the fetch */ | ||||
|     res = curl_easy_perform(curl); | ||||
| 
 | ||||
|     /* always cleanup */ | ||||
|     /* 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); | ||||
|   } | ||||
| 
 | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										60
									
								
								docs/examples/imap-list.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								docs/examples/imap-list.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to list the folders within an IMAP | ||||
|  * mailbox. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This will list the folders within the user's mailbox. If you want to | ||||
|      * list the folders within a specific folder, for example the inbox, then | ||||
|      * specify the folder as a path in the URL such as /INBOX */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); | ||||
|  | ||||
|     /* Perform the list */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										62
									
								
								docs/examples/imap-lsub.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								docs/examples/imap-lsub.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to list the subscribed folders within | ||||
|  * an IMAP mailbox. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); | ||||
|  | ||||
|     /* Set the LSUB command. Note the syntax is very similar to that of a LIST | ||||
|        command. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "LSUB \"\" *"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										145
									
								
								docs/examples/imap-multi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								docs/examples/imap-multi.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to fetch mail using libcurl's IMAP | ||||
|  * capabilities. It builds on the imap-fetch.c example to demonstrate how to | ||||
|  * use libcurl's multi interface. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 | ||||
|  | ||||
| static struct timeval tvnow(void) | ||||
| { | ||||
|   struct timeval now; | ||||
|  | ||||
|   /* time() returns the value of time in seconds since the epoch */ | ||||
|   now.tv_sec = (long)time(NULL); | ||||
|   now.tv_usec = 0; | ||||
|  | ||||
|   return now; | ||||
| } | ||||
|  | ||||
| static long tvdiff(struct timeval newer, struct timeval older) | ||||
| { | ||||
|   return (newer.tv_sec - older.tv_sec) * 1000 + | ||||
|     (newer.tv_usec - older.tv_usec) / 1000; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLM *mcurl; | ||||
|   int still_running = 1; | ||||
|   struct timeval mp_start; | ||||
|  | ||||
|   curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(!curl) | ||||
|     return 1; | ||||
|  | ||||
|   mcurl = curl_multi_init(); | ||||
|   if(!mcurl) | ||||
|     return 2; | ||||
|  | ||||
|   /* Set username and password */ | ||||
|   curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|   curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|   /* This will fetch message 1 from the user's inbox */ | ||||
|   curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1"); | ||||
|  | ||||
|   /* Tell the multi stack about our easy handle */ | ||||
|   curl_multi_add_handle(mcurl, curl); | ||||
|  | ||||
|   /* Record the start time which we can use later */ | ||||
|   mp_start = tvnow(); | ||||
|  | ||||
|   /* We start some action by calling perform right away */ | ||||
|   curl_multi_perform(mcurl, &still_running); | ||||
|  | ||||
|   while(still_running) { | ||||
|     struct timeval timeout; | ||||
|     fd_set fdread; | ||||
|     fd_set fdwrite; | ||||
|     fd_set fdexcep; | ||||
|     int maxfd = -1; | ||||
|     int rc; | ||||
|  | ||||
|     long curl_timeo = -1; | ||||
|  | ||||
|     /* Initialise the file descriptors */ | ||||
|     FD_ZERO(&fdread); | ||||
|     FD_ZERO(&fdwrite); | ||||
|     FD_ZERO(&fdexcep); | ||||
|  | ||||
|     /* Set a suitable timeout to play around with */ | ||||
|     timeout.tv_sec = 1; | ||||
|     timeout.tv_usec = 0; | ||||
|  | ||||
|     curl_multi_timeout(mcurl, &curl_timeo); | ||||
|     if(curl_timeo >= 0) { | ||||
|       timeout.tv_sec = curl_timeo / 1000; | ||||
|       if(timeout.tv_sec > 1) | ||||
|         timeout.tv_sec = 1; | ||||
|       else | ||||
|         timeout.tv_usec = (curl_timeo % 1000) * 1000; | ||||
|     } | ||||
|  | ||||
|     /* Get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
|        function calls.  On success, the value of maxfd is guaranteed to be | ||||
|        greater or equal than -1.  We call select(maxfd + 1, ...), specially in | ||||
|        case of (maxfd == -1), we call select(0, ...), which is basically equal | ||||
|        to sleep. */ | ||||
|     rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { | ||||
|       fprintf(stderr, | ||||
|               "ABORTING: Since it seems that we would have run forever.\n"); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     switch(rc) { | ||||
|     case -1:  /* select error */ | ||||
|       break; | ||||
|     case 0:   /* timeout */ | ||||
|     default:  /* action */ | ||||
|       curl_multi_perform(mcurl, &still_running); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* Always cleanup */ | ||||
|   curl_multi_remove_handle(mcurl, curl); | ||||
|   curl_multi_cleanup(mcurl); | ||||
|   curl_easy_cleanup(curl); | ||||
|   curl_global_cleanup(); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										61
									
								
								docs/examples/imap-noop.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/examples/imap-noop.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to perform a noop using libcurl's IMAP | ||||
|  * capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); | ||||
|  | ||||
|     /* Set the NOOP command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOOP"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										65
									
								
								docs/examples/imap-search.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								docs/examples/imap-search.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to search for new messages using | ||||
|  * libcurl's IMAP capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is mailbox folder to select */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX"); | ||||
|  | ||||
|     /* Set the SEARCH command specifing what we want to search for. Note that | ||||
|      * this can contain a message sequence set and a number of search criteria | ||||
|      * keywords including flags such as ANSWERED, DELETED, DRAFT, FLAGGED, NEW, | ||||
|      * RECENT and SEEN. For more information about the search criteria please | ||||
|      * see RFC-3501 section 6.4.4.   */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH NEW"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -22,52 +22,64 @@ | ||||
| #include <stdio.h> | ||||
| #include <curl/curl.h> | ||||
| 
 | ||||
| /* This is a simple example showing how to fetch mail using libcurl's IMAP
 | ||||
|  * capabilities. It builds on the imap-fetch.c example adding transport | ||||
|  * security to protect the authentication details from being snooped. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
| 
 | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   CURLcode res = CURLE_OK; | ||||
| 
 | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
| 
 | ||||
|     /* This will list every message of the given mailbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3s://user@pop.example.com/"); | ||||
|     /* This will fetch message 1 from the user's inbox. Note the use of
 | ||||
|     * imaps:// rather than imap:// to request a SSL based connection. */
 | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.example.com/INBOX/;UID=1"); | ||||
| 
 | ||||
| #ifdef SKIP_PEER_VERIFICATION | ||||
|     /*
 | ||||
|      * If you want to connect to a site who isn't using a certificate that is | ||||
|     /* If you want to connect to a site who isn't using a certificate that is
 | ||||
|      * signed by one of the certs in the CA bundle you have, you can skip the | ||||
|      * verification of the server's certificate. This makes the connection | ||||
|      * A LOT LESS SECURE. | ||||
|      * | ||||
|      * If you have a CA cert for the server stored someplace else than in the | ||||
|      * default bundle, then the CURLOPT_CAPATH option might come handy for | ||||
|      * you. | ||||
|      */ | ||||
|      * you. */ | ||||
| #ifdef SKIP_PEER_VERIFICATION | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef SKIP_HOSTNAME_VERFICATION | ||||
|     /*
 | ||||
|      * If the site you're connecting to uses a different host name that what | ||||
|     /* If the site you're connecting to uses a different host name that what
 | ||||
|      * they have mentioned in their server certificate's commonName (or | ||||
|      * subjectAltName) fields, libcurl will refuse to connect. You can skip | ||||
|      * this check, but this will make the connection less secure. | ||||
|      */ | ||||
|      * this check, but this will make the connection less secure. */ | ||||
| #ifdef SKIP_HOSTNAME_VERFICATION | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
| #endif | ||||
| 
 | ||||
|     /* Perform the request, res will get the return code */ | ||||
|     /* Since the traffic will be encrypted, it is very useful to turn on debug
 | ||||
|      * information within libcurl to see what is happening during the | ||||
|      * transfer */ | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
| 
 | ||||
|     /* Perform the fetch */ | ||||
|     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 */ | ||||
|     /* Always cleanup */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|   return 0; | ||||
| 
 | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										76
									
								
								docs/examples/imap-store.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								docs/examples/imap-store.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to modify an existing mail using | ||||
|  * libcurl's IMAP capabilities with the STORE command. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is the mailbox folder to select */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX"); | ||||
|  | ||||
|     /* Set the STORE command with the Deleted flag for message 1. Note that | ||||
|      * you can use the STORE command to set other flags such as Seen, Answered, | ||||
|      * Flagged, Draft and Recent. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "STORE 1 +Flags \\Deleted"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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 { | ||||
|       /* Set the EXPUNGE command, although you can use the CLOSE command if you | ||||
|        * don't want to know the result of the STORE */ | ||||
|       curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXPUNGE"); | ||||
|  | ||||
|       /* Perform the second custom request */ | ||||
|       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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										84
									
								
								docs/examples/imap-tls.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								docs/examples/imap-tls.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to fetch mail using libcurl's IMAP | ||||
|  * capabilities. It builds on the imap-fetch.c example adding transport | ||||
|  * security to protect the authentication details from being snooped. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.30.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This will fetch message 1 from the user's inbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1"); | ||||
|  | ||||
|     /* In this example, we'll start with a plain text connection, and upgrade | ||||
|      * to Transport Layer Security (TLS) using the STARTTLS command. Be careful | ||||
|      * of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer | ||||
|      * will continue anyway - see the security discussion in the libcurl | ||||
|      * tutorial for more details. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); | ||||
|  | ||||
|     /* If your server doesn't have a valid certificate, then you can disable | ||||
|      * part of the Transport Layer Security protection by setting the | ||||
|      * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false). | ||||
|      *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
|      *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
|      * That is, in general, a bad idea. It is still better than sending your | ||||
|      * authentication details in plain text though. | ||||
|      * Instead, you should get the issuer certificate (or the host certificate | ||||
|      * if the certificate is self-signed) and add it to the set of certificates | ||||
|      * that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See | ||||
|      * docs/SSLCERTS for more information. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem"); | ||||
|  | ||||
|     /* Since the traffic will be encrypted, it is very useful to turn on debug | ||||
|      * information within libcurl to see what is happening during the | ||||
|      * transfer */ | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
|  | ||||
|     /* Perform the fetch */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										64
									
								
								docs/examples/pop3-dele.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								docs/examples/pop3-dele.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to delete an existing mail using | ||||
|  * libcurl's POP3 capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.26.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* You can specify the message either in the URL or DELE command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); | ||||
|  | ||||
|     /* Set the DELE command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELE"); | ||||
|  | ||||
|     /* Do not perform a transfer as DELE returns no data */ | ||||
|     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										58
									
								
								docs/examples/pop3-list.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								docs/examples/pop3-list.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example using libcurl's POP3 capabilities to list the | ||||
|  * contents of a mailbox. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This will list every message of the given mailbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); | ||||
|  | ||||
|     /* Perform the list */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										145
									
								
								docs/examples/pop3-multi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								docs/examples/pop3-multi.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to retrieve mail using libcurl's POP3 | ||||
|  * capabilities. It builds on the pop3-retr.c example to demonstrate how to use | ||||
|  * libcurl's multi interface. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 | ||||
|  | ||||
| static struct timeval tvnow(void) | ||||
| { | ||||
|   struct timeval now; | ||||
|  | ||||
|   /* time() returns the value of time in seconds since the epoch */ | ||||
|   now.tv_sec = (long)time(NULL); | ||||
|   now.tv_usec = 0; | ||||
|  | ||||
|   return now; | ||||
| } | ||||
|  | ||||
| static long tvdiff(struct timeval newer, struct timeval older) | ||||
| { | ||||
|   return (newer.tv_sec - older.tv_sec) * 1000 + | ||||
|     (newer.tv_usec - older.tv_usec) / 1000; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLM *mcurl; | ||||
|   int still_running = 1; | ||||
|   struct timeval mp_start; | ||||
|  | ||||
|   curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(!curl) | ||||
|     return 1; | ||||
|  | ||||
|   mcurl = curl_multi_init(); | ||||
|   if(!mcurl) | ||||
|     return 2; | ||||
|  | ||||
|   /* Set username and password */ | ||||
|   curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|   curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|   /* This will retreive message 1 from the user's mailbox */ | ||||
|   curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); | ||||
|  | ||||
|   /* Tell the multi stack about our easy handle */ | ||||
|   curl_multi_add_handle(mcurl, curl); | ||||
|  | ||||
|   /* Record the start time which we can use later */ | ||||
|   mp_start = tvnow(); | ||||
|  | ||||
|   /* We start some action by calling perform right away */ | ||||
|   curl_multi_perform(mcurl, &still_running); | ||||
|  | ||||
|   while(still_running) { | ||||
|     struct timeval timeout; | ||||
|     fd_set fdread; | ||||
|     fd_set fdwrite; | ||||
|     fd_set fdexcep; | ||||
|     int maxfd = -1; | ||||
|     int rc; | ||||
|  | ||||
|     long curl_timeo = -1; | ||||
|  | ||||
|     /* Initialise the file descriptors */ | ||||
|     FD_ZERO(&fdread); | ||||
|     FD_ZERO(&fdwrite); | ||||
|     FD_ZERO(&fdexcep); | ||||
|  | ||||
|     /* Set a suitable timeout to play around with */ | ||||
|     timeout.tv_sec = 1; | ||||
|     timeout.tv_usec = 0; | ||||
|  | ||||
|     curl_multi_timeout(mcurl, &curl_timeo); | ||||
|     if(curl_timeo >= 0) { | ||||
|       timeout.tv_sec = curl_timeo / 1000; | ||||
|       if(timeout.tv_sec > 1) | ||||
|         timeout.tv_sec = 1; | ||||
|       else | ||||
|         timeout.tv_usec = (curl_timeo % 1000) * 1000; | ||||
|     } | ||||
|  | ||||
|     /* Get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
|        function calls. On success, the value of maxfd is guaranteed to be | ||||
|        greater or equal than -1. We call select(maxfd + 1, ...), specially in | ||||
|        case of (maxfd == -1), we call select(0, ...), which is basically equal | ||||
|        to sleep. */ | ||||
|     rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { | ||||
|       fprintf(stderr, | ||||
|               "ABORTING: Since it seems that we would have run forever.\n"); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     switch(rc) { | ||||
|     case -1:  /* select error */ | ||||
|       break; | ||||
|     case 0:   /* timeout */ | ||||
|     default:  /* action */ | ||||
|       curl_multi_perform(mcurl, &still_running); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* Always cleanup */ | ||||
|   curl_multi_remove_handle(mcurl, curl); | ||||
|   curl_multi_cleanup(mcurl); | ||||
|   curl_easy_cleanup(curl); | ||||
|   curl_global_cleanup(); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										64
									
								
								docs/examples/pop3-noop.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								docs/examples/pop3-noop.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to perform a noop using libcurl's POP3 | ||||
|  * capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.26.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); | ||||
|  | ||||
|     /* Set the NOOP command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOOP"); | ||||
|  | ||||
|     /* Do not perform a transfer as NOOP returns no data */ | ||||
|     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										58
									
								
								docs/examples/pop3-retr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								docs/examples/pop3-retr.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to retrieve mail using libcurl's POP3 | ||||
|  * capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This will retreive message 1 from the user's mailbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); | ||||
|  | ||||
|     /* Perform the retr */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -22,52 +22,64 @@ | ||||
| #include <stdio.h> | ||||
| #include <curl/curl.h> | ||||
| 
 | ||||
| /* This is a simple example showing how to retrieve mail using libcurl's POP3
 | ||||
|  * capabilities. It builds on the pop3-retr.c example adding transport | ||||
|  * security to protect the authentication details from being snooped. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
| 
 | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   CURLcode res = CURLE_OK; | ||||
| 
 | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
| 
 | ||||
|     /* This will only fetch the message with ID "1" of the given mailbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3s://user@pop.example.com/1"); | ||||
|     /* This will retreive message 1 from the user's mailbox. Note the use of
 | ||||
|      * pop3s:// rather than pop3:// to request a SSL based connection. */
 | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3s://pop.example.com/1"); | ||||
| 
 | ||||
| #ifdef SKIP_PEER_VERIFICATION | ||||
|     /*
 | ||||
|      * If you want to connect to a site who isn't using a certificate that is | ||||
|     /* If you want to connect to a site who isn't using a certificate that is
 | ||||
|      * signed by one of the certs in the CA bundle you have, you can skip the | ||||
|      * verification of the server's certificate. This makes the connection | ||||
|      * A LOT LESS SECURE. | ||||
|      * | ||||
|      * If you have a CA cert for the server stored someplace else than in the | ||||
|      * default bundle, then the CURLOPT_CAPATH option might come handy for | ||||
|      * you. | ||||
|      */ | ||||
|      * you. */ | ||||
| #ifdef SKIP_PEER_VERIFICATION | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef SKIP_HOSTNAME_VERFICATION | ||||
|     /*
 | ||||
|      * If the site you're connecting to uses a different host name that what | ||||
|     /* If the site you're connecting to uses a different host name that what
 | ||||
|      * they have mentioned in their server certificate's commonName (or | ||||
|      * subjectAltName) fields, libcurl will refuse to connect. You can skip | ||||
|      * this check, but this will make the connection less secure. | ||||
|      */ | ||||
|      * this check, but this will make the connection less secure. */ | ||||
| #ifdef SKIP_HOSTNAME_VERFICATION | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
| #endif | ||||
| 
 | ||||
|     /* Perform the request, res will get the return code */ | ||||
|     /* Since the traffic will be encrypted, it is very useful to turn on debug
 | ||||
|      * information within libcurl to see what is happening during the | ||||
|      * transfer */ | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
| 
 | ||||
|     /* Perform the retr */ | ||||
|     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 */ | ||||
|     /* Always cleanup */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|   return 0; | ||||
| 
 | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										64
									
								
								docs/examples/pop3-stat.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								docs/examples/pop3-stat.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to obtain message statistics using | ||||
|  * libcurl's POP3 capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.26.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); | ||||
|  | ||||
|     /* Set the STAT command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "STAT"); | ||||
|  | ||||
|     /* Do not perform a transfer as the data is in the response */ | ||||
|     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										84
									
								
								docs/examples/pop3-tls.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								docs/examples/pop3-tls.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to retrieve mail using libcurl's POP3 | ||||
|  * capabilities. It builds on the pop3-retr.c example adding transport | ||||
|  * security to protect the authentication details from being snooped. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This will retreive message 1 from the user's mailbox */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); | ||||
|  | ||||
|     /* In this example, we'll start with a plain text connection, and upgrade | ||||
|      * to Transport Layer Security (TLS) using the STLS command. Be careful of | ||||
|      * using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer | ||||
|      * will continue anyway - see the security discussion in the libcurl | ||||
|      * tutorial for more details. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); | ||||
|  | ||||
|     /* If your server doesn't have a valid certificate, then you can disable | ||||
|      * part of the Transport Layer Security protection by setting the | ||||
|      * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false). | ||||
|      *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
|      *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
|      * That is, in general, a bad idea. It is still better than sending your | ||||
|      * authentication details in plain text though. | ||||
|      * Instead, you should get the issuer certificate (or the host certificate | ||||
|      * if the certificate is self-signed) and add it to the set of certificates | ||||
|      * that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See | ||||
|      * docs/SSLCERTS for more information. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem"); | ||||
|  | ||||
|     /* Since the traffic will be encrypted, it is very useful to turn on debug | ||||
|      * information within libcurl to see what is happening during the | ||||
|      * transfer */ | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
|  | ||||
|     /* Perform the retr */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										61
									
								
								docs/examples/pop3-top.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/examples/pop3-top.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example showing how to retrieve only the headers of a mail | ||||
|  * using libcurl's POP3 capabilities. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.26.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); | ||||
|  | ||||
|     /* Set the TOP command for message 1 to only include the headers */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "TOP 1 0"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										61
									
								
								docs/examples/pop3-uidl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/examples/pop3-uidl.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 a simple example using libcurl's POP3 capabilities to list the | ||||
|  * contents of a mailbox by unique ID. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.26.0 or above. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is just the server URL */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); | ||||
|  | ||||
|     /* Set the UIDL command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "UIDL"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
							
								
								
									
										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; | ||||
| } | ||||
| @@ -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,6 +59,19 @@ 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; | ||||
| @@ -68,9 +84,28 @@ 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); | ||||
|  | ||||
|   | ||||
							
								
								
									
										105
									
								
								docs/examples/sessioninfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								docs/examples/sessioninfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  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. | ||||
|  * | ||||
|  ***************************************************************************/ | ||||
|  | ||||
| /* Note that this example currently requires cURL to be linked against | ||||
|    GnuTLS (and this program must also be linked against -lgnutls). */ | ||||
|  | ||||
| #include <stdio.h> | ||||
|  | ||||
| #include <curl/curl.h> | ||||
| #include <gnutls/gnutls.h> | ||||
|  | ||||
| static CURL *curl; | ||||
|  | ||||
| static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream) | ||||
| { | ||||
|   const struct curl_tlssessioninfo *info; | ||||
|   unsigned int cert_list_size; | ||||
|   const gnutls_datum_t *chainp; | ||||
|   CURLcode res; | ||||
|  | ||||
|   (void)stream; | ||||
|   (void)ptr; | ||||
|  | ||||
|   res = curl_easy_getinfo(curl, CURLINFO_TLS_SESSION, &info); | ||||
|  | ||||
|   if(!res) { | ||||
|     switch(info->backend) { | ||||
|     case CURLSSLBACKEND_GNUTLS: | ||||
|       /* info->internals is now the gnutls_session_t */ | ||||
|       chainp = gnutls_certificate_get_peers(info->internals, &cert_list_size); | ||||
|       if((chainp) && (cert_list_size)) { | ||||
|         unsigned int i; | ||||
|  | ||||
|         for(i = 0; i < cert_list_size; i++) { | ||||
|           gnutls_x509_crt_t cert; | ||||
|           gnutls_datum_t dn; | ||||
|  | ||||
|           if(GNUTLS_E_SUCCESS == gnutls_x509_crt_init(&cert)) { | ||||
|             if(GNUTLS_E_SUCCESS == | ||||
|                gnutls_x509_crt_import(cert, &chainp[i], GNUTLS_X509_FMT_DER)) { | ||||
|               if(GNUTLS_E_SUCCESS == | ||||
|                  gnutls_x509_crt_print(cert, GNUTLS_CRT_PRINT_FULL, &dn)) { | ||||
|                 fprintf(stderr, "Certificate #%d: %.*s", i, dn.size, dn.data); | ||||
|  | ||||
|                 gnutls_free(dn.data); | ||||
|               } | ||||
|             } | ||||
|  | ||||
|             gnutls_x509_crt_deinit(cert); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       break; | ||||
|     case CURLSSLBACKEND_NONE: | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return size * nmemb; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/"); | ||||
|  | ||||
|     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu); | ||||
|  | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
|  | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L); | ||||
|  | ||||
|     (void) curl_easy_perform(curl); | ||||
|  | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|  | ||||
|   curl_global_cleanup(); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
| @@ -1,87 +0,0 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2011, 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 <string.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|  | ||||
|   /* value for envelope reverse-path */ | ||||
|   static const char *from = "<bradh@example.com>"; | ||||
|  | ||||
|   /* this becomes the envelope forward-path */ | ||||
|   static const char *to = "<bradh@example.net>"; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* this is the URL for your mailserver - you can also use an smtps:// URL | ||||
|      * here */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.net."); | ||||
|  | ||||
|     /* Note that this option isn't strictly required, omitting it will result in | ||||
|      * libcurl will sent the MAIL FROM command with no sender data. All | ||||
|      * autoresponses should have an empty reverse-path, and should be directed | ||||
|      * to the address in the reverse-path which triggered them. Otherwise, they | ||||
|      * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. | ||||
|      */ | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from); | ||||
|  | ||||
|     /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array.  */ | ||||
|     recipients = curl_slist_append(recipients, to); | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|     /* You provide the payload (headers and the body of the message) as the | ||||
|      * "data" element. There are two choices, either: | ||||
|      * - provide a callback function and specify the function name using the | ||||
|      * CURLOPT_READFUNCTION option; or | ||||
|      * - just provide a FILE pointer that can be used to read the data from. | ||||
|      * The easiest case is just to read from standard input, (which is available | ||||
|      * as a FILE pointer) as shown here. | ||||
|      */ | ||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, stdin); | ||||
|  | ||||
|     /* 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); | ||||
|  | ||||
|     /* curl won't send the QUIT command until you call cleanup, so you should be | ||||
|      * able to re-use this connection for additional messages (setting | ||||
|      * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling | ||||
|      * curl_easy_perform() again. It may not be a good idea to keep the | ||||
|      * connection open for a very long time though (more than a few minutes may | ||||
|      * result in the server timing out the connection), and you do want to clean | ||||
|      * up in the end. | ||||
|      */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										73
									
								
								docs/examples/smtp-expn.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								docs/examples/smtp-expn.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 <string.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* This is a simple example showing how to expand an email mailing list. | ||||
|  * | ||||
|  * Notes: | ||||
|  * | ||||
|  * 1) This example requires libcurl 7.34.0 or above. | ||||
|  * 2) Not all email servers support this command. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* This is the URL for your mailserver */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); | ||||
|  | ||||
|     /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array  */ | ||||
|     recipients = curl_slist_append(recipients, "Friends"); | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|     /* Set the EXPN command */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXPN"); | ||||
|  | ||||
|     /* Perform the custom request */ | ||||
|     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); | ||||
|  | ||||
|     /* Curl won't send the QUIT command until you call cleanup, so you should | ||||
|      * be able to re-use this connection for additional requests. It may not be | ||||
|      * a good idea to keep the connection open for a very long time though | ||||
|      * (more than a few minutes may result in the server timing out the | ||||
|      * connection) and you do want to clean up in the end. | ||||
|      */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										137
									
								
								docs/examples/smtp-mail.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								docs/examples/smtp-mail.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 <string.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* This is a simple example showing how to send mail using libcurl's SMTP | ||||
|  * capabilities. For an exmaple of using the multi interface please see | ||||
|  * smtp-multi.c. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| #define FROM    "<sender@example.org>" | ||||
| #define TO      "<addressee@example.net>" | ||||
| #define CC      "<info@example.org>" | ||||
|  | ||||
| static const char *payload_text[] = { | ||||
|   "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", | ||||
|   "To: " TO "\r\n", | ||||
|   "From: " FROM "(Example User)\r\n", | ||||
|   "Cc: " CC "(Another example User)\r\n", | ||||
|   "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n", | ||||
|   "Subject: SMTP example message\r\n", | ||||
|   "\r\n", /* empty line to divide headers from body, see RFC5322 */ | ||||
|   "The body of the message starts here.\r\n", | ||||
|   "\r\n", | ||||
|   "It could be a lot of lines, could be MIME encoded, whatever.\r\n", | ||||
|   "Check RFC5322.\r\n", | ||||
|   NULL | ||||
| }; | ||||
|  | ||||
| struct upload_status { | ||||
|   int lines_read; | ||||
| }; | ||||
|  | ||||
| static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) | ||||
| { | ||||
|   struct upload_status *upload_ctx = (struct upload_status *)userp; | ||||
|   const char *data; | ||||
|  | ||||
|   if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   data = payload_text[upload_ctx->lines_read]; | ||||
|  | ||||
|   if(data) { | ||||
|     size_t len = strlen(data); | ||||
|     memcpy(ptr, data, len); | ||||
|     upload_ctx->lines_read++; | ||||
|  | ||||
|     return len; | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|   struct upload_status upload_ctx; | ||||
|  | ||||
|   upload_ctx.lines_read = 0; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* This is the URL for your mailserver */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); | ||||
|  | ||||
|     /* Note that this option isn't strictly required, omitting it will result in | ||||
|      * libcurl sending the MAIL FROM command with empty sender data. All | ||||
|      * autoresponses should have an empty reverse-path, and should be directed | ||||
|      * to the address in the reverse-path which triggered them. Otherwise, they | ||||
|      * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. | ||||
|      */ | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); | ||||
|  | ||||
|     /* Add two recipients, in this particular case they correspond to the | ||||
|      * To: and Cc: addressees in the header, but they could be any kind of | ||||
|      * recipient. */ | ||||
|     recipients = curl_slist_append(recipients, TO); | ||||
|     recipients = curl_slist_append(recipients, CC); | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|     /* We're using a callback function to specify the payload (the headers and | ||||
|      * body of the message). You could just use the CURLOPT_READDATA option to | ||||
|      * specify a FILE pointer to read from. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); | ||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); | ||||
|     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); | ||||
|  | ||||
|     /* Send the message */ | ||||
|     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); | ||||
|  | ||||
|     /* curl won't send the QUIT command until you call cleanup, so you should be | ||||
|      * able to re-use this connection for additional messages (setting | ||||
|      * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling | ||||
|      * curl_easy_perform() again. It may not be a good idea to keep the | ||||
|      * connection open for a very long time though (more than a few minutes may | ||||
|      * result in the server timing out the connection), and you do want to clean | ||||
|      * up in the end. | ||||
|      */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -19,75 +19,78 @@ | ||||
|  * KIND, either express or implied. | ||||
|  * | ||||
|  ***************************************************************************/ | ||||
| /* This is an example application source code sending SMTP mail using the | ||||
|  * multi interface. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* | ||||
|  * This is the list of basic details you need to tweak to get things right. | ||||
| /* This is an example showing how to send mail using libcurl's SMTP | ||||
|  * capabilities. It builds on the smtp-mail.c example to demonstrate how to use | ||||
|  * libcurl's multi interface. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
| #define USERNAME "user@example.com" | ||||
| #define PASSWORD "123qwerty" | ||||
| #define SMTPSERVER "smtp.example.com" | ||||
| #define SMTPPORT ":587" /* it is a colon+port string, but you can set it | ||||
|                            to "" to use the default port */ | ||||
| #define RECIPIENT "<recipient@example.com>" | ||||
| #define MAILFROM "<realuser@example.com>" | ||||
|  | ||||
| #define FROM     "<sender@example.com>" | ||||
| #define TO       "<recipient@example.com>" | ||||
| #define CC       "<info@example.com>" | ||||
|  | ||||
| #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 | ||||
|  | ||||
| /* Note that you should include the actual meta data headers here as well if | ||||
|    you want the mail to have a Subject, another From:, show a To: or whatever | ||||
|    you think your mail should feature! */ | ||||
| static const char *text[]={ | ||||
|   "one\n", | ||||
|   "two\n", | ||||
|   "three\n", | ||||
|   " Hello, this is CURL email SMTP\n", | ||||
| static const char *payload_text[] = { | ||||
|   "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", | ||||
|   "To: " TO "\r\n", | ||||
|   "From: " FROM "(Example User)\r\n", | ||||
|   "Cc: " CC "(Another example User)\r\n", | ||||
|   "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n", | ||||
|   "Subject: SMTP multi example message\r\n", | ||||
|   "\r\n", /* empty line to divide headers from body, see RFC5322 */ | ||||
|   "The body of the message starts here.\r\n", | ||||
|   "\r\n", | ||||
|   "It could be a lot of lines, could be MIME encoded, whatever.\r\n", | ||||
|   "Check RFC5322.\r\n", | ||||
|   NULL | ||||
| }; | ||||
|  | ||||
| struct WriteThis { | ||||
|   int counter; | ||||
| struct upload_status { | ||||
|   int lines_read; | ||||
| }; | ||||
|  | ||||
| static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) | ||||
| static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) | ||||
| { | ||||
|   struct WriteThis *pooh = (struct WriteThis *)userp; | ||||
|   struct upload_status *upload_ctx = (struct upload_status *)userp; | ||||
|   const char *data; | ||||
|  | ||||
|   if(size*nmemb < 1) | ||||
|   if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   data = text[pooh->counter]; | ||||
|   data = payload_text[upload_ctx->lines_read]; | ||||
|  | ||||
|   if(data) { | ||||
|     size_t len = strlen(data); | ||||
|     memcpy(ptr, data, len); | ||||
|     pooh->counter++; /* advance pointer */ | ||||
|     upload_ctx->lines_read++; | ||||
|  | ||||
|     return len; | ||||
|   } | ||||
|   return 0;                         /* no more data left to deliver */ | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static struct timeval tvnow(void) | ||||
| { | ||||
|   /* | ||||
|   ** time() returns the value of time in seconds since the Epoch. | ||||
|   */ | ||||
|   struct timeval now; | ||||
|  | ||||
|   /* time() returns the value of time in seconds since the epoch */ | ||||
|   now.tv_sec = (long)time(NULL); | ||||
|   now.tv_usec = 0; | ||||
|  | ||||
|   return now; | ||||
| } | ||||
|  | ||||
| static long tvdiff(struct timeval newer, struct timeval older) | ||||
| { | ||||
|   return (newer.tv_sec-older.tv_sec)*1000+ | ||||
|     (newer.tv_usec-older.tv_usec)/1000; | ||||
|   return (newer.tv_sec - older.tv_sec) * 1000 + | ||||
|     (newer.tv_usec - older.tv_usec) / 1000; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| @@ -96,10 +99,10 @@ int main(void) | ||||
|   CURLM *mcurl; | ||||
|   int still_running = 1; | ||||
|   struct timeval mp_start; | ||||
|    struct WriteThis pooh; | ||||
|    struct curl_slist* rcpt_list = NULL; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|   struct upload_status upload_ctx; | ||||
|  | ||||
|    pooh.counter = 0; | ||||
|   upload_ctx.lines_read = 0; | ||||
|  | ||||
|   curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
|  | ||||
| @@ -111,47 +114,56 @@ int main(void) | ||||
|   if(!mcurl) | ||||
|     return 2; | ||||
|  | ||||
|    rcpt_list = curl_slist_append(rcpt_list, RECIPIENT); | ||||
|    /* more addresses can be added here | ||||
|       rcpt_list = curl_slist_append(rcpt_list, "<others@example.com>"); | ||||
|    */ | ||||
|   /* This is the URL for your mailserver */ | ||||
|   curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); | ||||
|  | ||||
|    curl_easy_setopt(curl, CURLOPT_URL, "smtp://" SMTPSERVER SMTPPORT); | ||||
|    curl_easy_setopt(curl, CURLOPT_USERNAME, USERNAME); | ||||
|    curl_easy_setopt(curl, CURLOPT_PASSWORD, PASSWORD); | ||||
|    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); | ||||
|    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, MAILFROM); | ||||
|    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt_list); | ||||
|    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); | ||||
|    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
|    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
|    curl_easy_setopt(curl, CURLOPT_READDATA, &pooh); | ||||
|    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
|    curl_easy_setopt(curl, CURLOPT_SSLVERSION, 0L); | ||||
|    curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L); | ||||
|   /* Note that this option isn't strictly required, omitting it will result in | ||||
|    * libcurl sending the MAIL FROM command with empty sender data. All | ||||
|    * autoresponses should have an empty reverse-path, and should be directed | ||||
|    * to the address in the reverse-path which triggered them. Otherwise, they | ||||
|    * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. | ||||
|    */ | ||||
|   curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); | ||||
|  | ||||
|   /* Add two recipients, in this particular case they correspond to the | ||||
|    * To: and Cc: addressees in the header, but they could be any kind of | ||||
|    * recipient. */ | ||||
|   recipients = curl_slist_append(recipients, TO); | ||||
|   recipients = curl_slist_append(recipients, CC); | ||||
|   curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|   /* We're using a callback function to specify the payload (the headers and | ||||
|    * body of the message). You could just use the CURLOPT_READDATA option to | ||||
|    * specify a FILE pointer to read from. */ | ||||
|   curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); | ||||
|   curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); | ||||
|   curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); | ||||
|  | ||||
|   /* Tell the multi stack about our easy handle */ | ||||
|   curl_multi_add_handle(mcurl, curl); | ||||
|  | ||||
|   /* Record the start time which we can use later */ | ||||
|   mp_start = tvnow(); | ||||
|  | ||||
|   /* we start some action by calling perform right away */ | ||||
|   /* We start some action by calling perform right away */ | ||||
|   curl_multi_perform(mcurl, &still_running); | ||||
|  | ||||
|   while(still_running) { | ||||
|     struct timeval timeout; | ||||
|     int rc; /* select() return code */ | ||||
|  | ||||
|     fd_set fdread; | ||||
|     fd_set fdwrite; | ||||
|     fd_set fdexcep; | ||||
|     int maxfd = -1; | ||||
|     int rc; | ||||
|  | ||||
|     long curl_timeo = -1; | ||||
|  | ||||
|     /* Initialise the file descriptors */ | ||||
|     FD_ZERO(&fdread); | ||||
|     FD_ZERO(&fdwrite); | ||||
|     FD_ZERO(&fdexcep); | ||||
|  | ||||
|     /* set a suitable timeout to play around with */ | ||||
|     /* Set a suitable timeout to play around with */ | ||||
|     timeout.tv_sec = 1; | ||||
|     timeout.tv_usec = 0; | ||||
|  | ||||
| @@ -164,7 +176,7 @@ int main(void) | ||||
|         timeout.tv_usec = (curl_timeo % 1000) * 1000; | ||||
|     } | ||||
|  | ||||
|     /* get file descriptors from the transfers */ | ||||
|     /* Get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
| @@ -172,18 +184,16 @@ int main(void) | ||||
|        greater or equal than -1.  We call select(maxfd + 1, ...), specially in | ||||
|        case of (maxfd == -1), we call select(0, ...), which is basically equal | ||||
|        to sleep. */ | ||||
|  | ||||
|     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     if (tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { | ||||
|       fprintf(stderr, "ABORTING TEST, since it seems " | ||||
|               "that it would have run forever.\n"); | ||||
|     if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { | ||||
|       fprintf(stderr, | ||||
|               "ABORTING: Since it seems that we would have run forever.\n"); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     switch(rc) { | ||||
|     case -1: | ||||
|       /* select error */ | ||||
|     case -1:  /* select error */ | ||||
|       break; | ||||
|     case 0:   /* timeout */ | ||||
|     default:  /* action */ | ||||
| @@ -192,12 +202,14 @@ int main(void) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   curl_slist_free_all(rcpt_list); | ||||
|   /* Free the list of recipients */ | ||||
|   curl_slist_free_all(recipients); | ||||
|  | ||||
|   /* Always cleanup */ | ||||
|   curl_multi_remove_handle(mcurl, curl); | ||||
|   curl_multi_cleanup(mcurl); | ||||
|   curl_easy_cleanup(curl); | ||||
|   curl_global_cleanup(); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										161
									
								
								docs/examples/smtp-ssl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								docs/examples/smtp-ssl.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 <string.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* This is a simple example showing how to send mail using libcurl's SMTP | ||||
|  * capabilities. It builds on the smtp-mail.c example to add authentication | ||||
|  * and, more importantly, transport security to protect the authentication | ||||
|  * details from being snooped. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| #define FROM    "<sender@example.org>" | ||||
| #define TO      "<addressee@example.net>" | ||||
| #define CC      "<info@example.org>" | ||||
|  | ||||
| static const char *payload_text[] = { | ||||
|   "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", | ||||
|   "To: " TO "\r\n", | ||||
|   "From: " FROM "(Example User)\r\n", | ||||
|   "Cc: " CC "(Another example User)\r\n", | ||||
|   "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n", | ||||
|   "Subject: SMTP SSL example message\r\n", | ||||
|   "\r\n", /* empty line to divide headers from body, see RFC5322 */ | ||||
|   "The body of the message starts here.\r\n", | ||||
|   "\r\n", | ||||
|   "It could be a lot of lines, could be MIME encoded, whatever.\r\n", | ||||
|   "Check RFC5322.\r\n", | ||||
|   NULL | ||||
| }; | ||||
|  | ||||
| struct upload_status { | ||||
|   int lines_read; | ||||
| }; | ||||
|  | ||||
| static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) | ||||
| { | ||||
|   struct upload_status *upload_ctx = (struct upload_status *)userp; | ||||
|   const char *data; | ||||
|  | ||||
|   if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   data = payload_text[upload_ctx->lines_read]; | ||||
|  | ||||
|   if(data) { | ||||
|     size_t len = strlen(data); | ||||
|     memcpy(ptr, data, len); | ||||
|     upload_ctx->lines_read++; | ||||
|  | ||||
|     return len; | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res = CURLE_OK; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|   struct upload_status upload_ctx; | ||||
|  | ||||
|   upload_ctx.lines_read = 0; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is the URL for your mailserver. Note the use of smtps:// rather | ||||
|      * than smtp:// to request a SSL based connection. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "smtps://mainserver.example.net"); | ||||
|  | ||||
|     /* If you want to connect to a site who isn't using a certificate that is | ||||
|      * signed by one of the certs in the CA bundle you have, you can skip the | ||||
|      * verification of the server's certificate. This makes the connection | ||||
|      * A LOT LESS SECURE. | ||||
|      * | ||||
|      * If you have a CA cert for the server stored someplace else than in the | ||||
|      * default bundle, then the CURLOPT_CAPATH option might come handy for | ||||
|      * you. */ | ||||
| #ifdef SKIP_PEER_VERIFICATION | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); | ||||
| #endif | ||||
|  | ||||
|     /* If the site you're connecting to uses a different host name that what | ||||
|      * they have mentioned in their server certificate's commonName (or | ||||
|      * subjectAltName) fields, libcurl will refuse to connect. You can skip | ||||
|      * this check, but this will make the connection less secure. */ | ||||
| #ifdef SKIP_HOSTNAME_VERFICATION | ||||
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); | ||||
| #endif | ||||
|  | ||||
|     /* Note that this option isn't strictly required, omitting it will result in | ||||
|      * libcurl sending the MAIL FROM command with empty sender data. All | ||||
|      * autoresponses should have an empty reverse-path, and should be directed | ||||
|      * to the address in the reverse-path which triggered them. Otherwise, they | ||||
|      * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. | ||||
|      */ | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); | ||||
|  | ||||
|     /* Add two recipients, in this particular case they correspond to the | ||||
|      * To: and Cc: addressees in the header, but they could be any kind of | ||||
|      * recipient. */ | ||||
|     recipients = curl_slist_append(recipients, TO); | ||||
|     recipients = curl_slist_append(recipients, CC); | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|     /* We're using a callback function to specify the payload (the headers and | ||||
|      * body of the message). You could just use the CURLOPT_READDATA option to | ||||
|      * specify a FILE pointer to read from. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); | ||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); | ||||
|     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); | ||||
|  | ||||
|     /* Since the traffic will be encrypted, it is very useful to turn on debug | ||||
|      * information within libcurl to see what is happening during the | ||||
|      * transfer */ | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
|  | ||||
|     /* Send the message */ | ||||
|     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); | ||||
|  | ||||
|     /* Always cleanup */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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,26 +24,29 @@ | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* This is a simple example showing how to send mail using libcurl's SMTP | ||||
|  * capabilities. It builds on the simplesmtp.c example, adding some | ||||
|  * authentication and transport security. | ||||
|  * capabilities. It builds on the smtp-mail.c example to add authentication | ||||
|  * and, more importantly, transport security to protect the authentication | ||||
|  * details from being snooped. | ||||
|  * | ||||
|  * Note that this example requires libcurl 7.20.0 or above. | ||||
|  */ | ||||
|  | ||||
| #define FROM    "<sender@example.org>" | ||||
| #define TO      "<addressee@example.net>" | ||||
| #define CC      "<info@example.org>" | ||||
|  | ||||
| static const char *payload_text[]={ | ||||
|   "Date: Mon, 29 Nov 2010 21:54:29 +1100\n", | ||||
|   "To: " TO "\n", | ||||
|   "From: " FROM "(Example User)\n", | ||||
|   "Cc: " CC "(Another example User)\n", | ||||
|   "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\n", | ||||
|   "Subject: SMTP TLS example message\n", | ||||
|   "\n", /* empty line to divide headers from body, see RFC5322 */ | ||||
|   "The body of the message starts here.\n", | ||||
|   "\n", | ||||
|   "It could be a lot of lines, could be MIME encoded, whatever.\n", | ||||
|   "Check RFC5322.\n", | ||||
| static const char *payload_text[] = { | ||||
|   "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", | ||||
|   "To: " TO "\r\n", | ||||
|   "From: " FROM "(Example User)\r\n", | ||||
|   "Cc: " CC "(Another example User)\r\n", | ||||
|   "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n", | ||||
|   "Subject: SMTP TLS example message\r\n", | ||||
|   "\r\n", /* empty line to divide headers from body, see RFC5322 */ | ||||
|   "The body of the message starts here.\r\n", | ||||
|   "\r\n", | ||||
|   "It could be a lot of lines, could be MIME encoded, whatever.\r\n", | ||||
|   "Check RFC5322.\r\n", | ||||
|   NULL | ||||
| }; | ||||
|  | ||||
| @@ -56,33 +59,38 @@ static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) | ||||
|   struct upload_status *upload_ctx = (struct upload_status *)userp; | ||||
|   const char *data; | ||||
|  | ||||
|   if ((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { | ||||
|   if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   data = payload_text[upload_ctx->lines_read]; | ||||
|  | ||||
|   if (data) { | ||||
|   if(data) { | ||||
|     size_t len = strlen(data); | ||||
|     memcpy(ptr, data, len); | ||||
|     upload_ctx->lines_read ++; | ||||
|     upload_ctx->lines_read++; | ||||
|  | ||||
|     return len; | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   CURLcode res = CURLE_OK; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|   struct upload_status upload_ctx; | ||||
|  | ||||
|   upload_ctx.lines_read = 0; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if (curl) { | ||||
|   if(curl) { | ||||
|     /* Set username and password */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); | ||||
|  | ||||
|     /* This is the URL for your mailserver. Note the use of port 587 here, | ||||
|      * instead of the normal SMTP port (25). Port 587 is commonly used for | ||||
|      * secure mail submission (see RFC4403), but you should use whatever | ||||
| @@ -106,18 +114,17 @@ int main(void) | ||||
|      * Instead, you should get the issuer certificate (or the host certificate | ||||
|      * if the certificate is self-signed) and add it to the set of certificates | ||||
|      * that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See | ||||
|      * docs/SSLCERTS for more information. | ||||
|      */ | ||||
|      * docs/SSLCERTS for more information. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem"); | ||||
|  | ||||
|     /* A common reason for requiring transport security is to protect | ||||
|      * authentication details (user names and passwords) from being "snooped" | ||||
|      * on the network. Here is how the user name and password are provided: */ | ||||
|     curl_easy_setopt(curl, CURLOPT_USERNAME, "user@example.net"); | ||||
|     curl_easy_setopt(curl, CURLOPT_PASSWORD, "P@ssw0rd"); | ||||
|  | ||||
|     /* value for envelope reverse-path */ | ||||
|     /* Note that this option isn't strictly required, omitting it will result in | ||||
|      * libcurl sending the MAIL FROM command with empty sender data. All | ||||
|      * autoresponses should have an empty reverse-path, and should be directed | ||||
|      * to the address in the reverse-path which triggered them. Otherwise, they | ||||
|      * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. | ||||
|      */ | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); | ||||
|  | ||||
|     /* Add two recipients, in this particular case they correspond to the | ||||
|      * To: and Cc: addressees in the header, but they could be any kind of | ||||
|      * recipient. */ | ||||
| @@ -125,28 +132,32 @@ int main(void) | ||||
|     recipients = curl_slist_append(recipients, CC); | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|     /* In this case, we're using a callback function to specify the data. You | ||||
|      * could just use the CURLOPT_READDATA option to specify a FILE pointer to | ||||
|      * read from. | ||||
|      */ | ||||
|     /* We're using a callback function to specify the payload (the headers and | ||||
|      * body of the message). You could just use the CURLOPT_READDATA option to | ||||
|      * specify a FILE pointer to read from. */ | ||||
|     curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); | ||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); | ||||
|     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); | ||||
|  | ||||
|     /* Since the traffic will be encrypted, it is very useful to turn on debug | ||||
|      * information within libcurl to see what is happening during the transfer. | ||||
|      */ | ||||
|     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
|  | ||||
|     /* send the message (including headers) */ | ||||
|     /* Send the message */ | ||||
|     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 */ | ||||
|     /* Free the list of recipients */ | ||||
|     curl_slist_free_all(recipients); | ||||
|  | ||||
|     /* Always cleanup */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|   return 0; | ||||
|  | ||||
|   return (int)res; | ||||
| } | ||||
|   | ||||
							
								
								
									
										73
									
								
								docs/examples/smtp-vrfy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								docs/examples/smtp-vrfy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2014, 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 <string.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| /* This is a simple example showing how to verify an email address from an | ||||
|  * SMTP server. | ||||
|  * | ||||
|  * Notes: | ||||
|  * | ||||
|  * 1) This example requires libcurl 7.34.0 or above. | ||||
|  * 2) Not all email servers support this command and even if your email server | ||||
|  *    does support it, it may respond with a 252 response code even though the | ||||
|  *    address doesn't exist. | ||||
|  */ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURL *curl; | ||||
|   CURLcode res; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|  | ||||
|   curl = curl_easy_init(); | ||||
|   if(curl) { | ||||
|     /* This is the URL for your mailserver */ | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); | ||||
|  | ||||
|     /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array  */ | ||||
|     recipients = curl_slist_append(recipients, "<recipient@example.com>"); | ||||
|     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); | ||||
|  | ||||
|     /* Perform the VRFY */ | ||||
|     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); | ||||
|  | ||||
|     /* Curl won't send the QUIT command until you call cleanup, so you should | ||||
|      * be able to re-use this connection for additional requests. It may not be | ||||
|      * a good idea to keep the connection open for a very long time though | ||||
|      * (more than a few minutes may result in the server timing out the | ||||
|      * connection) and you do want to clean up in the end. | ||||
|      */ | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
| @@ -22,8 +22,9 @@ | ||||
| /* 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 | ||||
|  * Note that to maintain simplicity this example does not use a CA certificate  | ||||
|  * for peer verification.  However, some form of peer verification | ||||
|  * must be used in real circumstances when a secure connection is required. | ||||
|  */ | ||||
|  | ||||
| #include <openssl/ssl.h> | ||||
| @@ -152,6 +153,18 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm) | ||||
|     printf("Use Key failed\n"); | ||||
|   } | ||||
|  | ||||
|   /* free resources that have been allocated by openssl functions */ | ||||
|   if (bio) | ||||
|     BIO_free(bio); | ||||
|  | ||||
|   if (kbio) | ||||
|     BIO_free(kbio); | ||||
|  | ||||
|   if (rsa) | ||||
|     RSA_free(rsa); | ||||
|  | ||||
|   if (cert) | ||||
|     X509_free(cert); | ||||
|  | ||||
|   /* all set to go */ | ||||
|   return CURLE_OK ; | ||||
|   | ||||
| @@ -79,9 +79,12 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf			 \ | ||||
|  curl_multi_assign.pdf curl_easy_pause.pdf curl_easy_recv.pdf		 \ | ||||
|  curl_easy_send.pdf curl_multi_socket_action.pdf curl_multi_wait.pdf | ||||
|  | ||||
| m4macrodir = $(datadir)/aclocal | ||||
| dist_m4macro_DATA = libcurl.m4 | ||||
|  | ||||
| CLEANFILES = $(HTMLPAGES) $(PDFPAGES) | ||||
|  | ||||
| EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 ABI \ | ||||
| EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) ABI \ | ||||
|   symbols-in-versions symbols.pl | ||||
| MAN2HTML= roffit --mandir=. < $< >$@ | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2012, 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 | ||||
| @@ -219,8 +219,20 @@ done. The struct reports how many certs it found and then you can extract info | ||||
| for each of those certs by following the linked lists. The info chain is | ||||
| provided in a series of data in the format "name:content" where the content is | ||||
| for the specific named data. See also the certinfo.c example. NOTE: this | ||||
| option is only available in libcurl built with OpenSSL support. (Added in | ||||
| 7.19.1) | ||||
| option is only available in libcurl built with OpenSSL, NSS, GSKit or QsoSSL | ||||
| support. (Added in 7.19.1) | ||||
| .IP CURLINFO_TLS_SESSION | ||||
| Pass a pointer to a 'struct curl_tlsinfo *'.  The pointer will be initialized | ||||
| to refer to a 'struct curl_tlsinfo *' that will contain an enum indicating the | ||||
| SSL library used for the handshake and the respective internal TLS session | ||||
| structure of this underlying SSL library. | ||||
|  | ||||
| This may then be used to extract certificate information in a format | ||||
| convenient for further processing, such as manual validation. NOTE: this | ||||
| option may not be available for all SSL backends; unsupported SSL backends | ||||
| will return 'CURLSSLBACKEND_NONE' to indicate that they are not supported; | ||||
| this does not mean that no SSL backend was used. (Added in 7.34.0) | ||||
|  | ||||
| .IP CURLINFO_CONDITION_UNMET | ||||
| Pass a pointer to a long to receive the number 1 if the condition provided in | ||||
| the previous request didn't match (see \fICURLOPT_TIMECONDITION\fP). Alas, if | ||||
| @@ -232,7 +244,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 +256,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 | ||||
| @@ -31,15 +31,18 @@ curl_easy_pause - pause and unpause a connection | ||||
| Using this function, you can explicitly mark a running connection to get | ||||
| paused, and you can unpause a connection that was previously paused. | ||||
|  | ||||
| A connection can be paused by using this function or by letting the read | ||||
| or the write callbacks return the proper magic return code | ||||
| A connection can be paused by using this function or by letting the read or | ||||
| the write callbacks return the proper magic return code | ||||
| (\fICURL_READFUNC_PAUSE\fP and \fICURL_WRITEFUNC_PAUSE\fP). A write callback | ||||
| 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. | ||||
| @@ -65,9 +68,25 @@ Convenience define that unpauses both directions | ||||
| CURLE_OK (zero) means that the option was set properly, and a non-zero return | ||||
| code means something wrong occurred after the new state was set.  See the | ||||
| \fIlibcurl-errors(3)\fP man page for the full list with descriptions. | ||||
| .SH LIMITATIONS | ||||
| The pausing of transfers does not work with protocols that work without | ||||
| network connectivity, like FILE://. Trying to pause such a transfer, in any | ||||
| direction, will cause problems in the worst case or an error in the best case. | ||||
| .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 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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,33 +25,41 @@ curl_easy_perform - Perform a file transfer | ||||
| .SH SYNOPSIS | ||||
| .B #include <curl/curl.h> | ||||
| .sp | ||||
| .BI "CURLcode curl_easy_perform(CURL *" handle ");" | ||||
| .BI "CURLcode curl_easy_perform(CURL *" easy_handle ");" | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| This function is called after the init and all the \fIcurl_easy_setopt(3)\fP | ||||
| calls are made, and will perform the transfer as described in the options.  It | ||||
| must be called with the same | ||||
| .I handle | ||||
| as input as the curl_easy_init call returned. | ||||
| Invoke this function after \fIcurl_easy_init(3)\fP and all the | ||||
| \fIcurl_easy_setopt(3)\fP calls are made, and will perform the transfer as | ||||
| described in the options. It must be called with the same \fBeasy_handle\fP as | ||||
| input as the \fIcurl_easy_init(3)\fP call returned. | ||||
|  | ||||
| \fIcurl_easy_perform(3)\fP performs the entire request in a blocking manner | ||||
| and returns when done, or if it failed. For non-blocking behavior, see | ||||
| \fIcurl_multi_perform(3)\fP. | ||||
|  | ||||
| You can do any amount of calls to \fIcurl_easy_perform(3)\fP while using the | ||||
| same handle. If you intend to transfer more than one file, you are even | ||||
| encouraged to do so. libcurl will then attempt to re-use the same connection | ||||
| for the following transfers, thus making the operations faster, less CPU | ||||
| intense and using less network resources. Just note that you will have to use | ||||
| \fIcurl_easy_setopt(3)\fP between the invokes to set options for the following | ||||
| curl_easy_perform. | ||||
| same \fBeasy_handle\fP. If you intend to transfer more than one file, you are | ||||
| even encouraged to do so. libcurl will then attempt to re-use the same | ||||
| connection for the following transfers, thus making the operations faster, | ||||
| less CPU intense and using less network resources. Just note that you will | ||||
| have to use \fIcurl_easy_setopt(3)\fP between the invokes to set options for | ||||
| the following curl_easy_perform. | ||||
|  | ||||
| You must never call this function simultaneously from two places using the | ||||
| same handle. Let the function return first before invoking it another time. If | ||||
| you want parallel transfers, you must use several curl handles. | ||||
| same \fBeasy_handle\fP. Let the function return first before invoking it | ||||
| another time. If you want parallel transfers, you must use several curl | ||||
| easy_handles. | ||||
|  | ||||
| While the \fBeasy_handle\fP is added to a multi handle, it cannot be used by | ||||
| \fIcurl_easy_perform(3)\fP. | ||||
| .SH RETURN VALUE | ||||
| 0 means everything was ok, non-zero means an error occurred as | ||||
| CURLE_OK (0) means everything was ok, non-zero means an error occurred as | ||||
| .I <curl/curl.h> | ||||
| defines. If the CURLOPT_ERRORBUFFER was set with | ||||
| .I curl_easy_setopt | ||||
| there will be a readable error message in the error buffer when non-zero is | ||||
| returned. | ||||
| defines - see \fIlibcurl-errors(3)\fP. If the \fBCURLOPT_ERRORBUFFER\fP was | ||||
| set with \fIcurl_easy_setopt(3)\fP there will be a readable error message in | ||||
| the error buffer when non-zero is returned. | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_easy_init "(3), " curl_easy_setopt "(3), " | ||||
| .BR curl_multi_add_handle "(3), " curl_multi_perform "(3), " | ||||
| .BR libcurl-errors "(3), " | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -260,9 +260,9 @@ used to fast forward a file in a resumed upload (instead of reading all | ||||
| uploaded bytes with the normal read function/callback). It is also called to | ||||
| rewind a stream when doing a HTTP PUT or POST with a multi-pass authentication | ||||
| method. The function shall work like "fseek" or "lseek" and accepted SEEK_SET, | ||||
| SEEK_CUR and SEEK_END as argument for origin, although (in 7.18.0) libcurl | ||||
| only passes SEEK_SET. The callback must return 0 (CURL_SEEKFUNC_OK) on | ||||
| success, 1 (CURL_SEEKFUNC_FAIL) to cause the upload operation to fail or 2 | ||||
| SEEK_CUR and SEEK_END as argument for origin, although libcurl currently only | ||||
| passes SEEK_SET. The callback must return 0 (CURL_SEEKFUNC_OK) on success, 1 | ||||
| (CURL_SEEKFUNC_FAIL) to cause the upload operation to fail or 2 | ||||
| (CURL_SEEKFUNC_CANTSEEK) to indicate that while the seek failed, libcurl is | ||||
| free to work around the problem if possible. The latter can sometimes be done | ||||
| by instead reading from the input or similar. | ||||
| @@ -377,10 +377,54 @@ function that performs transfers. | ||||
|  | ||||
| \fICURLOPT_NOPROGRESS\fP must be set to 0 to make this function actually | ||||
| get called. | ||||
| .IP CURLOPT_XFERINFOFUNCTION | ||||
| Pass a pointer to a function that matches the following prototype: | ||||
|  | ||||
| .nf | ||||
| \fBint function(void *clientp, curl_off_t dltotal, curl_off_t dlnow, | ||||
|                 curl_off_t ultotal, curl_off_t ulnow);\fP | ||||
| .fi | ||||
|  | ||||
| This function gets called by libcurl instead of its internal equivalent with a | ||||
| frequent interval. While data is being transferred it will be called very | ||||
| frequently, and during slow periods like when nothing is being transferred it | ||||
| can slow down to about one call per second. | ||||
|  | ||||
| \fIclientp\fP is the pointer set with \fICURLOPT_XFERINFODATA\fP, it is only | ||||
| passed along from the application to the callback. | ||||
|  | ||||
| The callback gets told how much data libcurl will transfer and has | ||||
| transferred, in number of bytes. \fIdltotal\fP is the total number of bytes | ||||
| libcurl expects to download in this transfer. \fIdlnow\fP is the number of | ||||
| bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl | ||||
| expects to upload in this transfer. \fIulnow\fP is the number of bytes | ||||
| uploaded so far. | ||||
|  | ||||
| Unknown/unused argument values passed to the callback will be set to zero | ||||
| (like if you only download data, the upload size will remain 0). Many times | ||||
| the callback will be called one or more times first, before it knows the data | ||||
| sizes so a program must be made to handle that. | ||||
|  | ||||
| Returning a non-zero value from this callback will cause libcurl to abort the | ||||
| transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. | ||||
|  | ||||
| If you transfer data with the multi interface, this function will not be | ||||
| called during periods of idleness unless you call the appropriate libcurl | ||||
| function that performs transfers. | ||||
|  | ||||
| \fICURLOPT_NOPROGRESS\fP must be set to 0 to make this function actually | ||||
| get called. | ||||
|  | ||||
| (Added in 7.32.0) | ||||
| .IP CURLOPT_PROGRESSDATA | ||||
| Pass a pointer that will be untouched by libcurl and passed as the first | ||||
| argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP. | ||||
| The default value of this parameter is unspecified. | ||||
| .IP CURLOPT_XFERINFODATA | ||||
| Pass a pointer that will be untouched by libcurl and passed as the first | ||||
| argument in the progress callback set with \fICURLOPT_XFERINFOFUNCTION\fP. | ||||
| The default value of this parameter is unspecified. This option is an alias | ||||
| for CURLOPT_PROGRESSDATA. (Added in 7.32.0) | ||||
| .IP CURLOPT_HEADERFUNCTION | ||||
| Pass a pointer to a function that matches the following prototype: | ||||
| \fBsize_t function( void *ptr, size_t size, size_t nmemb, void | ||||
| @@ -449,6 +493,10 @@ The data is header (or header-like) data sent to the peer. | ||||
| The data is protocol data received from the peer. | ||||
| .IP CURLINFO_DATA_OUT | ||||
| The data is protocol data sent to the peer. | ||||
| .IP CURLINFO_SSL_DATA_OUT | ||||
| The data is SSL/TLS (binary) data sent to the peer. | ||||
| .IP CURLINFO_SSL_DATA_IN | ||||
| The data is SSL/TLS (binary) data received from the peer. | ||||
| .RE | ||||
| .IP CURLOPT_DEBUGDATA | ||||
| Pass a pointer to whatever you want passed in to your | ||||
| @@ -847,6 +895,19 @@ Active Directory server. | ||||
| For more information about the individual components of a LDAP URL please | ||||
| see RFC4516. | ||||
|  | ||||
| .B RTMP | ||||
|  | ||||
| There's no official URL spec for RTMP so libcurl uses the URL syntax supported | ||||
| by the underlying librtmp library. It has a syntax where it wants a | ||||
| traditional URL, followed by a space and a series of space-separated | ||||
| name=value pairs. | ||||
|  | ||||
| While space is not typically a "legal" letter, libcurl accepts them. When a | ||||
| user wants to pass in a '#' (hash) character it will be treated as a fragment | ||||
| and get cut off by libcurl if provided literally. You will instead have to | ||||
| escape it by providing it as backslash and its ASCII value in hexadecimal: | ||||
| "\\23". | ||||
|  | ||||
| .B NOTES | ||||
|  | ||||
| Starting with version 7.20.0, the fragment part of the URI will not be sent as | ||||
| @@ -879,9 +940,9 @@ Set HTTP proxy to use. The parameter should be a char * to a zero terminated | ||||
| string holding the host name or dotted IP address. To specify port number in | ||||
| this string, append :[port] to the end of the host name. The proxy string may | ||||
| be prefixed with [protocol]:// since any such prefix will be ignored. The | ||||
| proxy's port number may optionally be specified with the separate option. If | ||||
| not specified, libcurl will default to using port 1080 for proxies. | ||||
| \fICURLOPT_PROXYPORT\fP. | ||||
| proxy's port number may optionally be specified with the separate option | ||||
| \fICURLOPT_PROXYPORT\fP. If not specified, libcurl will default to using port | ||||
| 1080 for proxies. | ||||
|  | ||||
| When you tell the library to use a HTTP proxy, libcurl will transparently | ||||
| convert operations to HTTP even if you specify an FTP URL etc. This may have | ||||
| @@ -928,8 +989,8 @@ if one is specified.  The only wildcard available is a single * character, | ||||
| which matches all hosts, and effectively disables the proxy. Each name in this | ||||
| list is matched as either a domain which contains the hostname, or the | ||||
| hostname itself. For example, example.com would match example.com, | ||||
| example.com:80, and www.example.com, but not www.notanexample.com.  (Added in | ||||
| 7.19.4) | ||||
| example.com:80, and www.example.com, but not www.notanexample.com or | ||||
| example.com.othertld.  (Added in 7.19.4) | ||||
| .IP CURLOPT_HTTPPROXYTUNNEL | ||||
| Set the parameter to 1 to make the library tunnel all operations through a | ||||
| given HTTP proxy. There is a big difference between using a proxy and to | ||||
| @@ -1074,7 +1135,7 @@ option is omitted, and \fICURLOPT_NETRC\fP is set, libcurl will attempt to | ||||
| find a .netrc file in the current user's home directory. (Added in 7.10.9) | ||||
| .IP CURLOPT_USERPWD | ||||
| Pass a char * as parameter, pointing to a zero terminated login details string | ||||
| for the connection. The format of which is: [user name]:[password];[options]. | ||||
| for the connection. The format of which is: [user name]:[password]. | ||||
|  | ||||
| When using NTLM, you can set the domain by prepending it to the user name and | ||||
| separating the domain and name with a forward (/) or backward slash (\\). Like | ||||
| @@ -1088,15 +1149,18 @@ and password information to hosts using the initial host name (unless | ||||
| other hosts it will not send the user and password to those. This is enforced | ||||
| to prevent accidental information leakage. | ||||
|  | ||||
| At present only IMAP, POP3 and SMTP support login options as part of the | ||||
| details string. For more information about the login options please see | ||||
| RFC2384, RFC5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). | ||||
|  | ||||
| Use \fICURLOPT_HTTPAUTH\fP to specify the authentication method for HTTP based | ||||
| connections. | ||||
| connections or \fICURLOPT_LOGIN_OPTIONS\fP to control IMAP, POP3 and SMTP | ||||
| options. | ||||
|  | ||||
| The user and password strings are not URL decoded, so there's no way to send | ||||
| in a user name containing a colon using this option. Use \fICURLOPT_USERNAME\fP | ||||
| for that, or include it in the URL. | ||||
| .IP CURLOPT_PROXYUSERPWD | ||||
| Pass a char * as parameter, which should be [user name]:[password] to use for | ||||
| the connection to the HTTP proxy. | ||||
| the connection to the HTTP proxy. Both the name and the password will be URL | ||||
| decoded before use, so to include for example a colon in the user name you | ||||
| should encode it as %3A. | ||||
|  | ||||
| Use \fICURLOPT_PROXYAUTH\fP to specify the authentication method. | ||||
| .IP CURLOPT_USERNAME | ||||
| @@ -1107,14 +1171,26 @@ user name to use for the transfer. | ||||
| authentication. You should not use this option together with the (older) | ||||
| CURLOPT_USERPWD option. | ||||
|  | ||||
| In order to specify the password to be used in conjunction with the user name | ||||
| use the \fICURLOPT_PASSWORD\fP option.  (Added in 7.19.1) | ||||
| To specify the password and login options, along with the user name, use the | ||||
| \fICURLOPT_PASSWORD\fP and \fICURLOPT_LOGIN_OPTIONS\fP options. (Added in | ||||
| 7.19.1) | ||||
| .IP CURLOPT_PASSWORD | ||||
| Pass a char * as parameter, which should be pointing to the zero terminated | ||||
| password to use for the transfer. | ||||
|  | ||||
| The CURLOPT_PASSWORD option should be used in conjunction with | ||||
| the \fICURLOPT_USERNAME\fP option. (Added in 7.19.1) | ||||
| The CURLOPT_PASSWORD option should be used in conjunction with the | ||||
| \fICURLOPT_USERNAME\fP option. (Added in 7.19.1) | ||||
| .IP CURLOPT_LOGIN_OPTIONS | ||||
| (Added in 7.34.0) Pass a char * as parameter, which should be pointing to the | ||||
| zero terminated options string to use for the transfer. | ||||
|  | ||||
| At present only IMAP, POP3 and SMTP support login options. For more | ||||
| information about the login options please see RFC2384, RFC5092 and IETF draft | ||||
| draft-earhart-url-smtp-00.txt | ||||
|  | ||||
| \fBCURLOPT_LOGIN_OPTIONS\fP can be used to set protocol specific login options, | ||||
| such as the preferred authentication mechanism via "AUTH=NTLM" or "AUTH=*", | ||||
| and should be used in conjunction with the \fICURLOPT_USERNAME\fP option. | ||||
| .IP CURLOPT_PROXYUSERNAME | ||||
| Pass a char * as parameter, which should be pointing to the zero terminated | ||||
| user name to use for the transfer while connecting to Proxy. | ||||
| @@ -1234,8 +1310,7 @@ authentication methods it supports and then pick the best one you allow it to | ||||
| use. For some methods, this will induce an extra network round-trip. Set the | ||||
| actual name and password with the \fICURLOPT_PROXYUSERPWD\fP option. The | ||||
| bitmask can be constructed by or'ing together the bits listed above for the | ||||
| \fICURLOPT_HTTPAUTH\fP option. As of this writing, only Basic, Digest and NTLM | ||||
| work. (Added in 7.10.7) | ||||
| \fICURLOPT_HTTPAUTH\fP option. \fICURLOPT_PROXYAUTH\fP was added in 7.10.7 | ||||
| .IP CURLOPT_SASL_IR | ||||
| Pass a long. If the value is 1, curl will send the initial response to the | ||||
| server in the first authentication packet in order to reduce the number of | ||||
| @@ -1245,6 +1320,13 @@ mechanisms and to the IMAP, POP3 and SMTP protocols. (Added in 7.31.0) | ||||
| Note: Whilst IMAP supports this option there is no need to explicitly set it, | ||||
| as libcurl can determine the feature itself when the server supports the | ||||
| SASL-IR CAPABILITY. | ||||
| .IP CURLOPT_XOAUTH2_BEARER | ||||
| Pass a char * as parameter, which should point to the zero terminated OAuth | ||||
| 2.0 Bearer Access Token for use with IMAP, POP3 and SMTP servers that support | ||||
| the OAuth 2.0 Authorization Framework. (Added in 7.33.0) | ||||
|  | ||||
| Note: The user name used to generate the Bearer Token should be supplied via | ||||
| the \fICURLOPT_USERNAME\fP option. | ||||
| .SH HTTP OPTIONS | ||||
| .IP CURLOPT_AUTOREFERER | ||||
| Pass a parameter set to 1 to enable this. When enabled, libcurl will | ||||
| @@ -1541,7 +1623,8 @@ When setting \fICURLOPT_HTTPGET\fP to 1, it will automatically set | ||||
| .IP CURLOPT_HTTP_VERSION | ||||
| Pass a long, set to one of the values described below. They force libcurl to | ||||
| use the specific HTTP versions. This is not sensible to do unless you have a | ||||
| good reason. | ||||
| good reason. You have to set this option if you want to use libcurl's HTTP 2.0 | ||||
| support. | ||||
| .RS | ||||
| .IP CURL_HTTP_VERSION_NONE | ||||
| We don't care about what version the library uses. libcurl will use whatever | ||||
| @@ -1550,6 +1633,9 @@ it thinks fit. | ||||
| Enforce HTTP 1.0 requests. | ||||
| .IP CURL_HTTP_VERSION_1_1 | ||||
| Enforce HTTP 1.1 requests. | ||||
| .IP CURL_HTTP_VERSION_2_0 | ||||
| Attempt HTTP 2.0 requests. libcurl will fall back to HTTP 1.x if HTTP 2.0 | ||||
| can't be negotiated with the server. | ||||
| .RE | ||||
| .IP CURLOPT_IGNORE_CONTENT_LENGTH | ||||
| Ignore the Content-Length header. This is useful for Apache 1.x (and similar | ||||
| @@ -1567,6 +1653,12 @@ Pass a long to tell libcurl how to act on transfer decoding. If set to zero, | ||||
| transfer decoding will be disabled, if set to 1 it is enabled | ||||
| (default). libcurl does chunked transfer decoding by default unless this | ||||
| option is set to zero. (added in 7.16.2) | ||||
| .IP CURLOPT_EXPECT_100_TIMEOUT_MS | ||||
| Pass a long to tell libcurl the number of milliseconds to wait for a server | ||||
| response with the HTTP status 100 (Continue), 417 (Expectation Failed) or | ||||
| similar after sending a HTTP request containing an Expect: 100-continue | ||||
| header. If this times out before a response is received, the request body is | ||||
| sent anyway. By default, libcurl waits 1000 milliseconds. (Added in 7.36.0) | ||||
| .SH SMTP OPTIONS | ||||
| .IP CURLOPT_MAIL_FROM | ||||
| Pass a pointer to a zero terminated string as parameter. This should be used | ||||
| @@ -1587,12 +1679,18 @@ SMTP mail request. The linked list should be a fully valid list of \fBstruct | ||||
| curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to | ||||
| create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire list. | ||||
|  | ||||
| Each recipient should be specified within a pair of angled brackets (<>), | ||||
| however, should you not use an angled bracket as the first character libcurl | ||||
| will assume you provided a single email address and enclose that address | ||||
| within brackets for you. | ||||
| When performing a mail transfer, each recipient should be specified within a | ||||
| pair of angled brackets (<>), however, should you not use an angled bracket as | ||||
| the first character libcurl will assume you provided a single email address and | ||||
| enclose that address within brackets for you. (Added in 7.20.0) | ||||
|  | ||||
| (Added in 7.20.0) | ||||
| When performing an address verification (VRFY command), each recipient should | ||||
| be specified as the user name or user name and domain (as per Section 3.5 of | ||||
| RFC5321). (Added in 7.34.0) | ||||
|  | ||||
| When performing a mailing list expand (EXPN command), each recipient should be | ||||
| specified using the mailing list name, such as "Friends" or "London-Office". | ||||
| (Added in 7.34.0) | ||||
| .IP CURLOPT_MAIL_AUTH | ||||
| Pass a pointer to a zero terminated string as parameter. This will be used | ||||
| to specify the authentication address (identity) of a submitted message that | ||||
| @@ -1964,35 +2062,32 @@ source file to the remote target file. | ||||
| Pass a curl_off_t as parameter. It contains the offset in number of bytes that | ||||
| you want the transfer to start from. (Added in 7.11.0) | ||||
| .IP CURLOPT_CUSTOMREQUEST | ||||
| Pass a pointer to a zero terminated string as parameter. It can be used to | ||||
| specify the request instead of GET or HEAD when performing HTTP based | ||||
| requests, instead of LIST and NLST when performing FTP directory listings and | ||||
| instead of LIST and RETR when issuing POP3 based commands. This is | ||||
| particularly useful, for example, for performing a HTTP DELETE request or a | ||||
| POP3 DELE command. | ||||
|  | ||||
| Please don't perform this at will, on HTTP based requests, by making sure | ||||
| your server supports the command you are sending first. | ||||
| Pass a pointer to a zero terminated string as parameter. | ||||
|  | ||||
| When you change the request method by setting \fBCURLOPT_CUSTOMREQUEST\fP to | ||||
| something, you don't actually change how libcurl behaves or acts in regards | ||||
| to the particular request method, it will only change the actual string sent | ||||
| in the request. | ||||
|  | ||||
| Restore to the internal default by setting this to NULL. | ||||
|  | ||||
| This option can be used to specify the request: | ||||
|  | ||||
| .B HTTP | ||||
|  | ||||
| Instead of GET or HEAD when performing HTTP based requests. This is | ||||
| particularly useful, for example, for performing a HTTP DELETE request. | ||||
|  | ||||
| For example: | ||||
|  | ||||
| With the HTTP protocol when you tell libcurl to do a HEAD request, but then | ||||
| specify a GET though a custom request libcurl will still act as if it sent a | ||||
| HEAD. To switch to a proper HEAD use \fICURLOPT_NOBODY\fP, to switch to a | ||||
| proper POST use \fICURLOPT_POST\fP or \fICURLOPT_POSTFIELDS\fP and to switch | ||||
| to a proper GET use CURLOPT_HTTPGET. | ||||
| When you tell libcurl to do a HEAD request, but then specify a GET though a | ||||
| custom request libcurl will still act as if it sent a HEAD. To switch to a | ||||
| proper HEAD use \fICURLOPT_NOBODY\fP, to switch to a proper POST use | ||||
| \fICURLOPT_POST\fP or \fICURLOPT_POSTFIELDS\fP and to switch to a proper GET | ||||
| use CURLOPT_HTTPGET. | ||||
|  | ||||
| With the POP3 protocol when you tell libcurl to use a custom request it will | ||||
| behave like a LIST or RETR command was sent where it expects data to be | ||||
| returned by the server. As such \fICURLOPT_NOBODY\fP should be used when | ||||
| specifying commands such as DELE and NOOP for example. | ||||
|  | ||||
| Restore to the internal default by setting this to NULL. | ||||
| Please don't perform this at will, on HTTP based requests, by making sure | ||||
| your server supports the command you are sending first. | ||||
|  | ||||
| Many people have wrongly used this option to replace the entire request with | ||||
| their own, including multiple headers and POST contents. While that might | ||||
| @@ -2002,7 +2097,35 @@ could possibly confuse the remote server badly. Use \fICURLOPT_POST\fP and | ||||
| replace or extend the set of headers sent by libcurl. Use | ||||
| \fICURLOPT_HTTP_VERSION\fP to change HTTP version. | ||||
|  | ||||
| (Support for POP3 added in 7.26.0) | ||||
| .B FTP | ||||
|  | ||||
| Instead of LIST and NLST when performing FTP directory listings. | ||||
|  | ||||
| .B IMAP | ||||
|  | ||||
| Instead of LIST when issuing IMAP based requests. (Added in 7.30.0) | ||||
|  | ||||
| .B POP3 | ||||
|  | ||||
| Instead of LIST and RETR when issuing POP3 based requests. (Added in 7.26.0) | ||||
|  | ||||
| For example: | ||||
|  | ||||
| When you tell libcurl to use a custom request it will behave like a LIST or | ||||
| RETR command was sent where it expects data to be returned by the server. As | ||||
| such \fICURLOPT_NOBODY\fP should be used when specifying commands such as | ||||
| DELE and NOOP for example. | ||||
|  | ||||
| .B SMTP | ||||
|  | ||||
| Instead of a HELP or VRFY when issuing SMTP based requests. (Added in 7.34.0) | ||||
|  | ||||
| For example: | ||||
|  | ||||
| Normally a multiline response is returned which can be used, in conjuection with | ||||
| \fICURLOPT_MAIL_RCPT\fP, to specify an EXPN request. If the \fICURLOPT_NOBODY\fP | ||||
| option is specified then the request can be used to issue NOOP and RSET | ||||
| commands. | ||||
| .IP CURLOPT_FILETIME | ||||
| Pass a long. If it is 1, libcurl will attempt to get the modification date of | ||||
| the remote document in this operation. This requires that the remote server | ||||
| @@ -2024,6 +2147,8 @@ as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP. | ||||
| For uploading using SCP, this option or \fICURLOPT_INFILESIZE_LARGE\fP is | ||||
| mandatory. | ||||
|  | ||||
| To "unset" this value again, set it to -1. | ||||
|  | ||||
| When sending emails using SMTP, this command can be used to specify the | ||||
| optional SIZE parameter for the MAIL FROM command. (Added in 7.23.0) | ||||
|  | ||||
| @@ -2036,6 +2161,11 @@ as a curl_off_t. (Added in 7.11.0) | ||||
|  | ||||
| For uploading using SCP, this option or \fICURLOPT_INFILESIZE\fP is mandatory. | ||||
|  | ||||
| To "unset" this value again, set it to -1. | ||||
|  | ||||
| When sending emails using SMTP, this command can be used to specify the | ||||
| optional SIZE parameter for the MAIL FROM command. (Added in 7.23.0) | ||||
|  | ||||
| This option does not limit how much data libcurl will actually send, as that | ||||
| is controlled entirely by what the read callback returns. | ||||
| .IP CURLOPT_UPLOAD | ||||
| @@ -2098,10 +2228,14 @@ In unix-like systems, this might cause signals to be used unless | ||||
|  | ||||
| Default timeout is 0 (zero) which means it never times out. | ||||
| .IP CURLOPT_TIMEOUT_MS | ||||
| Like \fICURLOPT_TIMEOUT\fP but takes number of milliseconds instead. If | ||||
| libcurl is built to use the standard system name resolver, that portion | ||||
| of the transfer will still use full-second resolution for timeouts with | ||||
| a minimum timeout allowed of one second. | ||||
| An alternative to \fICURLOPT_TIMEOUT\fP but takes number of milliseconds | ||||
| instead. If libcurl is built to use the standard system name resolver, that | ||||
| portion of the transfer will still use full-second resolution for timeouts | ||||
| with a minimum timeout allowed of one second. | ||||
|  | ||||
| If both \fICURLOPT_TIMEOUT\fP and \fICURLOPT_TIMEOUT_MS\fP are set, the value | ||||
| set last will be used. | ||||
|  | ||||
| (Added in 7.16.2) | ||||
| .IP CURLOPT_LOW_SPEED_LIMIT | ||||
| Pass a long as parameter. It contains the transfer speed in bytes per second | ||||
| @@ -2115,12 +2249,18 @@ it too slow and abort. | ||||
| Pass a curl_off_t as parameter.  If an upload exceeds this speed (counted in | ||||
| bytes per second) on cumulative average during the transfer, the transfer will | ||||
| pause to keep the average rate less than or equal to the parameter value. | ||||
| Defaults to unlimited speed. (Added in 7.15.5) | ||||
| Defaults to unlimited speed. | ||||
|  | ||||
| This option doesn't affect transfer speeds done with FILE:// URLs. (Added in | ||||
|  7.15.5) | ||||
| .IP CURLOPT_MAX_RECV_SPEED_LARGE | ||||
| Pass a curl_off_t as parameter.  If a download exceeds this speed (counted in | ||||
| bytes per second) on cumulative average during the transfer, the transfer will | ||||
| pause to keep the average rate less than or equal to the parameter | ||||
| value. Defaults to unlimited speed. (Added in 7.15.5) | ||||
| value. Defaults to unlimited speed. | ||||
|  | ||||
| This option doesn't affect transfer speeds done with FILE:// URLs. (Added in | ||||
| 7.15.5) | ||||
| .IP CURLOPT_MAXCONNECTS | ||||
| Pass a long. The set number will be the persistent connection cache size. The | ||||
| set amount will be the maximum amount of simultaneously open connections that | ||||
| @@ -2225,7 +2365,9 @@ ADDRESS can of course be either IPv4 or IPv6 style addressing. | ||||
|  | ||||
| This option effectively pre-populates the DNS cache with entries for the | ||||
| host+port pair so redirects and everything that operations against the | ||||
| HOST+PORT will instead use your provided ADDRESS. | ||||
| HOST+PORT will instead use your provided ADDRESS. Addresses to set with | ||||
| \fICURL_RESOLVE\fP will not time-out from the DNS cache like ordindary | ||||
| entries. | ||||
|  | ||||
| You can remove names from the DNS cache again, to stop providing these fake | ||||
| resolves, by including a string in the linked list that uses the format | ||||
| @@ -2247,6 +2389,36 @@ This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one. | ||||
|  | ||||
| (Added in 7.24.0) | ||||
| .IP CURLOPT_DNS_INTERFACE | ||||
| Pass a char * as parameter. Set the name of the network interface that | ||||
| the DNS resolver should bind to. This must be an interface name (not an | ||||
| address). Set this option to NULL to use the default setting (don't | ||||
| bind to a specific interface). | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one. | ||||
|  | ||||
| (Added in 7.33.0) | ||||
| .IP CURLOPT_DNS_LOCAL_IP4 | ||||
| Set the local IPv4 address that the resolver should bind to. The argument | ||||
| should be of type char * and contain a single IPv4 address as a string. | ||||
| Set this option to NULL to use the default setting (don't | ||||
| bind to a specific IP address). | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one. | ||||
|  | ||||
| (Added in 7.33.0) | ||||
| .IP CURLOPT_DNS_LOCAL_IP6 | ||||
| Set the local IPv6 address that the resolver should bind to. The argument | ||||
| should be of type char * and contain a single IPv6 address as a string. | ||||
| Set this option to NULL to use the default setting (don't | ||||
| bind to a specific IP address). | ||||
|  | ||||
| This option requires that libcurl was built with a resolver backend that | ||||
| supports this operation. The c-ares backend is the only such one. | ||||
|  | ||||
| (Added in 7.33.0) | ||||
| .IP CURLOPT_ACCEPTTIMEOUT_MS | ||||
| Pass a long telling libcurl the maximum number of milliseconds to wait for a | ||||
| server to connect back to libcurl when an active FTP connection is used. If no | ||||
| @@ -2254,22 +2426,20 @@ timeout is set, the internal default of 60000 will be used. (Added in 7.24.0) | ||||
| .SH SSL and SECURITY OPTIONS | ||||
| .IP CURLOPT_SSLCERT | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| the file name of your certificate. The default format is "PEM" and can be | ||||
| changed with \fICURLOPT_SSLCERTTYPE\fP. | ||||
| the file name of your certificate. The default format is "P12" on Secure | ||||
| Transport and "PEM" on other engines, and can be changed with | ||||
| \fICURLOPT_SSLCERTTYPE\fP. | ||||
|  | ||||
| With NSS this can also be the nickname of the certificate you wish to | ||||
| authenticate with. If you want to use a file from the current directory, please | ||||
| precede it with "./" prefix, in order to avoid confusion with a nickname. | ||||
|  | ||||
| (iOS and Mac OS X only) With Secure Transport, this string must match the name | ||||
| of a certificate that's in the system or user keychain. You should encode this | ||||
| string in UTF-8 format in case it contains non-ASCII characters. The private | ||||
| key corresponding to the certificate, and certificate chain (if any),  must | ||||
| also be present in the keychain. (Added in 7.31.0) | ||||
| With NSS or Secure Transport, this can also be the nickname of the certificate | ||||
| you wish to authenticate with as it is named in the security database. If you | ||||
| want to use a file from the current directory, please precede it with "./" | ||||
| prefix, in order to avoid confusion with a nickname. | ||||
| .IP CURLOPT_SSLCERTTYPE | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| the format of your certificate. Supported formats are "PEM" and "DER".  (Added | ||||
| in 7.9.3) | ||||
| the format of your certificate. Supported formats are "PEM" and "DER", except | ||||
| with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport | ||||
| (on iOS 5 or later, or OS X 10.7 or later) also support "P12" for | ||||
| PKCS#12-encoded files. (Added in 7.9.3) | ||||
| .IP CURLOPT_SSLKEY | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| the file name of your private key. The default format is "PEM" and can be | ||||
| @@ -2277,7 +2447,7 @@ changed with \fICURLOPT_SSLKEYTYPE\fP. | ||||
|  | ||||
| (iOS and Mac OS X only) This option is ignored if curl was built against Secure | ||||
| Transport. Secure Transport expects the private key to be already present in | ||||
| the keychain containing the certificate. | ||||
| the keychain or PKCS#12 file containing the certificate. | ||||
| .IP CURLOPT_SSLKEYTYPE | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| the format of your private key. Supported formats are "PEM", "DER" and "ENG". | ||||
| @@ -2295,6 +2465,20 @@ load your private key. | ||||
|  | ||||
| (This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and | ||||
| CURLOPT_SSLCERTPASSWD up to 7.9.2) | ||||
| .IP CURLOPT_SSL_ENABLE_ALPN | ||||
| Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. By | ||||
| default, libcurl assumes a value of 1. This option enables/disables ALPN in | ||||
| the SSL handshake (if the SSL backend libcurl is built to use supports it), | ||||
| which can be used to negotiate http2. | ||||
|  | ||||
| (Added in 7.36.0) | ||||
| .IP CURLOPT_SSL_ENABLE_NPN | ||||
| Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. By | ||||
| default, libcurl assumes a value of 1. This option enables/disables NPN in the | ||||
| SSL handshake (if the SSL backend libcurl is built to use supports it), which | ||||
| can be used to negotiate http2. | ||||
|  | ||||
| (Added in 7.36.0) | ||||
| .IP CURLOPT_SSLENGINE | ||||
| Pass a pointer to a zero terminated string as parameter. It will be used as | ||||
| the identifier for the crypto engine you want to use for your private | ||||
| @@ -2314,6 +2498,8 @@ Even though this option doesn't need any parameter, in some configurations | ||||
| arguments. Therefore, it's recommended to pass 1 as parameter to this option. | ||||
| .IP CURLOPT_SSLVERSION | ||||
| Pass a long as parameter to control what version of SSL/TLS to attempt to use. | ||||
| (Added in 7.9.2) | ||||
|  | ||||
| The available options are: | ||||
| .RS | ||||
| .IP CURL_SSLVERSION_DEFAULT | ||||
| @@ -2321,11 +2507,17 @@ The default action. This will attempt to figure out the remote SSL protocol | ||||
| version, i.e. either SSLv3 or TLSv1 (but not SSLv2, which became disabled | ||||
| by default with 7.18.1). | ||||
| .IP CURL_SSLVERSION_TLSv1 | ||||
| Force TLSv1 | ||||
| Force TLSv1.x | ||||
| .IP CURL_SSLVERSION_SSLv2 | ||||
| Force SSLv2 | ||||
| .IP CURL_SSLVERSION_SSLv3 | ||||
| Force SSLv3 | ||||
| .IP CURL_SSLVERSION_TLSv1_0 | ||||
| Force TLSv1.0 (Added in 7.34.0) | ||||
| .IP CURL_SSLVERSION_TLSv1_1 | ||||
| Force TLSv1.1 (Added in 7.34.0) | ||||
| .IP CURL_SSLVERSION_TLSv1_2 | ||||
| Force TLSv1.2 (Added in 7.34.0) | ||||
| .RE | ||||
| .IP CURLOPT_SSL_VERIFYPEER | ||||
| Pass a long as parameter. By default, curl assumes a value of 1. | ||||
| @@ -2426,9 +2618,10 @@ Curl considers the server the intended one when the Common Name field or a | ||||
| Subject Alternate Name field in the certificate matches the host name in the | ||||
| URL to which you told Curl to connect. | ||||
|  | ||||
| When the value is 1, libcurl will return a failure. It was previously (in | ||||
| 7.28.0 and earlier) a debug option of some sorts, but it is no longer | ||||
| supported due to frequently leading to programmer mistakes. | ||||
| When the value is 1, \fIcurl_easy_setopt\fP will return an error and the option | ||||
| value will not be changed.  It was previously (in 7.28.0 and earlier) a debug | ||||
| option of some sorts, but it is no longer supported due to frequently leading | ||||
| to programmer mistakes. | ||||
|  | ||||
| When the value is 0, the connection succeeds regardless of the names in the | ||||
| certificate. | ||||
| @@ -2438,14 +2631,14 @@ The default value for this option is 2. | ||||
| This option controls checking the server's certificate's claimed identity. | ||||
| The server could be lying.  To control lying, see | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP.  If libcurl is built against NSS and | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_SSL_VERIFYHOST\fP | ||||
| is ignored. | ||||
|  | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_SSL_VERIFYHOST\fP is also set | ||||
| to zero and cannot be overridden. | ||||
| .IP CURLOPT_CERTINFO | ||||
| Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With | ||||
| this enabled, libcurl (if built with OpenSSL) will extract lots of information | ||||
| this enabled, libcurl (if built with OpenSSL, NSS, GSKit or QsoSSL) will | ||||
| extract lots of information | ||||
| and data about the certificates in the certificate chain used in the SSL | ||||
| connection. This data is then possible to extract after a transfer using | ||||
| connection. This data may then be retrieved after a transfer using | ||||
| \fIcurl_easy_getinfo(3)\fP and its option \fICURLINFO_CERTINFO\fP. (Added in | ||||
| 7.19.1) | ||||
| .IP CURLOPT_RANDOM_FILE | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -21,22 +21,17 @@ | ||||
| .\" ************************************************************************** | ||||
| .TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_getdate - Convert a date string to number of seconds since January 1, | ||||
| 1970 | ||||
| curl_getdate - Convert a date string to number of seconds | ||||
| .SH SYNOPSIS | ||||
| .B #include <curl/curl.h> | ||||
| .sp | ||||
| .BI "time_t curl_getdate(char *" datestring ", time_t *"now " );" | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| This function returns the number of seconds since January 1st 1970 in the UTC | ||||
| time zone, for the date and time that the \fIdatestring\fP parameter | ||||
| specifies. The \fInow\fP parameter is not used, pass a NULL there. | ||||
|  | ||||
| \fBNOTE:\fP This function was rewritten for the 7.12.2 release and this | ||||
| documentation covers the functionality of the new one. The new one is not | ||||
| feature-complete with the old one, but most of the formats supported by the | ||||
| new one was supported by the old too. | ||||
| \fIcurl_getdate(3)\fP returns the number of seconds since the Epoch, January | ||||
| 1st 1970 00:00:00 in the UTC time zone, for the date and time that the | ||||
| \fIdatestring\fP parameter specifies. The \fInow\fP parameter is not used, | ||||
| pass a NULL there. | ||||
| .SH PARSING DATES AND TIMES | ||||
| A "date" is a string containing several items separated by whitespace. The | ||||
| order of the items is immaterial.  A date string may contain many flavors of | ||||
| @@ -108,10 +103,3 @@ number). | ||||
| Having a 64 bit time_t is not a guarantee that dates beyond 03:14:07 UTC, | ||||
| January 19, 2038 will work fine. On systems with a 64 bit time_t but with a | ||||
| crippled mktime(), \fIcurl_getdate\fP will return -1 in this case. | ||||
| .SH REWRITE | ||||
| The former version of this function was built with yacc and was not only very | ||||
| large, it was also never quite understood and it wasn't possible to build with | ||||
| non-GNU tools since only GNU Bison could make it thread-safe! | ||||
|  | ||||
| The rewrite was done for 7.12.2. The new one is much smaller and uses simpler | ||||
| code. | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -29,18 +29,26 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle); | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| Adds a standard easy handle to the multi stack. This function call will make | ||||
| this \fImulti_handle\fP control the specified \fIeasy_handle\fP. | ||||
| Furthermore, libcurl now initiates the connection associated with the | ||||
| specified \fIeasy_handle\fP. | ||||
| this \fImulti_handle\fP control the specified \fIeasy_handle\fP.  Furthermore, | ||||
| libcurl now initiates the connection associated with the specified | ||||
| \fIeasy_handle\fP. | ||||
|  | ||||
| When an easy handle has been added to a multi stack, you can not and you must | ||||
| not use \fIcurl_easy_perform(3)\fP on that handle! | ||||
| While an easy handle is added to a multi stack, you can not and you must not | ||||
| use \fIcurl_easy_perform(3)\fP on that handle. After having removed the handle | ||||
| from the multi stack again, it is perfectly fine to use it with the easy | ||||
| interface again. | ||||
|  | ||||
| If the easy handle is not set to use a shared (CURLOPT_SHARE) or global DNS | ||||
| cache (CURLOPT_DNS_USE_GLOBAL_CACHE), it will be made to use the DNS cache | ||||
| that is shared between all easy handles within the multi handle when | ||||
| \fIcurl_multi_add_handle(3)\fP is called. | ||||
|  | ||||
| If you have CURLMOPT_TIMERFUNCTION set in the multi handle (and you really | ||||
| should if you're working event-based with \fIcurl_multi_socket_action(3)\fP | ||||
| and friends), that callback will be called from within this function to ask | ||||
| for an updated timer so that your main event loop will get the activity on | ||||
| this handle to get started. | ||||
|  | ||||
| The easy handle will remain added until you remove it again with | ||||
| \fIcurl_multi_remove_handle(3)\fP. You should remove the easy handle from the | ||||
| multi stack before you terminate first the easy handle and then the multi | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -28,8 +28,8 @@ curl_multi_assign \- set data to association with an internal socket | ||||
| CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd, | ||||
|                             void *sockptr); | ||||
| .SH DESCRIPTION | ||||
| This function assigns an association in the multi handle between the given | ||||
| socket and a private pointer of the application. This is (only) useful for | ||||
| This function creates an association in the multi handle between the given | ||||
| socket and a private pointer of the application. This is designed for | ||||
| \fIcurl_multi_socket(3)\fP uses. | ||||
|  | ||||
| When set, the \fIsockptr\fP pointer will be passed to all future socket | ||||
| @@ -51,13 +51,13 @@ The standard CURLMcode for multi interface error codes. | ||||
| .SH "TYPICAL USAGE" | ||||
| In a typical application you allocate a struct or at least use some kind of | ||||
| semi-dynamic data for each socket that we must wait for action on when using | ||||
| the \fIcurl_multi_socket(3)\fP approach. | ||||
| the \fIcurl_multi_socket_action(3)\fP approach. | ||||
|  | ||||
| When our socket-callback gets called by libcurl and we get to know about yet | ||||
| another socket to wait for, we can use \fIcurl_multi_assign(3)\fP to point out | ||||
| the particular data so that when we get updates about this same socket again, | ||||
| we don't have to find the struct associated with this socket by ourselves. | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.15.5, although not deemed stable yet. | ||||
| This function was added in libcurl 7.15.5. | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_multi_setopt "(3), " curl_multi_socket "(3) " | ||||
| .BR curl_multi_setopt "(3), " curl_multi_socket_action "(3) " | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -81,9 +81,9 @@ not used by libcurl but only passed-thru as-is. Set the callback pointer with | ||||
| \fICURLMOPT_TIMERFUNCTION\fP. (Added in 7.16.0) | ||||
| .IP CURLMOPT_MAXCONNECTS | ||||
| Pass a long. The set number will be used as the maximum amount of | ||||
| simultaneously open connections that libcurl may cache. Default is 10, and | ||||
| libcurl will enlarge the size for each added easy handle to make it fit 4 | ||||
| times the number of added easy handles. | ||||
| simultaneously open connections that libcurl may keep in its connection cache | ||||
| after completed use. By default libcurl will enlarge the size for each added | ||||
| easy handle to make it fit 4 times the number of added easy handles. | ||||
|  | ||||
| By setting this option, you can prevent the cache size from growing beyond the | ||||
| limit set by you. | ||||
| @@ -94,6 +94,9 @@ number of open connections from increasing. | ||||
| This option is for the multi handle's use only, when using the easy interface | ||||
| you should instead use the \fICURLOPT_MAXCONNECTS\fP option. | ||||
|  | ||||
| See \fICURLMOPT_MAX_TOTAL_CONNECTIONS\fP for limiting the number of active | ||||
| connections. | ||||
|  | ||||
| (Added in 7.16.3) | ||||
| .IP CURLMOPT_MAX_HOST_CONNECTIONS | ||||
| Pass a long. The set number will be used as the maximum amount of | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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,6 +30,8 @@ curl_version - returns the libcurl version string | ||||
| .SH DESCRIPTION | ||||
| Returns a human readable string with the version number of libcurl and some of | ||||
| its important components (like OpenSSL version). | ||||
|  | ||||
| We recommend using \fIcurl_version_info(3)\fP instead! | ||||
| .SH RETURN VALUE | ||||
| A pointer to a zero terminated string. The string resides in a statically | ||||
| allocated buffer and must not be freed by the caller. | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -20,7 +20,7 @@ | ||||
| .\" * | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH curl_version_info 3 "10 June 2009" "libcurl 7.19.6" "libcurl Manual" | ||||
| .TH curl_version_info 3 "18 Feb 2014" "libcurl 7.33.0" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_version_info - returns run-time libcurl version info | ||||
| .SH SYNOPSIS | ||||
| @@ -30,11 +30,12 @@ curl_version_info - returns run-time libcurl version info | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| Returns a pointer to a filled in struct with information about various | ||||
| run-time features in libcurl. \fItype\fP should be set to the version of this | ||||
| functionality by the time you write your program. This way, libcurl will | ||||
| always return a proper struct that your program understands, while programs in | ||||
| the future might get a different struct. CURLVERSION_NOW will be the most | ||||
| recent one for the library you have installed: | ||||
| features in the running version of libcurl. \fItype\fP should be set to the | ||||
| version of this functionality by the time you write your program. This way, | ||||
| libcurl will always return a proper struct that your program understands, | ||||
| while programs in the future might get a different | ||||
| struct. \fBCURLVERSION_NOW\fP will be the most recent one for the library you | ||||
| have installed: | ||||
|  | ||||
|         data = curl_version_info(CURLVERSION_NOW); | ||||
|  | ||||
| @@ -133,6 +134,9 @@ libcurl was built with support for TLS-SRP. (Added in 7.21.4) | ||||
| .IP CURL_VERSION_NTLM_WB | ||||
| libcurl was built with support for NTLM delegation to a winbind helper. | ||||
| (Added in 7.22.0) | ||||
| .IP CURL_VERSION_HTTP2 | ||||
| libcurl was built with support for HTTP2. | ||||
| (Added in 7.33.0) | ||||
| .RE | ||||
| \fIssl_version\fP is an ASCII string for the OpenSSL version used. If libcurl | ||||
| has no SSL support, this is NULL. | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2012, 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 | ||||
| @@ -273,6 +273,9 @@ The passed-in socket is not a valid one that libcurl already knows about. | ||||
| .IP "CURLM_UNKNOWN_OPTION (6)" | ||||
| curl_multi_setopt() with unsupported option | ||||
| (Added in 7.15.4) | ||||
| .IP "CURLM_ADDED_ALREADY (7)" | ||||
| An easy handle already added to a multi handle was attempted to get added a | ||||
| second time. (Added in 7.32.1) | ||||
| .SH "CURLSHcode" | ||||
| The "share" interface will return a CURLSHcode to indicate when an error has | ||||
| occurred.  Also consider \fIcurl_share_strerror(3)\fP. | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -29,18 +29,24 @@ specific man pages for each function mentioned in here. There are also the | ||||
| \fIlibcurl-share(3)\fP man page and the \fIlibcurl-tutorial(3)\fP man page for | ||||
| in-depth understanding on how to program with libcurl. | ||||
|  | ||||
| There are more than thirty custom bindings available that bring libcurl access | ||||
| to your favourite language. Look elsewhere for documentation on those. | ||||
| There are many bindings available that bring libcurl access to your favourite | ||||
| language. Look elsewhere for documentation on those. | ||||
|  | ||||
| libcurl has a global constant environment that you must set up and | ||||
| maintain while using libcurl.  This essentially means you call | ||||
| libcurl has a global constant environment that you must set up and maintain | ||||
| while using libcurl.  This essentially means you call | ||||
| \fIcurl_global_init(3)\fP at the start of your program and | ||||
| \fIcurl_global_cleanup(3)\fP at the end.  See GLOBAL CONSTANTS below | ||||
| for details. | ||||
| \fIcurl_global_cleanup(3)\fP at the end.  See \fBGLOBAL CONSTANTS\fP below for | ||||
| details. | ||||
|  | ||||
| To transfer files, you always set up an "easy handle" using | ||||
| \fIcurl_easy_init(3)\fP, but when you want the file(s) transferred you have | ||||
| the option of using the "easy" interface, or the "multi" interface. | ||||
| To transfer files, you create an "easy handle" using \fIcurl_easy_init(3)\fP | ||||
| for a single individual transfer (in either direction). You then set your | ||||
| desired set of options in that handle with \fIcurk_easy_setopt(3)\fP. Options | ||||
| you set with \fIcurl_easy_setopt(3)\fP stick. They will be used on every | ||||
| repeated use of this handle until you either change the option, or you reset | ||||
| them all with \fIcurl_easy_reset(3)\fP. | ||||
|  | ||||
| To actually transfer data you have the option of using the "easy" interface, | ||||
| or the "multi" interface. | ||||
|  | ||||
| The easy interface is a synchronous interface with which you call | ||||
| \fIcurl_easy_perform(3)\fP and let it perform the transfer. When it is | ||||
| @@ -51,7 +57,8 @@ The multi interface on the other hand is an asynchronous interface, that you | ||||
| call and that performs only a little piece of the transfer on each invoke. It | ||||
| is perfect if you want to do things while the transfer is in progress, or | ||||
| similar. The multi interface allows you to select() on libcurl action, and | ||||
| even to easily download multiple files simultaneously using a single thread. See further details in the \fIlibcurl-multi(3)\fP man page. | ||||
| even to easily download multiple files simultaneously using a single | ||||
| thread. See further details in the \fIlibcurl-multi(3)\fP man page. | ||||
|  | ||||
| You can have multiple easy handles share certain data, even if they are used | ||||
| in different threads. This magic is setup using the share interface, as | ||||
| @@ -90,6 +97,8 @@ Unix-like operating system that ship libcurl as part of their distributions | ||||
| often don't provide the curl-config tool, but simply install the library and | ||||
| headers in the common path for this purpose. | ||||
|  | ||||
| Many Linux and similar sytems use pkg-config to provide build and link options | ||||
| about libraries and libcurl supports that as well. | ||||
| .SH "LIBCURL SYMBOL NAMES" | ||||
| All public functions in the libcurl interface are prefixed with 'curl_' (with | ||||
| a lowercase c). You can find other functions in the library source code, but | ||||
| @@ -107,27 +116,29 @@ several threads. libcurl is thread-safe and can be used in any number of | ||||
| threads, but you must use separate curl handles if you want to use libcurl in | ||||
| more than one thread simultaneously. | ||||
|  | ||||
| The global environment functions are not thread-safe.  See GLOBAL CONSTANTS | ||||
| below for details. | ||||
| The global environment functions are not thread-safe.  See \fBGLOBAL | ||||
| CONSTANTS\fP below for details. | ||||
|  | ||||
| .SH "PERSISTENT CONNECTIONS" | ||||
| Persistent connections means that libcurl can re-use the same connection for | ||||
| several transfers, if the conditions are right. | ||||
|  | ||||
| libcurl will \fBalways\fP attempt to use persistent connections. Whenever you | ||||
| use \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP, libcurl will | ||||
| attempt to use an existing connection to do the transfer, and if none exists | ||||
| it'll open a new one that will be subject for re-use on a possible following | ||||
| call to \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP. | ||||
| use \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP etc, libcurl | ||||
| will attempt to use an existing connection to do the transfer, and if none | ||||
| exists it'll open a new one that will be subject for re-use on a possible | ||||
| following call to \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP. | ||||
|  | ||||
| To allow libcurl to take full advantage of persistent connections, you should | ||||
| do as many of your file transfers as possible using the same curl handle. When | ||||
| you call \fIcurl_easy_cleanup(3)\fP, all the possibly open connections held by | ||||
| libcurl will be closed and forgotten. | ||||
| do as many of your file transfers as possible using the same handle. | ||||
|  | ||||
| Note that the options set with \fIcurl_easy_setopt(3)\fP will be used on | ||||
| every repeated \fIcurl_easy_perform(3)\fP call. | ||||
| If you use the easy interface, and you call \fIcurl_easy_cleanup(3)\fP, all | ||||
| the possibly open connections held by libcurl will be closed and forgotten. | ||||
|  | ||||
| When you've created a multi handle and are using the multi interface, the | ||||
| connection pool is instead kept in the multi handle so closing and creating | ||||
| new easy handles to do transfers will not affect them. Instead all added easy | ||||
| handles can take advantage of the single shared pool. | ||||
| .SH "GLOBAL CONSTANTS" | ||||
| There are a variety of constants that libcurl uses, mainly through its | ||||
| internal use of other libraries, which are too complicated for the | ||||
|   | ||||
| @@ -85,8 +85,8 @@ CURLE_LDAP_SEARCH_FAILED        7.1 | ||||
| CURLE_LIBRARY_NOT_FOUND         7.1           7.17.0 | ||||
| CURLE_LOGIN_DENIED              7.13.1 | ||||
| CURLE_MALFORMAT_USER            7.1           7.17.0 | ||||
| CURLE_NO_CONNECTION_AVAILABLE   7.30.0 | ||||
| CURLE_NOT_BUILT_IN              7.21.5 | ||||
| CURLE_NO_CONNECTION_AVAILABLE   7.30.0 | ||||
| CURLE_OK                        7.1 | ||||
| CURLE_OPERATION_TIMEDOUT        7.10.2 | ||||
| CURLE_OPERATION_TIMEOUTED       7.1           7.17.0 | ||||
| @@ -250,6 +250,7 @@ CURLINFO_SSL_VERIFYRESULT       7.5 | ||||
| CURLINFO_STARTTRANSFER_TIME     7.9.2 | ||||
| CURLINFO_STRING                 7.4.1 | ||||
| CURLINFO_TEXT                   7.9.6 | ||||
| CURLINFO_TLS_SESSION            7.34.0 | ||||
| CURLINFO_TOTAL_TIME             7.4.1 | ||||
| CURLINFO_TYPEMASK               7.4.1 | ||||
| CURLIOCMD_NOP                   7.12.3 | ||||
| @@ -270,10 +271,10 @@ CURLKHTYPE_RSA1                 7.19.6 | ||||
| CURLKHTYPE_UNKNOWN              7.19.6 | ||||
| CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 7.30.0 | ||||
| CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 7.30.0 | ||||
| CURLMOPT_MAXCONNECTS            7.16.3 | ||||
| CURLMOPT_MAX_HOST_CONNECTIONS   7.30.0 | ||||
| CURLMOPT_MAX_PIPELINE_LENGTH    7.30.0 | ||||
| CURLMOPT_MAX_TOTAL_CONNECTIONS  7.30.0 | ||||
| CURLMOPT_MAXCONNECTS            7.16.3 | ||||
| CURLMOPT_PIPELINING             7.16.0 | ||||
| CURLMOPT_PIPELINING_SERVER_BL   7.30.0 | ||||
| CURLMOPT_PIPELINING_SITE_BL     7.30.0 | ||||
| @@ -283,6 +284,7 @@ CURLMOPT_TIMERDATA              7.16.0 | ||||
| CURLMOPT_TIMERFUNCTION          7.16.0 | ||||
| CURLMSG_DONE                    7.9.6 | ||||
| CURLMSG_NONE                    7.9.6 | ||||
| CURLM_ADDED_ALREADY             7.32.1 | ||||
| CURLM_BAD_EASY_HANDLE           7.9.6 | ||||
| CURLM_BAD_HANDLE                7.9.6 | ||||
| CURLM_BAD_SOCKET                7.15.4 | ||||
| @@ -331,11 +333,15 @@ CURLOPT_DEBUGDATA               7.9.6 | ||||
| CURLOPT_DEBUGFUNCTION           7.9.6 | ||||
| CURLOPT_DIRLISTONLY             7.17.0 | ||||
| CURLOPT_DNS_CACHE_TIMEOUT       7.9.3 | ||||
| CURLOPT_DNS_INTERFACE           7.33.0 | ||||
| CURLOPT_DNS_LOCAL_IP4           7.33.0 | ||||
| CURLOPT_DNS_LOCAL_IP6           7.33.0 | ||||
| CURLOPT_DNS_SERVERS             7.24.0 | ||||
| CURLOPT_DNS_USE_GLOBAL_CACHE    7.9.3         7.11.1 | ||||
| CURLOPT_EGDSOCKET               7.7 | ||||
| CURLOPT_ENCODING                7.10 | ||||
| CURLOPT_ERRORBUFFER             7.1 | ||||
| CURLOPT_EXPECT_100_TIMEOUT_MS   7.36.0 | ||||
| CURLOPT_FAILONERROR             7.1 | ||||
| CURLOPT_FILE                    7.1           7.9.7 | ||||
| CURLOPT_FILETIME                7.5 | ||||
| @@ -390,6 +396,7 @@ CURLOPT_KRB4LEVEL               7.3           7.17.0 | ||||
| CURLOPT_KRBLEVEL                7.16.4 | ||||
| CURLOPT_LOCALPORT               7.15.2 | ||||
| CURLOPT_LOCALPORTRANGE          7.15.2 | ||||
| CURLOPT_LOGIN_OPTIONS           7.34.0 | ||||
| CURLOPT_LOW_SPEED_LIMIT         7.1 | ||||
| CURLOPT_LOW_SPEED_TIME          7.1 | ||||
| CURLOPT_MAIL_AUTH               7.25.0 | ||||
| @@ -428,7 +435,7 @@ CURLOPT_POSTREDIR               7.19.1 | ||||
| CURLOPT_PREQUOTE                7.9.5 | ||||
| CURLOPT_PRIVATE                 7.10.3 | ||||
| CURLOPT_PROGRESSDATA            7.1 | ||||
| CURLOPT_PROGRESSFUNCTION        7.1 | ||||
| CURLOPT_PROGRESSFUNCTION        7.1           7.32.0 | ||||
| CURLOPT_PROTOCOLS               7.19.4 | ||||
| CURLOPT_PROXY                   7.1 | ||||
| CURLOPT_PROXYAUTH               7.10.7 | ||||
| @@ -489,6 +496,8 @@ CURLOPT_SSLKEY                  7.9.3 | ||||
| CURLOPT_SSLKEYPASSWD            7.9.3         7.17.0 | ||||
| CURLOPT_SSLKEYTYPE              7.9.3 | ||||
| CURLOPT_SSLVERSION              7.1 | ||||
| CURLOPT_SSL_ENABLE_ALPN         7.36.0 | ||||
| CURLOPT_SSL_ENABLE_NPN          7.36.0 | ||||
| CURLOPT_SSL_CIPHER_LIST         7.9 | ||||
| CURLOPT_SSL_CTX_DATA            7.10.6 | ||||
| CURLOPT_SSL_CTX_FUNCTION        7.10.6 | ||||
| @@ -525,6 +534,9 @@ CURLOPT_WRITEDATA               7.9.7 | ||||
| CURLOPT_WRITEFUNCTION           7.1 | ||||
| CURLOPT_WRITEHEADER             7.1 | ||||
| CURLOPT_WRITEINFO               7.1 | ||||
| CURLOPT_XFERINFODATA            7.32.0 | ||||
| CURLOPT_XFERINFOFUNCTION        7.32.0 | ||||
| CURLOPT_XOAUTH2_BEARER          7.33.0 | ||||
| CURLPAUSE_ALL                   7.18.0 | ||||
| CURLPAUSE_CONT                  7.18.0 | ||||
| CURLPAUSE_RECV                  7.18.0 | ||||
| @@ -586,6 +598,16 @@ CURLSSH_AUTH_KEYBOARD           7.16.1 | ||||
| CURLSSH_AUTH_NONE               7.16.1 | ||||
| CURLSSH_AUTH_PASSWORD           7.16.1 | ||||
| CURLSSH_AUTH_PUBLICKEY          7.16.1 | ||||
| CURLSSLBACKEND_CYASSL           7.34.0 | ||||
| CURLSSLBACKEND_DARWINSSL        7.34.0 | ||||
| CURLSSLBACKEND_GNUTLS           7.34.0 | ||||
| CURLSSLBACKEND_GSKIT            7.34.0 | ||||
| CURLSSLBACKEND_NONE             7.34.0 | ||||
| CURLSSLBACKEND_NSS              7.34.0 | ||||
| CURLSSLBACKEND_OPENSSL          7.34.0 | ||||
| CURLSSLBACKEND_POLARSSL         7.34.0 | ||||
| CURLSSLBACKEND_QSOSSL           7.34.0 | ||||
| CURLSSLBACKEND_SCHANNEL         7.34.0 | ||||
| CURLSSLOPT_ALLOW_BEAST          7.25.0 | ||||
| CURLUSESSL_ALL                  7.17.0 | ||||
| CURLUSESSL_CONTROL              7.17.0 | ||||
| @@ -618,14 +640,15 @@ CURL_FORMADD_NULL               7.9.8 | ||||
| CURL_FORMADD_OK                 7.9.8 | ||||
| CURL_FORMADD_OPTION_TWICE       7.9.8 | ||||
| CURL_FORMADD_UNKNOWN_OPTION     7.9.8 | ||||
| CURL_GLOBAL_ACK_EINTR           7.30.0 | ||||
| CURL_GLOBAL_ALL                 7.8 | ||||
| CURL_GLOBAL_DEFAULT             7.8 | ||||
| CURL_GLOBAL_NOTHING             7.8 | ||||
| CURL_GLOBAL_SSL                 7.8 | ||||
| CURL_GLOBAL_WIN32               7.8.1 | ||||
| CURL_GLOBAL_ACK_EINTR           7.30.0 | ||||
| CURL_HTTP_VERSION_1_0           7.9.1 | ||||
| CURL_HTTP_VERSION_1_1           7.9.1 | ||||
| CURL_HTTP_VERSION_2_0           7.33.0 | ||||
| CURL_HTTP_VERSION_NONE          7.9.1 | ||||
| CURL_IPRESOLVE_V4               7.10.8 | ||||
| CURL_IPRESOLVE_V6               7.10.8 | ||||
| @@ -687,6 +710,9 @@ CURL_SSLVERSION_DEFAULT         7.9.2 | ||||
| CURL_SSLVERSION_SSLv2           7.9.2 | ||||
| CURL_SSLVERSION_SSLv3           7.9.2 | ||||
| CURL_SSLVERSION_TLSv1           7.9.2 | ||||
| CURL_SSLVERSION_TLSv1_0         7.34.0 | ||||
| CURL_SSLVERSION_TLSv1_1         7.34.0 | ||||
| CURL_SSLVERSION_TLSv1_2         7.34.0 | ||||
| CURL_TIMECOND_IFMODSINCE        7.9.7 | ||||
| CURL_TIMECOND_IFUNMODSINCE      7.9.7 | ||||
| CURL_TIMECOND_LASTMOD           7.9.7 | ||||
| @@ -698,6 +724,7 @@ CURL_VERSION_CONV               7.15.4 | ||||
| CURL_VERSION_CURLDEBUG          7.19.6 | ||||
| CURL_VERSION_DEBUG              7.10.6 | ||||
| CURL_VERSION_GSSNEGOTIATE       7.10.6 | ||||
| CURL_VERSION_HTTP2              7.33.0 | ||||
| CURL_VERSION_IDN                7.12.0 | ||||
| CURL_VERSION_IPV6               7.10 | ||||
| CURL_VERSION_KERBEROS4          7.10 | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 2008 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 2008 - 2014, 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 | ||||
| @@ -20,7 +20,7 @@ | ||||
| .\" * | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH mk-ca-bundle 1 "5 Jan 2013" "version 1.17" "mk-ca-bundle manual" | ||||
| .TH mk-ca-bundle 1 "5 Jan 2013" "version 1.20" "mk-ca-bundle manual" | ||||
| .SH NAME | ||||
| mk-ca-bundle \- convert mozilla's certdata.txt to PEM format | ||||
| .SH SYNOPSIS | ||||
| @@ -42,6 +42,10 @@ curl, wget and more. | ||||
| The following options are supported: | ||||
| .IP -b | ||||
| backup an existing version of \fIoutputfilename\fP | ||||
| .IP -d [name] | ||||
| specify which Mozilla tree to pull certdata.txt from (or a custom URL). Valid | ||||
| names are: aurora, beta, central, mozilla, nss, release (default). They are | ||||
| shortcuts for which source tree to get the cert data from. | ||||
| .IP -f | ||||
| force rebuild even if certdata.txt is current (Added in version 1.17) | ||||
| .IP -i | ||||
| @@ -60,11 +64,16 @@ unlink (remove) certdata.txt after processing | ||||
| be verbose and print out processed CAs | ||||
| .SH EXIT STATUS | ||||
| Returns 0 on success. Returns 1 if it fails to download data. | ||||
| .SH CERTDATA FORMAT | ||||
| The file format used by Mozilla for this trust information seems to be documented here: | ||||
| .nf | ||||
| http://p11-glue.freedesktop.org/doc/storing-trust-policy/storing-trust-existing.html | ||||
| .fi | ||||
| .SH SEE ALSO | ||||
| .BR curl (1) | ||||
| .SH HISTORY | ||||
| \fBmk-ca-bundle\fP is a command line tool that is shipped as part of every | ||||
| curl and libcurl release (see http://curl.haxx.se/). It was originally based | ||||
| on the parse-certs script written by Roland Krikava and was later much | ||||
| improved by Guenter Knauf.  This manual page was written by Jan Schaumann | ||||
| \&<jschauma@netmeister.org>. | ||||
| improved by Guenter Knauf.  This manual page was initially written by Jan | ||||
| Schaumann \&<jschauma@netmeister.org>. | ||||
|   | ||||
| @@ -69,7 +69,7 @@ | ||||
|    require it! */ | ||||
| #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ | ||||
|     defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ | ||||
|     defined(ANDROID) || defined(__ANDROID__) || \ | ||||
|     defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ | ||||
|    (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) | ||||
| #include <sys/select.h> | ||||
| #endif | ||||
| @@ -156,12 +156,22 @@ struct curl_httppost { | ||||
|                                        HTTPPOST_CALLBACK posts */ | ||||
| }; | ||||
|  | ||||
| /* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered | ||||
|    deprecated but was the only choice up until 7.31.0 */ | ||||
| typedef int (*curl_progress_callback)(void *clientp, | ||||
|                                       double dltotal, | ||||
|                                       double dlnow, | ||||
|                                       double ultotal, | ||||
|                                       double ulnow); | ||||
|  | ||||
| /* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in | ||||
|    7.32.0, it avoids floating point and provides more detailed information. */ | ||||
| typedef int (*curl_xferinfo_callback)(void *clientp, | ||||
|                                       curl_off_t dltotal, | ||||
|                                       curl_off_t dlnow, | ||||
|                                       curl_off_t ultotal, | ||||
|                                       curl_off_t ulnow); | ||||
|  | ||||
| #ifndef CURL_MAX_WRITE_SIZE | ||||
|   /* Tests have proven that 20K is a very bad buffer size for uploads on | ||||
|      Windows, while 16K for some odd reason performed a lot better. | ||||
| @@ -635,16 +645,18 @@ typedef enum { | ||||
|  | ||||
| #define CURL_ERROR_SIZE 256 | ||||
|  | ||||
| struct curl_khkey { | ||||
|   const char *key; /* points to a zero-terminated string encoded with base64 | ||||
|                       if len is zero, otherwise to the "raw" data */ | ||||
|   size_t len; | ||||
|   enum type { | ||||
| enum curl_khtype { | ||||
|   CURLKHTYPE_UNKNOWN, | ||||
|   CURLKHTYPE_RSA1, | ||||
|   CURLKHTYPE_RSA, | ||||
|   CURLKHTYPE_DSS | ||||
|   } keytype; | ||||
| }; | ||||
|  | ||||
| struct curl_khkey { | ||||
|   const char *key; /* points to a zero-terminated string encoded with base64 | ||||
|                       if len is zero, otherwise to the "raw" data */ | ||||
|   size_t len; | ||||
|   enum curl_khtype keytype; | ||||
| }; | ||||
|  | ||||
| /* this is the set of return values expected from the curl_sshkeycallback | ||||
| @@ -815,10 +827,10 @@ typedef enum { | ||||
|   /* Name of proxy to use. */ | ||||
|   CINIT(PROXY, OBJECTPOINT, 4), | ||||
|  | ||||
|   /* "name:password" to use when fetching. */ | ||||
|   /* "user:password;options" to use when fetching. */ | ||||
|   CINIT(USERPWD, OBJECTPOINT, 5), | ||||
|  | ||||
|   /* "name:password" to use with proxy. */ | ||||
|   /* "user:password" to use with proxy. */ | ||||
|   CINIT(PROXYUSERPWD, OBJECTPOINT, 6), | ||||
|  | ||||
|   /* Range to get, specified as an ASCII string. */ | ||||
| @@ -968,13 +980,16 @@ typedef enum { | ||||
|  | ||||
|   /* 55 = OBSOLETE */ | ||||
|  | ||||
|   /* Function that will be called instead of the internal progress display | ||||
|   /* DEPRECATED | ||||
|    * Function that will be called instead of the internal progress display | ||||
|    * function. This function should be defined as the curl_progress_callback | ||||
|    * prototype defines. */ | ||||
|   CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), | ||||
|  | ||||
|   /* Data passed to the progress callback */ | ||||
|   /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION | ||||
|      callbacks */ | ||||
|   CINIT(PROGRESSDATA, OBJECTPOINT, 57), | ||||
| #define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA | ||||
|  | ||||
|   /* We want the referrer field set automatically when following locations */ | ||||
|   CINIT(AUTOREFERER, LONG, 58), | ||||
| @@ -1373,8 +1388,7 @@ typedef enum { | ||||
|   CINIT(ADDRESS_SCOPE, LONG, 171), | ||||
|  | ||||
|   /* Collect certificate chain info and allow it to get retrievable with | ||||
|      CURLINFO_CERTINFO after the transfer is complete. (Unfortunately) only | ||||
|      working with OpenSSL-powered builds. */ | ||||
|      CURLINFO_CERTINFO after the transfer is complete. */ | ||||
|   CINIT(CERTINFO, LONG, 172), | ||||
|  | ||||
|   /* "name" and "pwd" to use when fetching. */ | ||||
| @@ -1533,6 +1547,40 @@ typedef enum { | ||||
|   /* Enable/disable SASL initial response */ | ||||
|   CINIT(SASL_IR, LONG, 218), | ||||
|  | ||||
|   /* Function that will be called instead of the internal progress display | ||||
|    * function. This function should be defined as the curl_xferinfo_callback | ||||
|    * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ | ||||
|   CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), | ||||
|  | ||||
|   /* The XOAUTH2 bearer token */ | ||||
|   CINIT(XOAUTH2_BEARER, OBJECTPOINT, 220), | ||||
|  | ||||
|   /* Set the interface string to use as outgoing network | ||||
|    * interface for DNS requests. | ||||
|    * Only supported by the c-ares DNS backend */ | ||||
|   CINIT(DNS_INTERFACE, OBJECTPOINT, 221), | ||||
|  | ||||
|   /* Set the local IPv4 address to use for outgoing DNS requests. | ||||
|    * Only supported by the c-ares DNS backend */ | ||||
|   CINIT(DNS_LOCAL_IP4, OBJECTPOINT, 222), | ||||
|  | ||||
|   /* Set the local IPv4 address to use for outgoing DNS requests. | ||||
|    * Only supported by the c-ares DNS backend */ | ||||
|   CINIT(DNS_LOCAL_IP6, OBJECTPOINT, 223), | ||||
|  | ||||
|   /* Set authentication options directly */ | ||||
|   CINIT(LOGIN_OPTIONS, OBJECTPOINT, 224), | ||||
|  | ||||
|   /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ | ||||
|   CINIT(SSL_ENABLE_NPN, LONG, 225), | ||||
|  | ||||
|   /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ | ||||
|   CINIT(SSL_ENABLE_ALPN, LONG, 226), | ||||
|  | ||||
|   /* Time to wait for a response to a HTTP request containing an | ||||
|    * Expect: 100-continue header before sending the data anyway. */ | ||||
|   CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227), | ||||
|  | ||||
|   CURLOPT_LASTENTRY /* the last unused */ | ||||
| } CURLoption; | ||||
|  | ||||
| @@ -1585,6 +1633,7 @@ enum { | ||||
|                              for us! */ | ||||
|   CURL_HTTP_VERSION_1_0,  /* please use HTTP 1.0 in the request */ | ||||
|   CURL_HTTP_VERSION_1_1,  /* please use HTTP 1.1 in the request */ | ||||
|   CURL_HTTP_VERSION_2_0,  /* please use HTTP 2.0 in the request */ | ||||
|  | ||||
|   CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ | ||||
| }; | ||||
| @@ -1622,9 +1671,12 @@ enum CURL_NETRC_OPTION { | ||||
|  | ||||
| enum { | ||||
|   CURL_SSLVERSION_DEFAULT, | ||||
|   CURL_SSLVERSION_TLSv1, | ||||
|   CURL_SSLVERSION_TLSv1, /* TLS 1.x */ | ||||
|   CURL_SSLVERSION_SSLv2, | ||||
|   CURL_SSLVERSION_SSLv3, | ||||
|   CURL_SSLVERSION_TLSv1_0, | ||||
|   CURL_SSLVERSION_TLSv1_1, | ||||
|   CURL_SSLVERSION_TLSv1_2, | ||||
|  | ||||
|   CURL_SSLVERSION_LAST /* never use, keep last */ | ||||
| }; | ||||
| @@ -1943,6 +1995,28 @@ struct curl_certinfo { | ||||
|                                    format "name: value" */ | ||||
| }; | ||||
|  | ||||
| /* enum for the different supported SSL backends */ | ||||
| typedef enum { | ||||
|   CURLSSLBACKEND_NONE = 0, | ||||
|   CURLSSLBACKEND_OPENSSL = 1, | ||||
|   CURLSSLBACKEND_GNUTLS = 2, | ||||
|   CURLSSLBACKEND_NSS = 3, | ||||
|   CURLSSLBACKEND_QSOSSL = 4, | ||||
|   CURLSSLBACKEND_GSKIT = 5, | ||||
|   CURLSSLBACKEND_POLARSSL = 6, | ||||
|   CURLSSLBACKEND_CYASSL = 7, | ||||
|   CURLSSLBACKEND_SCHANNEL = 8, | ||||
|   CURLSSLBACKEND_DARWINSSL = 9 | ||||
| } curl_sslbackend; | ||||
|  | ||||
| /* Information about the SSL library used and the respective internal SSL | ||||
|    handle, which can be used to obtain further information regarding the | ||||
|    connection. Asked for with CURLINFO_TLS_SESSION. */ | ||||
| struct curl_tlssessioninfo { | ||||
|   curl_sslbackend backend; | ||||
|   void *internals; | ||||
| }; | ||||
|  | ||||
| #define CURLINFO_STRING   0x100000 | ||||
| #define CURLINFO_LONG     0x200000 | ||||
| #define CURLINFO_DOUBLE   0x300000 | ||||
| @@ -1994,9 +2068,10 @@ typedef enum { | ||||
|   CURLINFO_PRIMARY_PORT     = CURLINFO_LONG   + 40, | ||||
|   CURLINFO_LOCAL_IP         = CURLINFO_STRING + 41, | ||||
|   CURLINFO_LOCAL_PORT       = CURLINFO_LONG   + 42, | ||||
|   CURLINFO_TLS_SESSION      = CURLINFO_SLIST  + 43, | ||||
|   /* Fill in new entries below here! */ | ||||
|  | ||||
|   CURLINFO_LASTONE          = 42 | ||||
|   CURLINFO_LASTONE          = 43 | ||||
| } CURLINFO; | ||||
|  | ||||
| /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as | ||||
| @@ -2148,6 +2223,7 @@ typedef struct { | ||||
| #define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */ | ||||
| #define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ | ||||
| #define CURL_VERSION_NTLM_WB   (1<<15) /* NTLM delegating to winbind helper */ | ||||
| #define CURL_VERSION_HTTP2     (1<<16) /* HTTP2 support built-in */ | ||||
|  | ||||
|  /* | ||||
|  * NAME curl_version_info() | ||||
|   | ||||
| @@ -58,51 +58,52 @@ | ||||
| /* ================================================================ */ | ||||
|  | ||||
| #ifdef CURL_SIZEOF_LONG | ||||
| #  error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" | ||||
| #error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_TYPEOF_CURL_SOCKLEN_T | ||||
| #  error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_SIZEOF_CURL_SOCKLEN_T | ||||
| #  error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_TYPEOF_CURL_OFF_T | ||||
| #  error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_FORMAT_CURL_OFF_T | ||||
| #  error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_FORMAT_CURL_OFF_TU | ||||
| #  error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" | ||||
| #error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_FORMAT_OFF_T | ||||
| #  error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_SIZEOF_CURL_OFF_T | ||||
| #  error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_SUFFIX_CURL_OFF_T | ||||
| #  error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
| #error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined | ||||
| #endif | ||||
|  | ||||
| #ifdef CURL_SUFFIX_CURL_OFF_TU | ||||
| #  error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" | ||||
| #error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" | ||||
|    Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined | ||||
| #endif | ||||
|  | ||||
| @@ -110,71 +111,87 @@ | ||||
| /*  EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY  */ | ||||
| /* ================================================================ */ | ||||
|  | ||||
| /* Configure process defines this to 1 when it finds out that system  */ | ||||
| /* header file ws2tcpip.h must be included by the external interface. */ | ||||
| #cmakedefine CURL_PULL_WS2TCPIP_H | ||||
| #ifdef CURL_PULL_WS2TCPIP_H | ||||
| #  ifndef WIN32_LEAN_AND_MEAN | ||||
| #    define WIN32_LEAN_AND_MEAN | ||||
| #  endif | ||||
| #  include <windows.h> | ||||
| #  include <winsock2.h> | ||||
| #  include <ws2tcpip.h> | ||||
| #endif | ||||
|  | ||||
| /* Configure process defines this to 1 when it finds out that system   */ | ||||
| /* header file sys/types.h must be included by the external interface. */ | ||||
| #cmakedefine CURL_PULL_SYS_TYPES_H ${CURL_PULL_SYS_TYPES_H} | ||||
| #cmakedefine CURL_PULL_SYS_TYPES_H | ||||
| #ifdef CURL_PULL_SYS_TYPES_H | ||||
| #  include <sys/types.h> | ||||
| #endif | ||||
|  | ||||
| /* Configure process defines this to 1 when it finds out that system */ | ||||
| /* header file stdint.h must be included by the external interface.  */ | ||||
| #cmakedefine CURL_PULL_STDINT_H ${CURL_PULL_STDINT_H} | ||||
| #cmakedefine CURL_PULL_STDINT_H | ||||
| #ifdef CURL_PULL_STDINT_H | ||||
| #  include <stdint.h> | ||||
| #endif | ||||
|  | ||||
| /* Configure process defines this to 1 when it finds out that system  */ | ||||
| /* header file inttypes.h must be included by the external interface. */ | ||||
| #cmakedefine CURL_PULL_INTTYPES_H ${CURL_PULL_INTTYPES_H} | ||||
| #cmakedefine CURL_PULL_INTTYPES_H | ||||
| #ifdef CURL_PULL_INTTYPES_H | ||||
| #  include <inttypes.h> | ||||
| #endif | ||||
|  | ||||
| /* The size of `long', as computed by sizeof. */ | ||||
| #cmakedefine CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} | ||||
|  | ||||
| /* Integral data type used for curl_socklen_t. */ | ||||
| #cmakedefine CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} | ||||
|  | ||||
| /* on windows socklen_t is in here */ | ||||
| #ifdef _WIN32 | ||||
| #  include <winsock2.h> | ||||
| #  include <ws2tcpip.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| /* Configure process defines this to 1 when it finds out that system    */ | ||||
| /* header file sys/socket.h must be included by the external interface. */ | ||||
| #cmakedefine CURL_PULL_SYS_SOCKET_H | ||||
| #ifdef CURL_PULL_SYS_SOCKET_H | ||||
| #  include <sys/socket.h> | ||||
| #endif | ||||
|  | ||||
| /* Configure process defines this to 1 when it finds out that system  */ | ||||
| /* header file sys/poll.h must be included by the external interface. */ | ||||
| #cmakedefine CURL_PULL_SYS_POLL_H | ||||
| #ifdef CURL_PULL_SYS_POLL_H | ||||
| #  include <sys/poll.h> | ||||
| #endif | ||||
|  | ||||
| /* The size of `long', as computed by sizeof. */ | ||||
| #define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} | ||||
|  | ||||
| /* Integral data type used for curl_socklen_t. */ | ||||
| #define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} | ||||
|  | ||||
| /* The size of `curl_socklen_t', as computed by sizeof. */ | ||||
| #define CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} | ||||
|  | ||||
| /* Data type definition of curl_socklen_t. */ | ||||
| typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; | ||||
|  | ||||
| /* The size of `curl_socklen_t', as computed by sizeof. */ | ||||
| #cmakedefine CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} | ||||
|  | ||||
| /* Signed integral data type used for curl_off_t. */ | ||||
| #cmakedefine CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} | ||||
| #define CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} | ||||
|  | ||||
| /* Data type definition of curl_off_t. */ | ||||
| typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; | ||||
|  | ||||
| /* curl_off_t formatting string directive without "%" conversion specifier. */ | ||||
| #cmakedefine CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" | ||||
| #define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" | ||||
|  | ||||
| /* unsigned curl_off_t formatting string without "%" conversion specifier. */ | ||||
| #cmakedefine CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" | ||||
| #define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" | ||||
|  | ||||
| /* curl_off_t formatting string directive with "%" conversion specifier. */ | ||||
| #cmakedefine CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" | ||||
| #define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" | ||||
|  | ||||
| /* The size of `curl_off_t', as computed by sizeof. */ | ||||
| #cmakedefine CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} | ||||
| #define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} | ||||
|  | ||||
| /* curl_off_t constant suffix. */ | ||||
| #cmakedefine CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} | ||||
| #define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} | ||||
|  | ||||
| /* unsigned curl_off_t constant suffix. */ | ||||
| #cmakedefine CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} | ||||
| #define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} | ||||
|  | ||||
| #endif /* __CURL_CURLBUILD_H */ | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2014, 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 | ||||
| @@ -26,16 +26,16 @@ | ||||
|    a script at release-time. This was made its own header file in 7.11.2 */ | ||||
|  | ||||
| /* This is the global package copyright */ | ||||
| #define LIBCURL_COPYRIGHT "1996 - 2013 Daniel Stenberg, <daniel@haxx.se>." | ||||
| #define LIBCURL_COPYRIGHT "1996 - 2014 Daniel Stenberg, <daniel@haxx.se>." | ||||
|  | ||||
| /* This is the version number of the libcurl package from which this header | ||||
|    file origins: */ | ||||
| #define LIBCURL_VERSION "7.31.0-DEV" | ||||
| #define LIBCURL_VERSION "7.36.0-DEV" | ||||
|  | ||||
| /* The numeric version number is also available "in parts" by using these | ||||
|    defines: */ | ||||
| #define LIBCURL_VERSION_MAJOR 7 | ||||
| #define LIBCURL_VERSION_MINOR 31 | ||||
| #define LIBCURL_VERSION_MINOR 36 | ||||
| #define LIBCURL_VERSION_PATCH 0 | ||||
|  | ||||
| /* This is the numeric version of the libcurl version number, meant for easier | ||||
| @@ -53,7 +53,7 @@ | ||||
|    and it is always a greater number in a more recent release. It makes | ||||
|    comparisons with greater than and less than work. | ||||
| */ | ||||
| #define LIBCURL_VERSION_NUM 0x071f00 | ||||
| #define LIBCURL_VERSION_NUM 0x072400 | ||||
|  | ||||
| /* | ||||
|  * This is the date and time when the full source package was created. The | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2012, 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 | ||||
| @@ -64,6 +64,8 @@ typedef enum { | ||||
|   CURLM_INTERNAL_ERROR,  /* this is a libcurl bug */ | ||||
|   CURLM_BAD_SOCKET,      /* the passed in socket argument did not match */ | ||||
|   CURLM_UNKNOWN_OPTION,  /* curl_multi_setopt() with unsupported option */ | ||||
|   CURLM_ADDED_ALREADY,   /* an easy handle already added to a multi handle was | ||||
|                             attempted to get added - again */ | ||||
|   CURLM_LAST | ||||
| } CURLMcode; | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2012, 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 | ||||
| @@ -264,6 +264,12 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist, | ||||
|    (option) == CURLOPT_RTSP_SESSION_ID ||                                     \ | ||||
|    (option) == CURLOPT_RTSP_STREAM_URI ||                                     \ | ||||
|    (option) == CURLOPT_RTSP_TRANSPORT ||                                      \ | ||||
|    (option) == CURLOPT_XOAUTH2_BEARER ||                                      \ | ||||
|    (option) == CURLOPT_DNS_SERVERS ||                                         \ | ||||
|    (option) == CURLOPT_DNS_INTERFACE ||                                       \ | ||||
|    (option) == CURLOPT_DNS_LOCAL_IP4 ||                                       \ | ||||
|    (option) == CURLOPT_DNS_LOCAL_IP6 ||                                       \ | ||||
|    (option) == CURLOPT_LOGIN_OPTIONS ||                                       \ | ||||
|    0) | ||||
|  | ||||
| /* evaluates to true if option takes a curl_write_callback argument */ | ||||
|   | ||||
| @@ -94,6 +94,10 @@ add_library( | ||||
|   ${HHEADERS} ${CSOURCES} | ||||
|   ) | ||||
|  | ||||
| if(MSVC AND CURL_STATICLIB) | ||||
|   set_target_properties(${LIB_NAME} PROPERTIES STATIC_LIBRARY_FLAGS ${CMAKE_EXE_LINKER_FLAGS}) | ||||
| endif() | ||||
|  | ||||
| target_link_libraries(${LIB_NAME} ${CURL_LIBS}) | ||||
|  | ||||
| if(WIN32) | ||||
| @@ -108,14 +112,6 @@ setup_curl_dependencies(${LIB_NAME}) | ||||
| set_target_properties(${LIB_NAME} PROPERTIES PREFIX "") | ||||
| set_target_properties(${LIB_NAME} PROPERTIES IMPORT_PREFIX "") | ||||
|  | ||||
| if(MSVC) | ||||
|   if(NOT BUILD_RELEASE_DEBUG_DIRS) | ||||
|     # Ugly workaround to remove the "/debug" or "/release" in each output | ||||
|     set_target_properties(${LIB_NAME} PROPERTIES PREFIX "../") | ||||
|     set_target_properties(${LIB_NAME} PROPERTIES IMPORT_PREFIX "../") | ||||
|   endif() | ||||
| endif() | ||||
|  | ||||
| if(WIN32) | ||||
|   if(NOT CURL_STATICLIB) | ||||
|     # Add "_imp" as a suffix before the extension to avoid conflicting with the statically linked "libcurl.lib" | ||||
|   | ||||
| @@ -3,16 +3,31 @@ | ||||
| #  G. Vanem <gvanem@broadpark.no> | ||||
| # | ||||
|  | ||||
| .ERASE | ||||
|  | ||||
| !if $(__VERSION__) < 1280 | ||||
| !message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||||
| !message ! This Open Watcom version is too old and is no longer supported ! | ||||
| !message !     Please download latest version from www.openwatcom.org     ! | ||||
| !message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||||
| !error Unsupported version of Open Watcom | ||||
| !endif | ||||
|  | ||||
| !ifndef %watcom | ||||
| !error WATCOM environment variable not set! | ||||
| !endif | ||||
|  | ||||
| # In order to process Makefile.inc wmake must be called with -u switch! | ||||
| !ifndef %MAKEFLAGS | ||||
| !error You MUST call wmake with the -u switch! | ||||
| !endif | ||||
|  | ||||
| !ifdef %libname | ||||
| LIBNAME = $(%libname) | ||||
| !else | ||||
| LIBNAME = libcurl | ||||
| !endif | ||||
| TARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib | ||||
| TARGETS = $(LIBNAME).dll $(LIBNAME).lib | ||||
|  | ||||
| CC = wcc386 | ||||
| LD = wlink | ||||
| @@ -23,37 +38,29 @@ RC = wrc | ||||
| !  loaddll wcc386  wccd386 | ||||
| !  loaddll wpp386  wppd386 | ||||
| !  loaddll wlib    wlibd | ||||
| !  if $(__VERSION__) > 1270 | ||||
| !  loaddll wlink   wlinkd | ||||
| !  else | ||||
| !    loaddll wlink   wlink | ||||
| !  endif | ||||
| !endif | ||||
|  | ||||
| !ifdef __LINUX__ | ||||
| DS = / | ||||
| CP = cp | ||||
| MD = mkdir -p | ||||
| RD = rmdir -p | ||||
| RM = rm -f | ||||
| !else | ||||
| DS = $(X)\$(X) | ||||
| CP = copy 2>NUL | ||||
| MD = mkdir | ||||
| RD = rmdir /q /s 2>NUL | ||||
| !if $(__VERSION__) < 1250 | ||||
| RM = del /q /f 2>NUL | ||||
| !else | ||||
| RM = rm -f | ||||
| !endif | ||||
| !if $(__VERSION__) > 1290 | ||||
| RD = rm -rf | ||||
| !else ifdef __UNIX__ | ||||
| RD = rm -rf | ||||
| !else | ||||
| RD = rmdir /q /s 2>NUL | ||||
| !endif | ||||
|  | ||||
| SYS_INCL = -I$(%watcom)$(DS)h$(DS)nt -I$(%watcom)$(DS)h | ||||
| SYS_LIBS = $(%watcom)$(DS)lib386$(DS)nt;$(%watcom)$(DS)lib386 | ||||
| SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h" | ||||
|  | ||||
| CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm & | ||||
|          -wcd=201 -bt=nt -d+ -dWIN32 -dCURL_WANTS_CA_BUNDLE_ENV         & | ||||
|          -dBUILDING_LIBCURL -dHAVE_SPNEGO=1 -I. -I..$(DS)include $(SYS_INCL) | ||||
|          -dBUILDING_LIBCURL -dHAVE_SPNEGO=1 -I. -I"../include" $(SYS_INCL) | ||||
|  | ||||
| !ifdef %debug | ||||
| DEBUG  = -dDEBUG=1 -dDEBUGBUILD | ||||
| @@ -83,169 +90,162 @@ CFLAGS += -dWANT_IDN_PROTOTYPES | ||||
| !ifdef %zlib_root | ||||
| ZLIB_ROOT = $(%zlib_root) | ||||
| !else | ||||
| ZLIB_ROOT = ..$(DS)..$(DS)zlib-1.2.8 | ||||
| ZLIB_ROOT = ../../zlib-1.2.8 | ||||
| !endif | ||||
|  | ||||
| !ifdef %libssh2_root | ||||
| LIBSSH2_ROOT = $(%libssh2_root) | ||||
| !else | ||||
| LIBSSH2_ROOT = ..$(DS)..$(DS)libssh2-1.4.3 | ||||
| LIBSSH2_ROOT = ../../libssh2-1.4.3 | ||||
| !endif | ||||
|  | ||||
| !ifdef %librtmp_root | ||||
| LIBRTMP_ROOT = $(%librtmp_root) | ||||
| !else | ||||
| LIBRTMP_ROOT = ..$(DS)..$(DS)rtmpdump-2.3 | ||||
| LIBRTMP_ROOT = ../../rtmpdump-2.3 | ||||
| !endif | ||||
|  | ||||
| !ifdef %openssl_root | ||||
| OPENSSL_ROOT = $(%openssl_root) | ||||
| !else | ||||
| OPENSSL_ROOT = ..$(DS)..$(DS)openssl-0.9.8y | ||||
| OPENSSL_ROOT = ../../openssl-0.9.8y | ||||
| !endif | ||||
|  | ||||
| !ifdef %ares_root | ||||
| ARES_ROOT = $(%ares_root) | ||||
| !else | ||||
| ARES_ROOT = ..$(DS)ares | ||||
| ARES_ROOT = ../ares | ||||
| !endif | ||||
|  | ||||
| !ifdef %use_zlib | ||||
| CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I$(ZLIB_ROOT) | ||||
| CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I"$(ZLIB_ROOT)" | ||||
| !endif | ||||
|  | ||||
| !ifdef %use_rtmp | ||||
| CFLAGS += -dUSE_LIBRTMP -I$(LIBRTMP_ROOT) | ||||
| CFLAGS += -dUSE_LIBRTMP -I"$(LIBRTMP_ROOT)" | ||||
| !endif | ||||
|  | ||||
| !ifdef %use_ssh2 | ||||
| CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I$(LIBSSH2_ROOT)$(DS)include -I$(LIBSSH2_ROOT)$(DS)win32 | ||||
| CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH2_ROOT)/win32" | ||||
| !endif | ||||
|  | ||||
| !ifdef %use_ssl | ||||
| CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I$(OPENSSL_ROOT)$(DS)inc32 | ||||
| CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I"$(OPENSSL_ROOT)/inc32" | ||||
| !endif | ||||
|  | ||||
| !ifdef %use_ares | ||||
| CFLAGS += -dUSE_ARES -I$(ARES_ROOT) | ||||
| CFLAGS += -dUSE_ARES -I"$(ARES_ROOT)" | ||||
| !endif | ||||
|  | ||||
| !ifdef %use_watt32 | ||||
| CFLAGS += -dUSE_WATT32 -I$(%watt_root)$(DS)inc | ||||
| CFLAGS += -dUSE_WATT32 -I"$(%watt_root)/inc" | ||||
| !endif | ||||
|  | ||||
| OBJ_BASE = WC_Win32.obj | ||||
| LINK_ARG = $(OBJ_BASE)$(DS)dyn$(DS)wlink.arg | ||||
| LIB_ARG  = $(OBJ_BASE)$(DS)stat$(DS)wlib.arg | ||||
|  | ||||
| # In order to process Makefile.inc wmake must be called with -u switch! | ||||
| !ifndef %MAKEFLAGS | ||||
| !error You MUST call wmake with the -u switch! | ||||
| !if $(__VERSION__) > 1290 | ||||
| OBJ_STAT = $(OBJ_BASE)/stat | ||||
| OBJ_DYN  = $(OBJ_BASE)/dyn | ||||
| !else ifdef __UNIX__ | ||||
| OBJ_STAT = $(OBJ_BASE)/stat | ||||
| OBJ_DYN  = $(OBJ_BASE)/dyn | ||||
| !else | ||||
| OBJ_STAT = $(OBJ_BASE)\stat | ||||
| OBJ_DYN  = $(OBJ_BASE)\dyn | ||||
| !endif | ||||
|  | ||||
| LINK_ARG = $(OBJ_DYN)/wlink.arg | ||||
| LIB_ARG  = $(OBJ_STAT)/wlib.arg | ||||
|  | ||||
| !include Makefile.inc | ||||
| !endif | ||||
|  | ||||
| OBJS = $(CSOURCES:.c=.obj) | ||||
| !ifdef __LINUX__ | ||||
| OBJS = $OBJ_DIR/$(OBJS: = $OBJ_DIR/) | ||||
| OBJS1 = ./$(CSOURCES:.c=.obj) | ||||
| OBJS2 = $(OBJS1:vtls/=) | ||||
| OBJS3 = $(OBJS2: = ./) | ||||
| OBJS_STAT = $(OBJS3:./=$(OBJ_STAT)/) | ||||
| OBJS_DYN  = $(OBJS3:./=$(OBJ_DYN)/) | ||||
|  | ||||
| !else | ||||
| OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\) | ||||
| !endif | ||||
| CURLBUILDH = ../include/curl/curlbuild.h | ||||
| RESOURCE   = $(OBJ_DYN)/libcurl.res | ||||
|  | ||||
| # | ||||
| # Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN). | ||||
| # | ||||
| OBJ_DIR    = $(OBJ_BASE)$(DS)stat | ||||
| OBJS_STAT  = $+ $(OBJS) $- | ||||
| DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn | ||||
|  | ||||
| OBJ_DIR    = $(OBJ_BASE)$(DS)dyn | ||||
| OBJS_DYN   = $+ $(OBJS) $- | ||||
| .c : vtls | ||||
|  | ||||
| CURLBUILDH = ..$(DS)include$(DS)curl$(DS)curlbuild.h | ||||
| RESOURCE   = $(OBJ_BASE)$(DS)dyn$(DS)libcurl.res | ||||
|  | ||||
| all: $(CURLBUILDH) $(OBJ_BASE) $(TARGETS) .SYMBOLIC | ||||
| all: $(CURLBUILDH) $(DIRS) $(TARGETS) .SYMBOLIC | ||||
| 	@echo Welcome to libcurl | ||||
|  | ||||
| clean: .SYMBOLIC | ||||
| 	-$(RM) $(OBJS_STAT) | ||||
| 	-$(RM) $(OBJS_DYN) | ||||
| 	-$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG) | ||||
| 	-rm -f $(OBJS_STAT) | ||||
| 	-rm -f $(OBJS_DYN) | ||||
| 	-rm -f $(RESOURCE) $(LINK_ARG) $(LIB_ARG) | ||||
|  | ||||
| vclean distclean: clean .SYMBOLIC | ||||
| 	-$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym | ||||
| 	-$(RD) $(OBJ_BASE)$(DS)stat | ||||
| 	-$(RD) $(OBJ_BASE)$(DS)dyn | ||||
| 	-rm -f $(TARGETS) $(LIBNAME).map $(LIBNAME).sym | ||||
| 	-$(RD) $(OBJ_STAT) | ||||
| 	-$(RD) $(OBJ_DYN) | ||||
| 	-$(RD) $(OBJ_BASE) | ||||
|  | ||||
| $(OBJ_BASE): | ||||
| $(DIRS): | ||||
| 	-$(MD) $^@ | ||||
| 	-$(MD) $^@$(DS)stat | ||||
| 	-$(MD) $^@$(DS)dyn | ||||
|  | ||||
| $(CURLBUILDH): .EXISTSONLY | ||||
| 	$(CP) $^@.dist $^@ | ||||
|  | ||||
| $(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(LINK_ARG) | ||||
| 	$(LD) name $^@ @$]@ | ||||
|  | ||||
| $(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG) | ||||
| 	$(AR) -q -b -c $^@ @$]@ | ||||
|  | ||||
| .ERASE | ||||
| $(RESOURCE): libcurl.rc | ||||
| 	$(RC) $(DEBUG) -q -r -zm -bt=nt -I..$(DS)include $(SYS_INCL) $[@ -fo=$^@ | ||||
|  | ||||
| .ERASE | ||||
| .c{$(OBJ_BASE)$(DS)dyn}.obj: | ||||
| 	$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@ | ||||
|  | ||||
| .ERASE | ||||
| .c{$(OBJ_BASE)$(DS)stat}.obj: | ||||
| 	$(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@ | ||||
|  | ||||
| $(LINK_ARG): $(__MAKEFILES__) | ||||
| 	%create $^@ | ||||
| 	@%append $^@ system nt dll | ||||
| 	@%append $^@ file { $(OBJS_DYN) } | ||||
| $(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__) | ||||
| 	%create $(LINK_ARG) | ||||
| 	@%append $(LINK_ARG) system nt dll | ||||
| !ifdef %debug | ||||
| 	@%append $^@ debug all | ||||
| 	@%append $^@ option symfile | ||||
| 	@%append $(LINK_ARG) debug all | ||||
| 	@%append $(LINK_ARG) option symfile | ||||
| !endif | ||||
| 	@%append $^@ option quiet, map, caseexact, eliminate, implib=$(LIBNAME)_imp.lib, | ||||
| 	@%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS) | ||||
| 	@%append $^@ library wldap32.lib | ||||
| 	@%append $(LINK_ARG) option quiet, caseexact, eliminate | ||||
| 	@%append $(LINK_ARG) option map=$(OBJ_DYN)/$(LIBNAME).map | ||||
| 	@%append $(LINK_ARG) option implib=$(LIBNAME)_imp.lib | ||||
| 	@%append $(LINK_ARG) option res=$(RESOURCE) | ||||
| 	@for %f in ($(OBJS_DYN)) do @%append $(LINK_ARG) file %f | ||||
| 	@%append $(LINK_ARG) library wldap32.lib | ||||
| !ifdef %use_watt32 | ||||
| 	@%append $^@ library $(%watt_root)$(DS)lib$(DS)wattcpw_imp.lib | ||||
| 	@%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib' | ||||
| !else | ||||
| 	@%append $^@ library ws2_32.lib | ||||
| 	@%append $(LINK_ARG) library ws2_32.lib | ||||
| !endif | ||||
| !ifdef %use_zlib | ||||
| 	@%append $^@ library $(ZLIB_ROOT)$(DS)zlib.lib | ||||
| 	@%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib' | ||||
| !endif | ||||
| !ifdef %use_rtmp | ||||
| 	@%append $^@ library $(LIBRTMP_ROOT)$(DS)librtmp$(DS)librtmp.lib | ||||
| 	@%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib' | ||||
| !endif | ||||
| !ifdef %use_ssh2 | ||||
| 	@%append $^@ library $(LIBSSH2_ROOT)$(DS)win32$(DS)libssh2.lib | ||||
| 	@%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib' | ||||
| !endif | ||||
| !ifdef %use_ssl | ||||
| 	@%append $^@ library $(OPENSSL_ROOT)$(DS)out32$(DS)libeay32.lib, $(OPENSSL_ROOT)$(DS)out32$(DS)ssleay32.lib | ||||
| 	@%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib' | ||||
| 	@%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib' | ||||
| !endif | ||||
| !ifdef %use_ares | ||||
| 	@%append $^@ library $(ARES_ROOT)$(DS)cares.lib | ||||
| 	@%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib' | ||||
| !endif | ||||
| !ifdef %use_winidn | ||||
| !  if $(__VERSION__) > 1290 | ||||
| 	@%append $^@ library normaliz.lib | ||||
| 	@%append $(LINK_ARG) library normaliz.lib | ||||
| !  else | ||||
| 	@%append $^@ import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' | ||||
| 	@%append $^@ import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' | ||||
| 	@%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' | ||||
| 	@%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' | ||||
| !  endif | ||||
| !endif | ||||
| 	$(LD) name $^@ @$(LINK_ARG) | ||||
|  | ||||
| $(LIB_ARG): $(__MAKEFILES__) | ||||
| 	%create $^@ | ||||
| 	@for %f in ($(OBJS_STAT)) do @%append $^@ +- %f | ||||
| $(LIBNAME).lib: $(OBJS_STAT) | ||||
| 	%create $(LIB_ARG) | ||||
| 	@for %f in ($<) do @%append $(LIB_ARG) +- %f | ||||
| 	$(AR) -q -b -c -pa $^@ @$(LIB_ARG) | ||||
|  | ||||
| $(RESOURCE): libcurl.rc | ||||
| 	$(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@ | ||||
|  | ||||
| .c{$(OBJ_DYN)}.obj: | ||||
| 	$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@ | ||||
|  | ||||
| .c{$(OBJ_STAT)}.obj: | ||||
| 	$(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@ | ||||
| 	 | ||||
| @@ -60,20 +60,15 @@ CFLAGS += @CURL_CFLAG_EXTRAS@ | ||||
| # $(top_builddir)/ares is for in-tree c-ares's generated ares_build.h file | ||||
| # $(top_srcdir)/ares is for in-tree c-ares's external include files | ||||
|  | ||||
| if USE_EMBEDDED_ARES | ||||
| AM_CPPFLAGS = -I$(top_builddir)/include/curl \ | ||||
|               -I$(top_builddir)/include      \ | ||||
|               -I$(top_srcdir)/include        \ | ||||
|               -I$(top_builddir)/lib          \ | ||||
|               -I$(top_srcdir)/lib            \ | ||||
|               -I$(top_builddir)/ares         \ | ||||
|               -I$(top_srcdir)/ares | ||||
| else | ||||
| AM_CPPFLAGS = -I$(top_builddir)/include/curl \ | ||||
|               -I$(top_builddir)/include      \ | ||||
|               -I$(top_srcdir)/include        \ | ||||
|               -I$(top_builddir)/lib          \ | ||||
|               -I$(top_srcdir)/lib | ||||
|  | ||||
| if USE_EMBEDDED_ARES | ||||
| AM_CPPFLAGS += -I$(top_builddir)/ares        \ | ||||
|                -I$(top_srcdir)/ares | ||||
| endif | ||||
|  | ||||
| # Prevent LIBS from being used for all link targets | ||||
| @@ -141,7 +136,7 @@ libcurl_la_CFLAGS_EXTRA += $(CFLAG_CURL_SYMBOL_HIDING) | ||||
| endif | ||||
|  | ||||
| libcurl_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcurl_la_CPPFLAGS_EXTRA) | ||||
| libcurl_la_LDFLAGS = $(AM_LDFLAGS) $(libcurl_la_LDFLAGS_EXTRA) $(LIBCURL_LIBS) | ||||
| libcurl_la_LDFLAGS = $(AM_LDFLAGS) $(libcurl_la_LDFLAGS_EXTRA) $(LDFLAGS) $(LIBCURL_LIBS) | ||||
| libcurl_la_CFLAGS = $(AM_CFLAGS) $(libcurl_la_CFLAGS_EXTRA) | ||||
|  | ||||
| libcurlu_la_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB -DUNITTESTS | ||||
|   | ||||
| @@ -52,7 +52,7 @@ LDFLAGS  = -q -lq -laa -tWD | ||||
| SRCDIR   = . | ||||
| OBJDIR   = .\BCC_objs | ||||
| INCDIRS  = -I.;..\include | ||||
| LINKLIB  = $(BCCDIR)\lib\cw32mt.lib | ||||
| LINKLIB  = $(BCCDIR)\lib\cw32mt.lib $(BCCDIR)\lib\ws2_32.lib | ||||
| DEFINES  = -DNDEBUG -DWIN32 -DBUILDING_LIBCURL | ||||
|  | ||||
| # By default SSPI support is enabled for BCC | ||||
| @@ -88,8 +88,24 @@ LINKLIB  = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\l | ||||
| # Makefile.inc provides the CSOURCES and HHEADERS defines | ||||
| !include Makefile.inc | ||||
|  | ||||
| OBJECTS = $(CSOURCES:.c=.obj) | ||||
| PREPROCESSED = $(CSOURCES:.c=.int) | ||||
| # Borland's command line librarian program TLIB version 4.5 is not capable | ||||
| # of building a library when any of its objects contains an hypen in its | ||||
| # name, due to a command line parsing bug. In order to workaround this, we | ||||
| # build source files with hyphens in their name as objects with underscores | ||||
| # using explicit compilation build rules instead of implicit ones. | ||||
|  | ||||
| NOHYPHEN = $(CSOURCES:-=_) | ||||
|  | ||||
| OBJECTS = $(NOHYPHEN:.c=.obj) | ||||
| PREPROCESSED = $(NOHYPHEN:.c=.int) | ||||
|  | ||||
| # Borland's command line compiler (BCC32) version 5.5.1 integrated | ||||
| # preprocessor has a bug which results in silently generating wrong | ||||
| # definitions for libcurl macros such as CURL_OFF_T_C, on the other | ||||
| # hand Borland's command line preprocessor (CPP32) version 5.5.1 does | ||||
| # not have the bug and achieves proper results. In order to avoid the | ||||
| # silent bug we first preprocess source files and later compile the | ||||
| # preprocessed result. | ||||
|  | ||||
| .c.obj: | ||||
| 	@-$(RM) $(@R).int | ||||
| @@ -98,6 +114,21 @@ PREPROCESSED = $(CSOURCES:.c=.int) | ||||
|  | ||||
| all:	$(OBJDIR) $(LIBCURL_LIB) $(LIBCURL_DLL) | ||||
|  | ||||
| asyn_ares.obj: asyn-ares.c | ||||
| 	@-$(RM) $(@R).int | ||||
| 	$(PP_CMD) $(CC_FLAGS) $(INCDIRS) $(DEFINES) -o$(@R).int $(?) | ||||
| 	$(CC_CMD) $(CC_FLAGS) -o$(@) $(@R).int | ||||
|  | ||||
| asyn_thread.obj: asyn-thread.c | ||||
| 	@-$(RM) $(@R).int | ||||
| 	$(PP_CMD) $(CC_FLAGS) $(INCDIRS) $(DEFINES) -o$(@R).int $(?) | ||||
| 	$(CC_CMD) $(CC_FLAGS) -o$(@) $(@R).int | ||||
|  | ||||
| non_ascii.obj: non-ascii.c | ||||
| 	@-$(RM) $(@R).int | ||||
| 	$(PP_CMD) $(CC_FLAGS) $(INCDIRS) $(DEFINES) -o$(@R).int $(?) | ||||
| 	$(CC_CMD) $(CC_FLAGS) -o$(@) $(@R).int | ||||
|  | ||||
| clean: | ||||
| 	cd $(OBJDIR) | ||||
| 	@-$(RM) $(OBJECTS) | ||||
| @@ -122,7 +153,10 @@ $(LIBCURL_LIB): $(OBJECTS) | ||||
| $(LIBCURL_DLL) $(LIBCURL_IMPLIB): $(OBJECTS) $(LINKLIB) | ||||
| 	@-$(RM) $(LIBCURL_DLL) | ||||
| 	@-$(RM) $(LIBCURL_IMPLIB) | ||||
| 	$(LD) $(LDFLAGS) -e$(LIBCURL_DLL) $** | ||||
| 	$(LD) $(LDFLAGS) -e$(LIBCURL_DLL) @&&! | ||||
| $(**: = ^ | ||||
| ) | ||||
| ! | ||||
| 	$(IMPLIB) $(LIBCURL_IMPLIB) $(LIBCURL_DLL) | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										102
									
								
								lib/Makefile.inc
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								lib/Makefile.inc
									
									
									
									
									
								
							| @@ -1,47 +1,65 @@ | ||||
| # ./lib/Makefile.inc | ||||
| # Using the backslash as line continuation character might be problematic | ||||
| # with some make flavours, as Watcom's wmake showed us already. If we | ||||
| # ever want to change this in a portable manner then we should consider | ||||
| # this idea (posted to the libcurl list by Adam Kellas): | ||||
| # CSRC1 = file1.c file2.c file3.c | ||||
| # CSRC2 = file4.c file5.c file6.c | ||||
| # CSOURCES = $(CSRC1) $(CSRC2) | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  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. | ||||
| # | ||||
| ########################################################################### | ||||
|  | ||||
| VSOURCES=vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c vtls/qssl.c	\ | ||||
|   vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c vtls/cyassl.c	\ | ||||
|   vtls/curl_schannel.c vtls/curl_darwinssl.c vtls/gskit.c | ||||
| VHEADERS= vtls/qssl.h vtls/openssl.h vtls/vtls.h vtls/gtls.h		\ | ||||
|   vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h	\ | ||||
|   vtls/cyassl.h vtls/curl_schannel.h vtls/curl_darwinssl.h vtls/gskit.h | ||||
|  | ||||
| CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c	\ | ||||
|   cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c	\ | ||||
|   ldap.c ssluse.c version.c getenv.c escape.c mprintf.c telnet.c	\ | ||||
|   netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c	\ | ||||
|   curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c		\ | ||||
|   memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c	\ | ||||
|   content_encoding.c share.c http_digest.c md4.c md5.c curl_rand.c	\ | ||||
|   http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c		\ | ||||
|   hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c	\ | ||||
|   select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c nss.c	\ | ||||
|   qssl.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c		\ | ||||
|   ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c		\ | ||||
|   getinfo.c transfer.c strequal.c easy.c security.c curl_fnmatch.c	\ | ||||
|   fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c	\ | ||||
|   strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c	\ | ||||
|   http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c	\ | ||||
|   strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c		\ | ||||
|   inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c	\ | ||||
|   ssh.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c		\ | ||||
|   curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c	\ | ||||
|   pingpong.c rtsp.c curl_threads.c warnless.c hmac.c polarssl.c		\ | ||||
|   polarssl_threadlock.c curl_rtmp.c openldap.c curl_gethostname.c	\ | ||||
|   gopher.c axtls.c idn_win32.c http_negotiate_sspi.c cyassl.c		\ | ||||
|   http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c	\ | ||||
|   curl_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_ntlm_msgs.c		\ | ||||
|   curl_sasl.c curl_schannel.c curl_multibyte.c curl_darwinssl.c		\ | ||||
|   hostcheck.c bundles.c conncache.c pipeline.c | ||||
|   pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c	\ | ||||
|   openldap.c curl_gethostname.c gopher.c idn_win32.c			\ | ||||
|   http_negotiate_sspi.c http_proxy.c non-ascii.c asyn-ares.c		\ | ||||
|   asyn-thread.c curl_gssapi.c curl_ntlm.c curl_ntlm_wb.c		\ | ||||
|   curl_ntlm_core.c curl_ntlm_msgs.c curl_sasl.c curl_multibyte.c	\ | ||||
|   hostcheck.c bundles.c conncache.c pipeline.c dotdot.c x509asn1.c	\ | ||||
|   http2.c $(VSOURCES) | ||||
|  | ||||
| HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h	\ | ||||
|   progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h	\ | ||||
|   if2ip.h speedcheck.h urldata.h curl_ldap.h ssluse.h escape.h telnet.h	\ | ||||
|   getinfo.h strequal.h krb4.h memdebug.h http_chunks.h curl_rand.h	\ | ||||
|   curl_fnmatch.h wildcard.h fileinfo.h ftplistparser.h strtok.h		\ | ||||
|   connect.h llist.h hash.h content_encoding.h share.h curl_md4.h	\ | ||||
|   curl_md5.h http_digest.h http_negotiate.h inet_pton.h amigaos.h	\ | ||||
|   strtoofft.h strerror.h inet_ntop.h curlx.h curl_memory.h curl_setup.h	\ | ||||
|   transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h	\ | ||||
|   tftp.h sockaddr.h splay.h strdup.h socks.h ssh.h nssg.h curl_base64.h	\ | ||||
|   rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h		\ | ||||
|   curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h	\ | ||||
|   warnless.h curl_hmac.h polarssl.h polarssl_threadlock.h curl_rtmp.h	\ | ||||
|   curl_gethostname.h gopher.h axtls.h cyassl.h http_proxy.h non-ascii.h	\ | ||||
|   asyn.h curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h	\ | ||||
|   curl_ntlm_msgs.h curl_sasl.h curl_schannel.h curl_multibyte.h		\ | ||||
|   curl_darwinssl.h hostcheck.h bundles.h conncache.h curl_setup_once.h	\ | ||||
|   multihandle.h setup-vms.h pipeline.h | ||||
| HHEADERS = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h	\ | ||||
|   formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h		\ | ||||
|   speedcheck.h urldata.h curl_ldap.h escape.h telnet.h getinfo.h	\ | ||||
|   strequal.h curl_sec.h memdebug.h http_chunks.h curl_fnmatch.h		\ | ||||
|   wildcard.h fileinfo.h ftplistparser.h strtok.h connect.h llist.h	\ | ||||
|   hash.h content_encoding.h share.h curl_md4.h curl_md5.h http_digest.h	\ | ||||
|   http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h		\ | ||||
|   inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h	\ | ||||
|   easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h	\ | ||||
|   socks.h ssh.h curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h	\ | ||||
|   slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h	\ | ||||
|   rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h		\ | ||||
|   curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h		\ | ||||
|   curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h		\ | ||||
|   curl_ntlm_msgs.h curl_sasl.h curl_multibyte.h hostcheck.h bundles.h	\ | ||||
|   conncache.h curl_setup_once.h multihandle.h setup-vms.h pipeline.h	\ | ||||
|   dotdot.h x509asn1.h http2.h sigpipe.h $(VHEADERS) | ||||
|   | ||||
| @@ -285,7 +285,7 @@ $(libcurl_dll_LIBRARY): $(libcurl_a_OBJECTS) $(RESOURCE) $(libcurl_dll_DEPENDENC | ||||
| 	  $(libcurl_a_OBJECTS) $(RESOURCE) $(DLL_LIBS) | ||||
|  | ||||
| %.o: %.c $(PROOT)/include/curl/curlbuild.h | ||||
| 	$(CC) $(INCLUDES) $(CFLAGS) -c $< | ||||
| 	$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ | ||||
|  | ||||
| %.res: %.rc | ||||
| 	$(RC) $(RCFLAGS) $< -o $@ | ||||
|   | ||||
| @@ -315,10 +315,12 @@ endif | ||||
| # Makefile.inc provides the CSOURCES and HHEADERS defines | ||||
| include Makefile.inc | ||||
|  | ||||
| OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(OBJDIR)/nwos.o | ||||
| OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(notdir $(CSOURCES)))) $(OBJDIR)/nwos.o | ||||
|  | ||||
| OBJL	= $(OBJS) $(OBJDIR)/nwlib.o $(LDLIBS) | ||||
|  | ||||
| vpath %.c . vtls | ||||
|  | ||||
| all: lib nlm | ||||
|  | ||||
| nlm: prebuild $(TARGET).nlm | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1999 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1999 - 2014, 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 | ||||
| @@ -106,6 +106,7 @@ WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK" | ||||
| CCNODBG      = cl.exe /O2 /DNDEBUG | ||||
| CCDEBUG      = cl.exe /Od /Gm /Zi /D_DEBUG /GZ | ||||
| CFLAGSSSL    = /DUSE_SSLEAY /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl" | ||||
| CFLAGSWINSSL = /DUSE_SCHANNEL | ||||
| CFLAGSSSH2   = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include" | ||||
| CFLAGSZLIB   = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" | ||||
| CFLAGS       = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1 | ||||
| @@ -114,7 +115,7 @@ LNKDLL     = link.exe /DLL | ||||
| LNKLIB       = link.exe /lib | ||||
| LFLAGS       = /nologo /machine:$(MACHINE) | ||||
| SSLLIBS      = libeay32.lib ssleay32.lib | ||||
| ZLIBLIBSDLL= zdll.lib | ||||
| ZLIBLIBSDLL  = zdll.lib | ||||
| ZLIBLIBS     = zlib.lib | ||||
| WINLIBS      = ws2_32.lib wldap32.lib advapi32.lib | ||||
| CFLAGS       = $(CFLAGS) | ||||
| @@ -164,6 +165,18 @@ CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| ###################### | ||||
| # release-winssl | ||||
|  | ||||
| !IF "$(CFG)" == "release-winssl" | ||||
| TARGET   = $(LIBCURL_STA_LIB_REL) | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| ###################### | ||||
| # release-zlib | ||||
|  | ||||
| @@ -189,6 +202,18 @@ CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| ###################### | ||||
| # release-winssl-zlib | ||||
|  | ||||
| !IF "$(CFG)" == "release-winssl-zlib" | ||||
| TARGET   = $(LIBCURL_STA_LIB_REL) | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| ###################### | ||||
| # release-ssl-ssh2-zlib | ||||
|  | ||||
| @@ -515,7 +540,6 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\curl_ntlm_core.obj \ | ||||
| 	$(DIROBJ)\curl_ntlm_msgs.obj \ | ||||
| 	$(DIROBJ)\curl_ntlm_wb.obj \ | ||||
| 	$(DIROBJ)\curl_rand.obj \ | ||||
| 	$(DIROBJ)\curl_rtmp.obj \ | ||||
| 	$(DIROBJ)\curl_sasl.obj \ | ||||
| 	$(DIROBJ)\curl_schannel.obj \ | ||||
| @@ -523,6 +547,7 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\curl_threads.obj \ | ||||
| 	$(DIROBJ)\cyassl.obj \ | ||||
| 	$(DIROBJ)\dict.obj \ | ||||
| 	$(DIROBJ)\dotdot.obj \ | ||||
| 	$(DIROBJ)\easy.obj \ | ||||
| 	$(DIROBJ)\escape.obj \ | ||||
| 	$(DIROBJ)\file.obj \ | ||||
| @@ -553,7 +578,6 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\imap.obj \ | ||||
| 	$(DIROBJ)\inet_ntop.obj \ | ||||
| 	$(DIROBJ)\inet_pton.obj \ | ||||
| 	$(DIROBJ)\krb4.obj \ | ||||
| 	$(DIROBJ)\krb5.obj \ | ||||
| 	$(DIROBJ)\ldap.obj \ | ||||
| 	$(DIROBJ)\llist.obj \ | ||||
| @@ -589,8 +613,8 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\speedcheck.obj \ | ||||
| 	$(DIROBJ)\splay.obj \ | ||||
| 	$(DIROBJ)\ssh.obj \ | ||||
| 	$(DIROBJ)\sslgen.obj \ | ||||
| 	$(DIROBJ)\ssluse.obj \ | ||||
| 	$(DIROBJ)\vtls.obj \ | ||||
| 	$(DIROBJ)\openssl.obj \ | ||||
| 	$(DIROBJ)\strdup.obj \ | ||||
| 	$(DIROBJ)\strequal.obj \ | ||||
| 	$(DIROBJ)\strerror.obj \ | ||||
| @@ -629,6 +653,9 @@ $(DIROBJ): | ||||
| {.\}.c{$(DIROBJ)\}.obj: | ||||
| 	$(CC) $(CFLAGS) /Fo"$@"  $< | ||||
|  | ||||
| {.\vtls\}.c{$(DIROBJ)\}.obj: | ||||
| 	$(CC) $(CFLAGS) /Fo"$@"  $< | ||||
|  | ||||
| debug-dll\libcurl.res \ | ||||
| debug-dll-ssl-dll\libcurl.res \ | ||||
| debug-dll-zlib-dll\libcurl.res \ | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user