Compare commits
	
		
			1024 Commits
		
	
	
		
			curl-7_33_
			...
			curl-7_37_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 3fed9acaef | ||
|   | ae931b9998 | ||
|   | 85f4075bdb | ||
|   | 99114faf82 | ||
|   | 316f79cef2 | ||
|   | 274f932311 | ||
|   | 0c467c9cc7 | ||
|   | f5e73640f0 | ||
|   | 905b63e433 | ||
|   | 9f170ed091 | ||
|   | 6f6646d6e9 | ||
|   | 29d790fe60 | ||
|   | f01e7e08d8 | ||
|   | 71ea31ae74 | ||
|   | 313b274b9d | ||
|   | 7c0e67c8c2 | ||
|   | 6cfeeb3bb0 | ||
|   | c346df065e | ||
|   | b93759291d | ||
|   | 8e6f42a7bd | ||
|   | c8224d7ede | ||
|   | b121de9d7f | ||
|   | 751971b2c3 | ||
|   | 831f6dd1d9 | ||
|   | 5a067c4b39 | ||
|   | 121bcfee5d | ||
|   | 21aae1ec86 | ||
|   | c9ea1d341a | ||
|   | 4550a00a3e | ||
|   | 077366d0c6 | ||
|   | 68f0166a92 | ||
|   | a481f5b308 | ||
|   | 53a5b95c21 | ||
|   | 84bd19ffd4 | ||
|   | 678239df54 | ||
|   | 69cdc95932 | ||
|   | 4167498f74 | ||
|   | 52d16c84d2 | ||
|   | b4c81b6cee | ||
|   | 63f7e64218 | ||
|   | 18e4cd1e20 | ||
|   | 8342b6e1dc | ||
|   | ba704878bd | ||
|   | fdb2d32144 | ||
|   | d041b8d33e | ||
|   | 0ab2c444b5 | ||
|   | 22ee67a1ca | ||
|   | 9e4f6c5809 | ||
|   | 5376ed2474 | ||
|   | 952b54095a | ||
|   | 5b8ae0a985 | ||
|   | 65bb4a0d38 | ||
|   | 4e0d1d60dc | ||
|   | ec5fde24de | ||
|   | 1343756742 | ||
|   | ec9fa4f6b3 | ||
|   | f0b2d27f7d | ||
|   | 94898303d2 | ||
|   | 1495f42138 | ||
|   | ba06278e97 | ||
|   | e48a821ed5 | ||
|   | 6404896d8c | ||
|   | fa083980c5 | ||
|   | 5f68fa4897 | ||
|   | 6f8085ca77 | ||
|   | 3b59753c11 | ||
|   | 3400148768 | ||
|   | 6a0b405177 | ||
|   | f07fa85bc7 | ||
|   | 34cdc77076 | ||
|   | 55a8d40fa0 | ||
|   | 5de8d84098 | ||
|   | 47d760714f | ||
|   | 5fe879555d | ||
|   | 9987106f53 | ||
|   | e673f55c45 | ||
|   | 40e6af893b | ||
|   | 37f484276d | ||
|   | 1f93471bda | ||
|   | 981bf6999d | ||
|   | a18a2ba0bb | ||
|   | 812da4190f | ||
|   | 312f36d453 | ||
|   | 4febbedc5a | ||
|   | 6ebc0d3bd8 | ||
|   | 21aafd09f6 | ||
|   | 45c037a127 | ||
|   | 947bb79c08 | ||
|   | 4b60db7e50 | ||
|   | 96876b371b | ||
|   | dce748d3f1 | ||
|   | 50b3111b63 | ||
|   | c303107345 | ||
|   | 3d77d013e1 | ||
|   | 637438f259 | ||
|   | 6cdd88f22c | ||
|   | 925c11b545 | ||
|   | c64370dccd | ||
|   | 9bd13a9d2e | ||
|   | 78ca3c6830 | ||
|   | a917f30c6b | ||
|   | ef1322df67 | ||
|   | 970ce28c12 | ||
|   | b8a220d255 | ||
|   | 2c239ba233 | ||
|   | eb4dd494a9 | ||
|   | 0d854de5f0 | ||
|   | c506e03f54 | ||
|   | d5ec44ca4c | ||
|   | 9c941e92c4 | ||
|   | 2e57c7e0fc | ||
|   | 710f14edba | ||
|   | cf9342e275 | ||
|   | 0204e17bc6 | ||
|   | f4ec8ffee2 | ||
|   | 386ed2d590 | ||
|   | 5b463e97fa | ||
|   | 8868a226cd | ||
|   | a43bba3a34 | ||
|   | c1d6158789 | ||
|   | 42c04eb1d1 | ||
|   | 6fd97fca88 | ||
|   | 6a03f6368f | ||
|   | a5d7ec1848 | ||
|   | 11ce2f2182 | ||
|   | 4b87029113 | ||
|   | 8ce852a279 | ||
|   | fe1c0176c1 | ||
|   | eb01947e1d | ||
|   | ee6791128f | ||
|   | 549b4a659a | ||
|   | 9146f37973 | ||
|   | 662fc62517 | ||
|   | f9ffbfce90 | ||
|   | aa0fbe3537 | ||
|   | c48b996cf2 | ||
|   | 89390f35f8 | ||
|   | da900ca970 | ||
|   | b0e742544b | ||
|   | 7296fc9e7e | ||
|   | 3f74e149f8 | ||
|   | 667d133dab | ||
|   | e81bdab13e | ||
|   | 54df616729 | ||
|   | 6f72c2fe31 | ||
|   | a703914e60 | ||
|   | 0115ec2f13 | ||
|   | 33e0cba8f1 | ||
|   | d7ed8da43e | ||
|   | e2c14bde22 | ||
|   | 0d4af92aeb | ||
|   | 4c8c3da6e2 | ||
|   | 84c0aabe65 | ||
|   | ca63d4feba | ||
|   | f804378d16 | ||
|   | 2c6b41e98a | ||
|   | 0160cb2e19 | ||
|   | cd1f746b86 | ||
|   | b166117c60 | ||
|   | 5a23aeb00d | ||
|   | fbaa2f8660 | ||
|   | 263ed02da6 | ||
|   | b2e9c17a19 | ||
|   | 78e3844a4a | ||
|   | b574e83079 | ||
|   | a700f9002c | ||
|   | 73b7a03c3f | ||
|   | 64381f5091 | ||
|   | 28d005cc9b | ||
|   | 5cdb61abb2 | ||
|   | 537b571c90 | ||
|   | fe15ea67cc | ||
|   | 2af28a147b | ||
|   | f700eb7d9a | ||
|   | 175b605331 | ||
|   | ee40136f6c | ||
|   | 19a514237d | ||
|   | 607883f13c | ||
|   | d4150c317c | ||
|   | 0bc14c9faf | ||
|   | 4991c13784 | ||
|   | c469941293 | ||
|   | ff853960bd | ||
|   | 2c49e96092 | ||
|   | 3a92de5636 | ||
|   | 45d3f00803 | ||
|   | 0b8977ac6f | ||
|   | 9e86209d04 | ||
|   | 11025613b9 | ||
|   | c877c50e13 | ||
|   | 109e94c51c | ||
|   | 74851340bd | ||
|   | d3d27551e7 | ||
|   | 20f61cd12c | ||
|   | 4946ea05e2 | ||
|   | fa0a5e6812 | ||
|   | ef6be35bae | ||
|   | ac887eedbc | ||
|   | 42937f87e6 | ||
|   | c81021f747 | ||
|   | 97f214d0c9 | ||
|   | c57166b575 | ||
|   | ff35e74bcd | ||
|   | d73d633885 | ||
|   | 1432b22e62 | ||
|   | dd9ce1b86c | ||
|   | b201d9adb8 | ||
|   | 8a0385c1ad | ||
|   | c524ca35f5 | ||
|   | dd07e79023 | ||
|   | 13682d1a24 | ||
|   | ed4972ffdb | ||
|   | 6448946ac3 | ||
|   | ef813c7097 | ||
|   | 9317eced98 | ||
|   | 0bc4938eec | ||
|   | 4043d7b67b | ||
|   | 7dd494c6e7 | ||
|   | fbb6e0478b | ||
|   | c1f7da1570 | ||
|   | acefed139f | ||
|   | 8fdb87d0df | ||
|   | c38b573ff5 | ||
|   | c09f6c72e9 | ||
|   | 7dbed6a2f5 | ||
|   | afbcfc4f46 | ||
|   | b3e55bf989 | ||
|   | 6876b35ad6 | ||
|   | 82bcc7c615 | ||
|   | dfa481a7c5 | ||
|   | 0c4589f0c0 | ||
|   | 54ef196db8 | ||
|   | 5b773658a8 | ||
|   | f559611aa1 | ||
|   | 713402982f | ||
|   | 2baf38f7c3 | ||
|   | 8293691b88 | ||
|   | fdb13d885a | ||
|   | 8541f2d39d | ||
|   | 3a29ee41ef | ||
|   | fe260b75e7 | ||
|   | 2dc63c72dc | ||
|   | a8c7cf6281 | ||
|   | 7cb763cf57 | ||
|   | f82e0edc17 | ||
|   | 38d582ff54 | ||
|   | 5a327f39d5 | ||
|   | 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 | 
							
								
								
									
										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) | ||||
|     set(HAVE_GETADDRINFO 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. | ||||
|  | ||||
|   | ||||
							
								
								
									
										408
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										408
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -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 | ||||
| @@ -30,28 +30,88 @@ CMake/CurlTests.c CMake/FindOpenSSL.cmake CMake/FindZLIB.cmake		\ | ||||
| CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake		\ | ||||
| CMake/Utilities.cmake include/curl/curlbuild.h.cmake | ||||
|  | ||||
| VC6LIBDSP = vs/vc6/lib/vc6libcurl.dsp | ||||
| VC6LIBDSPHEAD = vs/t/lib/vc6_libcurl_dsp.head | ||||
| VC6LIBDSPFOOT = vs/t/lib/vc6_libcurl_dsp.foot | ||||
| VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl | ||||
| VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp | ||||
| VC6_LIBDSP_DEPS = $(VC6_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC6_SRCTMPL = projects/Windows/VC6/src/curlsrc.tmpl | ||||
| VC6_SRCDSP = projects/Windows/VC6/src/curlsrc.dsp | ||||
| VC6_SRCDSP_DEPS = $(VC6_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC8LIBPRJ = vs/vc8/lib/vc8libcurl.vcproj | ||||
| VC8LIBPRJHEAD = vs/t/lib/vc8_libcurl_prj.head | ||||
| VC8LIBPRJFOOT = vs/t/lib/vc8_libcurl_prj.foot | ||||
| VC7_LIBTMPL = projects/Windows/VC7/lib/libcurl.tmpl | ||||
| VC7_LIBVCPROJ = projects/Windows/VC7/lib/libcurl.vcproj | ||||
| VC7_LIBVCPROJ_DEPS = $(VC7_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC7_SRCTMPL = projects/Windows/VC7/src/curlsrc.tmpl | ||||
| VC7_SRCVCPROJ = projects/Windows/VC7/src/curlsrc.vcproj | ||||
| VC7_SRCVCPROJ_DEPS = $(VC7_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC_DIST = \ | ||||
|  vs/t/README \ | ||||
|  $(VC6LIBDSP) $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \ | ||||
|  $(VC8LIBPRJ) $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \ | ||||
|  vs/vc6/vc6curl.dsw \ | ||||
|  vs/vc6/lib/vc6libcurl.dsw \ | ||||
|  vs/vc6/src/vc6curltool.dsw \ | ||||
|  vs/vc6/src/vc6curltool.dsp | ||||
| VC71_LIBTMPL = projects/Windows/VC7.1/lib/libcurl.tmpl | ||||
| VC71_LIBVCPROJ = projects/Windows/VC7.1/lib/libcurl.vcproj | ||||
| VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC71_SRCTMPL = projects/Windows/VC7.1/src/curlsrc.tmpl | ||||
| VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curlsrc.vcproj | ||||
| VC71_SRCVCPROJ_DEPS = $(VC71_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC6LIBDSP_DEPS = $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \ | ||||
|  Makefile.am lib/Makefile.inc | ||||
| VC8_LIBTMPL = projects/Windows/VC8/lib/libcurl.tmpl | ||||
| VC8_LIBVCPROJ = projects/Windows/VC8/lib/libcurl.vcproj | ||||
| VC8_LIBVCPROJ_DEPS = $(VC8_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC8_SRCTMPL = projects/Windows/VC8/src/curlsrc.tmpl | ||||
| VC8_SRCVCPROJ = projects/Windows/VC8/src/curlsrc.vcproj | ||||
| VC8_SRCVCPROJ_DEPS = $(VC8_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC8LIBPRJ_DEPS = $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \ | ||||
|  Makefile.am lib/Makefile.inc | ||||
| VC9_LIBTMPL = projects/Windows/VC9/lib/libcurl.tmpl | ||||
| VC9_LIBVCPROJ = projects/Windows/VC9/lib/libcurl.vcproj | ||||
| VC9_LIBVCPROJ_DEPS = $(VC9_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC9_SRCTMPL = projects/Windows/VC9/src/curlsrc.tmpl | ||||
| VC9_SRCVCPROJ = projects/Windows/VC9/src/curlsrc.vcproj | ||||
| VC9_SRCVCPROJ_DEPS = $(VC9_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC10_LIBTMPL = projects/Windows/VC10/lib/libcurl.tmpl | ||||
| VC10_LIBVCXPROJ = projects/Windows/VC10/lib/libcurl.vcxproj | ||||
| VC10_LIBVCXPROJ_DEPS = $(VC10_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC10_SRCTMPL = projects/Windows/VC10/src/curlsrc.tmpl | ||||
| VC10_SRCVCXPROJ = projects/Windows/VC10/src/curlsrc.vcxproj | ||||
| VC10_SRCVCXPROJ_DEPS = $(VC10_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC11_LIBTMPL = projects/Windows/VC11/lib/libcurl.tmpl | ||||
| VC11_LIBVCXPROJ = projects/Windows/VC11/lib/libcurl.vcxproj | ||||
| VC11_LIBVCXPROJ_DEPS = $(VC11_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC11_SRCTMPL = projects/Windows/VC11/src/curlsrc.tmpl | ||||
| VC11_SRCVCXPROJ = projects/Windows/VC11/src/curlsrc.vcxproj | ||||
| VC11_SRCVCXPROJ_DEPS = $(VC11_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC12_LIBTMPL = projects/Windows/VC12/lib/libcurl.tmpl | ||||
| VC12_LIBVCXPROJ = projects/Windows/VC12/lib/libcurl.vcxproj | ||||
| VC12_LIBVCXPROJ_DEPS = $(VC12_LIBTMPL) Makefile.am lib/Makefile.inc | ||||
| VC12_SRCTMPL = projects/Windows/VC12/src/curlsrc.tmpl | ||||
| VC12_SRCVCXPROJ = projects/Windows/VC12/src/curlsrc.vcxproj | ||||
| VC12_SRCVCXPROJ_DEPS = $(VC12_SRCTMPL) Makefile.am src/Makefile.inc | ||||
|  | ||||
| VC_DIST = projects/README	\ | ||||
|  projects/build-openssl.bat	\ | ||||
|  projects/Windows/VC6/curl.dsw	\ | ||||
|  projects/Windows/VC6/lib/libcurl.dsw $(VC6_LIBDSP)	\ | ||||
|  projects/Windows/VC6/src/curlsrc.dsw $(VC6_SRCDSP)	\ | ||||
|  projects/Windows/VC7/curl.sln	\ | ||||
|  projects/Windows/VC7/lib/libcurl.sln $(VC7_LIBVCPROJ)	\ | ||||
|  projects/Windows/VC7/src/curlsrc.sln $(VC7_SRCVCPROJ)	\ | ||||
|  projects/Windows/VC7.1/curl.sln	\ | ||||
|  projects/Windows/VC7.1/lib/libcurl.sln $(VC71_LIBVCPROJ)	\ | ||||
|  projects/Windows/VC7.1/src/curlsrc.sln $(VC71_SRCVCPROJ)	\ | ||||
|  projects/Windows/VC8/curl.sln	\ | ||||
|  projects/Windows/VC8/lib/libcurl.sln $(VC8_LIBVCPROJ)	\ | ||||
|  projects/Windows/VC8/src/curlsrc.sln $(VC8_SRCVCPROJ)	\ | ||||
|  projects/Windows/VC9/curl.sln	\ | ||||
|  projects/Windows/VC9/lib/libcurl.sln $(VC9_LIBVCPROJ)	\ | ||||
|  projects/Windows/VC9/src/curlsrc.sln $(VC9_SRCVCPROJ)	\ | ||||
|  projects/Windows/VC10/curl.sln	\ | ||||
|  projects/Windows/VC10/lib/libcurl.sln $(VC10_LIBVCXPROJ)	\ | ||||
|  projects/Windows/VC10/src/curlsrc.sln $(VC10_SRCVCXPROJ)	\ | ||||
|  projects/Windows/VC11/curl.sln	\ | ||||
|  projects/Windows/VC11/lib/libcurl.sln $(VC11_LIBVCXPROJ)	\ | ||||
|  projects/Windows/VC11/src/curlsrc.sln $(VC11_SRCVCXPROJ)	\ | ||||
|  projects/Windows/VC12/curl.sln	\ | ||||
|  projects/Windows/VC12/lib/libcurl.sln $(VC12_LIBVCXPROJ)	\ | ||||
|  projects/Windows/VC12/src/curlsrc.sln $(VC12_SRCVCXPROJ) | ||||
|  | ||||
| WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat	\ | ||||
|  winbuild/MakefileBuild.vc winbuild/Makefile.vc				\ | ||||
| @@ -61,7 +121,10 @@ EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in	\ | ||||
|  RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework	\ | ||||
|  $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in | ||||
|  | ||||
| CLEANFILES = $(VC6LIBDSP) $(VC8LIBPRJ) | ||||
| CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ)	\ | ||||
|  $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ)	\ | ||||
|  $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ)	\ | ||||
|  $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) | ||||
|  | ||||
| bin_SCRIPTS = curl-config | ||||
|  | ||||
| @@ -71,11 +134,9 @@ DIST_SUBDIRS = $(SUBDIRS) tests packages docs | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = libcurl.pc | ||||
|  | ||||
| # List of libcurl source files required to generate VC IDE dsp and prj files | ||||
| # List of files required to generate VC IDE .dsp, .vcproj and .vcxproj files | ||||
| include lib/Makefile.inc | ||||
|  | ||||
| WIN32SOURCES = $(CSOURCES) | ||||
| WIN32HEADERS = $(HHEADERS) config-win32.h | ||||
| include src/Makefile.inc | ||||
|  | ||||
| dist-hook: | ||||
| 	rm -rf $(top_builddir)/tests/log | ||||
| @@ -187,96 +248,249 @@ uninstall-hook: | ||||
| 	cd docs && $(MAKE) uninstall | ||||
|  | ||||
| ca-bundle: lib/mk-ca-bundle.pl | ||||
| 	@echo "generate a fresh ca-bundle.crt" | ||||
| 	@echo "generating a fresh ca-bundle.crt" | ||||
| 	@perl $< -b -l -u lib/ca-bundle.crt | ||||
|  | ||||
| ca-firefox: lib/firefox-db2pem.sh | ||||
| 	@echo "generate a fresh ca-bundle.crt" | ||||
| 	@echo "generating a fresh ca-bundle.crt" | ||||
| 	./lib/firefox-db2pem.sh lib/ca-bundle.crt | ||||
|  | ||||
| checksrc: | ||||
| 	cd lib && $(MAKE) checksrc | ||||
| 	cd src && $(MAKE) checksrc | ||||
|  | ||||
| .PHONY: vc6-ide | ||||
| .PHONY: vc-ide | ||||
|  | ||||
| vc6-ide: | ||||
| 	$(MAKE) $(VC6LIBDSP) | ||||
|  | ||||
| $(VC6LIBDSP): $(VC6LIBDSP_DEPS) | ||||
| 	@(echo "generating '$(VC6LIBDSP)'"; \ | ||||
| vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS)	\ | ||||
|  $(VC7_SRCVCPROJ_DEPS) $(VC71_LIBVCPROJ_DEPS) $(VC71_SRCVCPROJ_DEPS)	\ | ||||
|  $(VC8_LIBVCPROJ_DEPS) $(VC8_SRCVCPROJ_DEPS) $(VC9_LIBVCPROJ_DEPS)	\ | ||||
|  $(VC9_SRCVCPROJ_DEPS) $(VC10_LIBVCXPROJ_DEPS) $(VC10_SRCVCXPROJ_DEPS)	\ | ||||
|  $(VC11_LIBVCXPROJ_DEPS) $(VC11_SRCVCXPROJ_DEPS) $(VC12_LIBVCXPROJ_DEPS)	\ | ||||
|  $(VC12_SRCVCXPROJ_DEPS) | ||||
| 	@(win32_lib_srcs='$(LIB_CFILES)'; \ | ||||
| 	win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \ | ||||
| 	win32_lib_rc='$(LIB_RCFILES)'; \ | ||||
| 	win32_lib_vtls_srcs='$(LIB_VTLS_CFILES)'; \ | ||||
| 	win32_lib_vtls_hdrs='$(LIB_VTLS_HFILES)'; \ | ||||
| 	win32_src_srcs='$(CURL_CFILES)'; \ | ||||
| 	win32_src_hdrs='$(CURL_HFILES)'; \ | ||||
| 	win32_src_rc='$(CURL_RCFILES)'; \ | ||||
| 	\ | ||||
| 	for dir in 'vs' 'vs/vc6' 'vs/vc6/lib'; do \ | ||||
| 	  test -d "$$dir" || mkdir "$$dir" || exit 1; \ | ||||
| 	done; \ | ||||
| 	sorted_lib_srcs=`for file in $$win32_lib_srcs; do echo $$file; done | sort`; \ | ||||
| 	sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done | sort`; \ | ||||
| 	sorted_lib_vtls_srcs=`for file in $$win32_lib_vtls_srcs; do echo $$file; done | sort`; \ | ||||
| 	sorted_lib_vtls_hdrs=`for file in $$win32_lib_vtls_hdrs; do echo $$file; done | sort`; \ | ||||
| 	sorted_src_srcs=`for file in $$win32_src_srcs; do echo $$file; done | sort`; \ | ||||
| 	sorted_src_hdrs=`for file in $$win32_src_hdrs; do echo $$file; done | sort`; \ | ||||
| 	\ | ||||
| 	dir='..\..\..\lib\'; \ | ||||
| 	body='$(VC6LIBDSP)'.body; \ | ||||
| 	win32_srcs='$(WIN32SOURCES)'; \ | ||||
| 	win32_hdrs='$(WIN32HEADERS)'; \ | ||||
| 	sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \ | ||||
| 	sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \ | ||||
| 	awk_code='\ | ||||
| function gen_element(type, dir, file)\ | ||||
| {\ | ||||
|   sub(/vtls\//, "", file);\ | ||||
| \ | ||||
|   spaces="    ";\ | ||||
|   if(dir == "lib\\vtls")\ | ||||
|     tabs="				";\ | ||||
|   else\ | ||||
|     tabs="			";\ | ||||
| \ | ||||
|   if(type == "dsp") {\ | ||||
|     printf("# Begin Source File\r\n");\ | ||||
|     printf("\r\n");\ | ||||
|     printf("SOURCE=..\\..\\..\\..\\%s\\%s\r\n", dir, file);\ | ||||
|     printf("# End Source File\r\n");\ | ||||
|   }\ | ||||
|   else if(type == "vcproj1") {\ | ||||
|     printf("%s<File\r\n", tabs);\ | ||||
|     printf("%s	RelativePath=\"..\\..\\..\\..\\%s\\%s\">\r\n",\ | ||||
|            tabs, dir, file);\ | ||||
|     printf("%s</File>\r\n", tabs);\ | ||||
|   }\ | ||||
|   else if(type == "vcproj2") {\ | ||||
|     printf("%s<File\r\n", tabs);\ | ||||
|     printf("%s	RelativePath=\"..\\..\\..\\..\\%s\\%s\"\r\n",\ | ||||
|            tabs, dir, file);\ | ||||
|     printf("%s>\r\n", tabs);\ | ||||
|     printf("%s</File>\r\n", tabs);\ | ||||
|   }\ | ||||
|   else if(type == "vcxproj") {\ | ||||
|     i = index(file, ".");\ | ||||
|     ext = substr(file, i == 0 ? 0 : i + 1);\ | ||||
| \ | ||||
|     if(ext == "c")\ | ||||
|       printf("%s<ClCompile Include=\"..\\..\\..\\..\\%s\\%s\" />\r\n",\ | ||||
|              spaces, dir, file);\ | ||||
|     else if(ext == "h")\ | ||||
|       printf("%s<ClInclude Include=\"..\\..\\..\\..\\%s\\%s\" />\r\n",\ | ||||
|              spaces, dir, file);\ | ||||
|     else if(ext == "rc")\ | ||||
|       printf("%s<ResourceCompile Include=\"..\\..\\..\\..\\%s\\%s\" />\r\n",\ | ||||
|       spaces, dir, file);\ | ||||
|   }\ | ||||
| }\ | ||||
| \ | ||||
| {\ | ||||
| \ | ||||
|   if($$0 == "CURL_LIB_C_FILES") {\ | ||||
|     split(lib_srcs, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "lib", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_LIB_H_FILES") {\ | ||||
|     split(lib_hdrs, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "lib", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_LIB_RC_FILES") {\ | ||||
|     split(lib_rc, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "lib", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_LIB_VTLS_C_FILES") {\ | ||||
|     split(lib_vtls_srcs, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_LIB_VTLS_H_FILES") {\ | ||||
|     split(lib_vtls_hdrs, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_SRC_C_FILES") {\ | ||||
|     split(src_srcs, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "src", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_SRC_H_FILES") {\ | ||||
|     split(src_hdrs, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "src", arr[val]);\ | ||||
|   }\ | ||||
|   else if($$0 == "CURL_SRC_RC_FILES") {\ | ||||
|     split(src_rc, arr);\ | ||||
|     for(val in arr) gen_element(proj_type, "src", arr[val]);\ | ||||
|   }\ | ||||
|   else\ | ||||
|     printf("%s\r\n", $$0);\ | ||||
| }';\ | ||||
| 	\ | ||||
| 	echo "# Begin Group \"Source Files\""  > $$body; \ | ||||
| 	echo ""                               >> $$body; \ | ||||
| 	echo "# PROP Default_Filter \"\""     >> $$body; \ | ||||
| 	for file in $$sorted_srcs; do \ | ||||
| 	  echo "# Begin Source File"          >> $$body; \ | ||||
| 	  echo ""                             >> $$body; \ | ||||
| 	  echo "SOURCE="$$dir$$file           >> $$body; \ | ||||
| 	  echo "# End Source File"            >> $$body; \ | ||||
| 	done; \ | ||||
| 	echo "# End Group"                    >> $$body; \ | ||||
| 	echo "# Begin Group \"Header Files\"" >> $$body; \ | ||||
| 	echo ""                               >> $$body; \ | ||||
| 	echo "# PROP Default_Filter \"\""     >> $$body; \ | ||||
| 	for file in $$sorted_hdrs; do \ | ||||
| 	  echo "# Begin Source File"          >> $$body; \ | ||||
| 	  echo ""                             >> $$body; \ | ||||
| 	  echo "SOURCE="$$dir$$file           >> $$body; \ | ||||
| 	  echo "# End Source File"            >> $$body; \ | ||||
| 	done; \ | ||||
| 	echo "# End Group"                    >> $$body; \ | ||||
| 	echo "generating '$(VC6_LIBDSP)'"; \ | ||||
| 	awk -v proj_type=dsp \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	awk '{ printf("%s\r\n", $$0); }' \ | ||||
| 	  $(srcdir)/$(VC6LIBDSPHEAD) $$body $(srcdir)/$(VC6LIBDSPFOOT) \ | ||||
| 	  > $(VC6LIBDSP) || { rm -f $$body; exit 1; }; \ | ||||
| 	echo "generating '$(VC6_SRCDSP)'"; \ | ||||
| 	awk -v proj_type=dsp \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC6_SRCTMPL) > $(VC6_SRCDSP) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	rm -f $$body) | ||||
|  | ||||
| .PHONY: vc8-ide | ||||
|  | ||||
| vc8-ide: | ||||
| 	$(MAKE) $(VC8LIBPRJ) | ||||
|  | ||||
| $(VC8LIBPRJ): $(VC8LIBPRJ_DEPS) | ||||
| 	@(echo "generating '$(VC8LIBPRJ)'"; \ | ||||
| 	echo "generating '$(VC7_LIBVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj1 \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	for dir in 'vs' 'vs/vc8' 'vs/vc8/lib'; do \ | ||||
| 	  test -d "$$dir" || mkdir "$$dir" || exit 1; \ | ||||
| 	done; \ | ||||
| 	echo "generating '$(VC7_SRCVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj1 \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC7_SRCTMPL) > $(VC7_SRCVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	dir='..\..\..\lib\'; \ | ||||
| 	body='$(VC8LIBPRJ)'.body; \ | ||||
| 	win32_srcs='$(WIN32SOURCES)'; \ | ||||
| 	win32_hdrs='$(WIN32HEADERS)'; \ | ||||
| 	sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \ | ||||
| 	sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \ | ||||
| 	echo "generating '$(VC71_LIBVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj1 \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "%tab%%tab%<Filter Name=\"Source Files\">"  > $$body; \ | ||||
| 	for file in $$sorted_srcs; do \ | ||||
| 	  echo "%tab%%tab%%tab%<File RelativePath=\""$$dir$$file"\"></File>" >> $$body; \ | ||||
| 	done; \ | ||||
| 	echo "%tab%%tab%</Filter>"                      >> $$body; \ | ||||
| 	echo "%tab%%tab%<Filter Name=\"Header Files\">" >> $$body; \ | ||||
| 	for file in $$sorted_hdrs; do \ | ||||
| 	  echo "%tab%%tab%%tab%<File RelativePath=\""$$dir$$file"\"></File>" >> $$body; \ | ||||
| 	done; \ | ||||
| 	echo "%tab%%tab%</Filter>"                      >> $$body; \ | ||||
| 	echo "generating '$(VC71_SRCVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj1 \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC71_SRCTMPL) > $(VC71_SRCVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	awk '{ gsub(/%tab%/, "\t"); printf("%s\r\n", $$0); }' \ | ||||
| 	  $(srcdir)/$(VC8LIBPRJHEAD) $$body $(srcdir)/$(VC8LIBPRJFOOT) \ | ||||
| 	  > $(VC8LIBPRJ) || { rm -f $$body; exit 1; }; \ | ||||
| 	echo "generating '$(VC8_LIBVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj2 \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	rm -f $$body) | ||||
|  | ||||
| 	echo "generating '$(VC8_SRCVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj2 \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC8_SRCTMPL) > $(VC8_SRCVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC9_LIBVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj2 \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC9_LIBTMPL) > $(VC9_LIBVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC9_SRCVCPROJ)'"; \ | ||||
| 	awk -v proj_type=vcproj2 \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC9_SRCTMPL) > $(VC9_SRCVCPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC10_LIBVCXPROJ)'"; \ | ||||
| 	awk -v proj_type=vcxproj \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC10_LIBTMPL) > $(VC10_LIBVCXPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC10_SRCVCXPROJ)'"; \ | ||||
| 	awk -v proj_type=vcxproj \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC10_SRCTMPL) > $(VC10_SRCVCXPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC11_LIBVCXPROJ)'"; \ | ||||
| 	awk -v proj_type=vcxproj \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC11_LIBTMPL) > $(VC11_LIBVCXPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC11_SRCVCXPROJ)'"; \ | ||||
| 	awk -v proj_type=vcxproj \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC11_SRCTMPL) > $(VC11_SRCVCXPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC12_LIBVCXPROJ)'"; \ | ||||
| 	awk -v proj_type=vcxproj \ | ||||
| 		-v lib_srcs="$$sorted_lib_srcs" \ | ||||
| 		-v lib_hdrs="$$sorted_lib_hdrs" \ | ||||
| 		-v lib_rc="$$win32_lib_rc" \ | ||||
| 		-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ | ||||
| 		-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) || { exit 1; }; \ | ||||
| 	\ | ||||
| 	echo "generating '$(VC12_SRCVCXPROJ)'"; \ | ||||
| 	awk -v proj_type=vcxproj \ | ||||
| 		-v src_srcs="$$sorted_src_srcs" \ | ||||
| 		-v src_hdrs="$$sorted_src_hdrs" \ | ||||
| 		-v src_rc="$$win32_src_rc" \ | ||||
| 		"$$awk_code" $(srcdir)/$(VC12_SRCTMPL) > $(VC12_SRCVCXPROJ) || { exit 1; };) | ||||
|   | ||||
| @@ -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,12 +136,36 @@ 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 | ||||
| @@ -266,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 | ||||
| @@ -298,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 | ||||
|   | ||||
							
								
								
									
										197
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							
							
						
						
									
										197
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							| @@ -1,68 +1,87 @@ | ||||
| Curl and libcurl 7.33.0 | ||||
| Curl and libcurl 7.37.0 | ||||
|  | ||||
|  Public curl releases:         135 | ||||
|  Public curl releases:         139 | ||||
|  Command line options:         161 | ||||
|  curl_easy_setopt() options:   205 | ||||
|  curl_easy_setopt() options:   206 | ||||
|  Public functions in libcurl:  58 | ||||
|  Known libcurl bindings:       42 | ||||
|  Contributors:                 1057 | ||||
|  Contributors:                 1137 | ||||
|  | ||||
| This release includes the following changes: | ||||
|  | ||||
|  o test code for testing the event based API [3] | ||||
|  o CURLM_ADDED_ALREADY: new error code | ||||
|  o test TFTP server: support "writedelay" within <servercmd> | ||||
|  o krb4 support has been removed | ||||
|  o imap/pop3/smtp: added basic SASL XOAUTH2 support [9] | ||||
|  o darwinssl: add support for PKCS#12 files for client authentication | ||||
|  o darwinssl: enable BEAST workaround on iOS 7 & later | ||||
|  o Pass password to OpenSSL engine by user interface [15] | ||||
|  o c-ares: Add support for various DNS binding options | ||||
|  o cookies: add expiration | ||||
|  o curl: added --oauth2-bearer option | ||||
|  o URL parser: IPv6 zone identifiers are now supported | ||||
|  o CURLOPT_PROXYHEADER: set headers for proxy-only | ||||
|  o CURLOPT_HEADEROPT: added | ||||
|  o curl: add --proxy-header | ||||
|  o sasl: Added support for DIGEST-MD5 via Windows SSPI | ||||
|  o sasl: Added DIGEST-MD5 qop-option validation in native challange handling | ||||
|  o imap: Expanded mailbox SEARCH support to use URL query strings [7] | ||||
|  o imap: Extended FETCH support to include PARTIAL URL specifier [7] | ||||
|  o nss: implement non-blocking SSL handshake | ||||
|  o build: Reworked Visual Studio project files | ||||
|  o poll: enable poll on darwin13 | ||||
|  o mk-ca-bundle: added -p | ||||
|  o libtests: add a wait_ms() function | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o nss: make sure that NSS is initialized | ||||
|  o curl: make --no-[option] work properly for several options | ||||
|  o FTP: with socket_action send better socket updates in active mode [1] | ||||
|  o curl: fix the --sasl-ir in the --help output | ||||
|  o tests 2032, 2033: Don't hardcode port in expected output | ||||
|  o urlglob: better detect unclosed braces, empty lists and overflows [7] | ||||
|  o urlglob: error out on range overflow [8] | ||||
|  o imap: Fixed response check for SEARCH, EXPUNGE, LSUB, UID and NOOP commands [10] | ||||
|  o handle arbitrary-length username and password [2] | ||||
|  o TFTP: make the CURLOPT_LOW_SPEED* options work [4] | ||||
|  o curl.h: name space pollution by "enum type" [5] | ||||
|  o multi: move on from STATE_DONE faster [6] | ||||
|  o FTP: 60 secs delay if aborted in the CURLOPT_HEADERFUNCTION callback [11] | ||||
|  o multi_socket: improved 100-continue timeout handling | ||||
|  o curl_multi_remove_handle: allow multiple removes | ||||
|  o FTP: fix getsock during DO_MORE state [12] | ||||
|  o -x: rephrased the --proxy section somewhat | ||||
|  o acinclude: fix --without-ca-path when cross-compiling [13] | ||||
|  o LDAP: fix bad free() when URL parsing failed [14] | ||||
|  o --data: mention CRLF treatment when reading from file | ||||
|  o curl_easy_pause: suggest one way to unpause | ||||
|  o imap: Fixed calculation of transfer when partial FETCH received [16] | ||||
|  o pingpong: Check SSL library buffers for already read data [16] | ||||
|  o imap/pop3/smtp: Speed up SSL connection initialization | ||||
|  o libcurl.3: for multi interface connections are held in the multi handle | ||||
|  o curl_easy_setopt.3: mention RTMP URL quirks [17] | ||||
|  o curl.1: detail how short/long options work [18] | ||||
|  o curl.1: Added information about optional login options to --user option | ||||
|  o curl: Added clarification to the --mail options in the --help output | ||||
|  o curl_easy_setopt.3: clarify that TIMEOUT and TIMEOUT_MS set the same value | ||||
|  o openssl: use correct port number in error message [19] | ||||
|  o darwinssl: block TLS_RSA_WITH_NULL_SHA256 cipher | ||||
|  o OpenSSL: acknowledge CURLOPT_SSL_VERIFYHOST without VERIFYPEER | ||||
|  o xattr: add support for FreeBSD xattr API | ||||
|  o win32: fix Visual Studio 2010 build with WINVER >= 0x600 [22] | ||||
|  o configure: use icc options without space [21] | ||||
|  o test1112: Increase the timeout from 7s to 16s [20] | ||||
|  o SCP: upload speed on a fast connection limited to 16384 B/s | ||||
|  o curl_setup_once: fix errno access for lwip on Windows [24] | ||||
|  o HTTP: Output http response 304 when modified time is too old [23] | ||||
|  o mkhelp: generate code for --disable-manual as well [1] | ||||
|  o hostcheck: added a system include to define struct in_addr | ||||
|  o winbuild: added warnless.c to fix build | ||||
|  o Makefile.vc6: added warnless.c to fix build | ||||
|  o smtp: Fixed login denied when server doesn't support AUTH capability [2] | ||||
|  o smtp: Fixed login denied with a RFC-821 based server [2] | ||||
|  o curl: stop interpreting IPv6 literals as glob patterns | ||||
|  o http2: remove _DRAFT09 from the NPN_HTTP2 enum | ||||
|  o http2: let openssl mention the exact protocol negotiated | ||||
|  o http2+openssl: fix compiler warnings in ALPN using code | ||||
|  o ftp: in passive data connect wait for happy eyeballs sockets [3] | ||||
|  o HTTP: don't send Content-Length: 0 _and_ Expect: 100-continue [4] | ||||
|  o http2: Compile with current nghttp2, which supports h2-11 [5] | ||||
|  o http_negotiate_sspi: Fixed compilation when USE_HTTP_NEGOTIATE not defined | ||||
|  o strerror: fix comment about vxworks' strerror_r buffer size [6] | ||||
|  o url: only use if_nametoindex() if IFNAMSIZ is available | ||||
|  o imap: Fixed untagged response detection when no data after command | ||||
|  o various: fix possible dereference of null pointer | ||||
|  o various: fix use of uninitialized variable | ||||
|  o various: fix use of non-null terminated strings | ||||
|  o telnet.c: check sscanf results before passing them to snprintf | ||||
|  o parsedate.c: check sscanf result before passing it to strlen | ||||
|  o sockfilt.c: free memory in case of memory allocation errors | ||||
|  o sockfilt.c: ignore non-key-events and continue waiting for input | ||||
|  o sockfilt.c: properly handle disk files, pipes and character input | ||||
|  o sockfilt.c: fixed getting stuck waiting for MinGW stdin pipe | ||||
|  o sockfilt.c: clean up threaded approach and add documentation | ||||
|  o configure: use the nghttp2 path correctly with pkg-config [8] | ||||
|  o curl_global_init_mem: bump initialized even if already initialized [9] | ||||
|  o gtls: fix NULL pointer dereference [10] | ||||
|  o cyassl: Use error-ssl.h when available | ||||
|  o handler: make 'protocol' always specified as a single bit [11] | ||||
|  o INFILESIZE: fields in UserDefined must not be changed run-time | ||||
|  o openssl: biomem->data is not zero terminated | ||||
|  o config-win32.h: Fixed HAVE_LONGLONG for Visual Studio .NET 2003 and up | ||||
|  o curl_ntlm_core: Fixed use of long long for VC6 and VC7 | ||||
|  o SNI: strip off a single trailing dot from host name [12] | ||||
|  o curl: bail on cookie use when built with disabled cookies | ||||
|  o curl_easy_setopt.3: added the proto for CURLOPT_SSH_KNOWNHOSTS | ||||
|  o curl_multi_cleanup: ignore SIGPIPE better [13] | ||||
|  o schannel: don't use the connect-timeout during send [14] | ||||
|  o mprintf: allow %.s with data not being zero terminated | ||||
|  o tool_help: Fixed missing --login-options option | ||||
|  o configure: Don't set LD_LIBRARY_PATH when cross-compiling | ||||
|  o http: auth failure on duplicated 'WWW-Authenticate: Negotiate' header [15] | ||||
|  o cacertinmem: fix memory leak [16] | ||||
|  o lib1506: make sure the transfers are not within the same ms [17] | ||||
|  o Makefile.b32: Fixed for vtls changes [18] | ||||
|  o sasl: Fixed missing qop in the client's challenge-response message | ||||
|  o openssl: unbreak PKCS12 support [19] | ||||
|  o darwinssl: fix potential crash with a P12 file [20] | ||||
|  o timers: fix timer regression involving redirects / reconnects [21] | ||||
|  o CURLINFO_SSL_VERIFYRESULT: made more reliable [22] | ||||
|  o HTTP: fixed connection re-use [23] | ||||
|  o configure: add SPNEGO to supported features [24] | ||||
|  o configure: add GSS-API to supported features [25] | ||||
|  o ALPN: fix typo in http/1.1 identifier | ||||
|  o http2: make connection re-use work [26] | ||||
|  | ||||
| This release includes the following known bugs: | ||||
|  | ||||
| @@ -71,41 +90,41 @@ This release includes the following known bugs: | ||||
| This release would not have looked like this without help, code, reports and | ||||
| advice from friends like these: | ||||
|  | ||||
|  Alex McLellan, Bill Doyle, Colby Ranger, Fabian Keil, Gisle Vanem, | ||||
|  John E. Malmberg, Jonathan Nieder, Kamil Dudka, Shawn Landden, | ||||
|  Tor Arntsen, Will Dietz, Yi Huang, Kyle L. Huff, Steve Holme, Mike Mio, | ||||
|  Stefan Neis, Nick Zitzmann, Geoff Beier, John Dunn, Jiri Hruska, | ||||
|  Tomas Mlcoch, Kim Vandry, Ben Greear, Gorilla Maguila, Jerry Krinock, | ||||
|  Yamada Yasuharu, Gordon Marler, Dave Thompson, D. Flinkmann, | ||||
|  Benoit Sigoure, Clemens Gruber, Guenter Knauf, Petr Pisar, Elmira A Semenova, | ||||
|  Francois Charlier, Ishan SinghLevett, Marcel Raad, Ulf Samuelsson, | ||||
|  Andrej E Baranov, Derek Higgins, Heinrich Schaefer | ||||
|   Aaro Koskinen, Cody Mack, Damian Dixon, Dan Fandrich, Daniel Johnson, | ||||
|   Daniel Stenberg, David Woodhouse, Dilyan Palauzov, Fabian Frank, | ||||
|   Ivo Bellin Salarin, Jeff King, Jeroen Koekkoek, Jon Torrey, Kamil Dudka, | ||||
|   Larry Lin, Leon Winter, Maciej Puzio, Marc Hoersken, Michael Osipov, | ||||
|   Nick Zitzmann, Patrick Watson, Paul Marks, Radu Simionescu, Remi Gacogne, | ||||
|   Ryan Braud, Steve Holme, Tatsuhiro Tsujikawa, Till Maas, Tom Sparrow, | ||||
|   Török Edwin, Vijay Panghal, | ||||
|  | ||||
|         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-08/0043.html | ||||
|  [2] = http://bugs.debian.org/719856 | ||||
|  [3] = http://daniel.haxx.se/blog/2013/08/20/testing-curl_multi_socket_action/ | ||||
|  [4] = http://curl.haxx.se/bug/view.cgi?id=1269 | ||||
|  [5] = https://github.com/bagder/curl/pull/76 | ||||
|  [6] = http://curl.haxx.se/mail/lib-2013-08/0211.html | ||||
|  [7] = http://curl.haxx.se/bug/view.cgi?id=1264 | ||||
|  [8] = http://curl.haxx.se/bug/view.cgi?id=1267 | ||||
|  [9] = http://curl.haxx.se/mail/lib-2013-08/0234.html | ||||
|  [10] = http://curl.haxx.se/mail/lib-2013-08/0136.html | ||||
|  [11] = https://bugzilla.redhat.com/1005686 | ||||
|  [12] = http://curl.haxx.se/mail/lib-2013-08/0109.html | ||||
|  [13] = http://curl.haxx.se/bug/view.cgi?id=1273 | ||||
|  [14] = http://curl.haxx.se/mail/lib-2013-08/0209.html | ||||
|  [15] = http://curl.haxx.se/mail/lib-2013-08/0265.html | ||||
|  [16] = http://curl.haxx.se/mail/lib-2013-08/0170.html | ||||
|  [17] = http://curl.haxx.se/bug/view.cgi?id=1278 | ||||
|  [18] = http://curl.haxx.se/bug/view.cgi?id=1279 | ||||
|  [19] = http://curl.haxx.se/bug/view.cgi?id=1281 | ||||
|  [20] = http://curl.haxx.se/mail/lib-2010-02/0200.html | ||||
|  [21] = http://curl.haxx.se/mail/lib-2013-09/0182.html | ||||
|  [22] = http://curl.haxx.se/bug/view.cgi?id=1282 | ||||
|  [23] = http://curl.haxx.se/bug/view.cgi?id=1288 | ||||
|  [24] = http://curl.haxx.se/mail/lib-2013-10/0048.html | ||||
|  [1] = http://curl.haxx.se/bug/view.cgi?id=1350 | ||||
|  [2] = http://curl.haxx.se/mail/lib-2014-03/0173.html | ||||
|  [3] = http://curl.haxx.se/mail/lib-2014-02/0135.html (ruined) | ||||
|  [4] = http://curl.haxx.se/bug/view.cgi?id=1349 | ||||
|  [5] = http://curl.haxx.se/mail/lib-2014-04/0053.html | ||||
|  [6] = http://curl.haxx.se/mail/lib-2014-04/0063.html | ||||
|  [7] = http://curl.haxx.se/mail/lib-2014-04/0067.html | ||||
|  [8] = http://curl.haxx.se/mail/lib-2014-04/0159.html | ||||
|  [9] = http://curl.haxx.se/bug/view.cgi?id=1362 | ||||
|  [10] = http://curl.haxx.se/mail/lib-2014-04/0145.html | ||||
|  [11] = https://github.com/bagder/curl/pull/97 | ||||
|  [12] = http://curl.haxx.se/mail/lib-2014-04/0161.html | ||||
|  [13] = http://thread.gmane.org/gmane.comp.version-control.git/238242 | ||||
|  [14] = http://curl.haxx.se/bug/view.cgi?id=1352 | ||||
|  [15] = https://bugzilla.redhat.com/1093348 | ||||
|  [16] = http://curl.haxx.se/bug/view.cgi?id=1368 | ||||
|  [17] = http://curl.haxx.se/mail/lib-2014-05/0081.html | ||||
|  [18] = http://curl.haxx.se/mail/lib-2014-05/0025.html | ||||
|  [19] = http://curl.haxx.se/bug/view.cgi?id=1371 | ||||
|  [20] = http://curl.haxx.se/bug/view.cgi?id=1369 | ||||
|  [21] = http://curl.haxx.se/mail/lib-2014-05/0147.html | ||||
|  [22] = http://curl.haxx.se/mail/lib-2014-04/0203.html | ||||
|  [23] = http://curl.haxx.se/mail/lib-2014-05/0127.html | ||||
|  [24] = http://curl.haxx.se/bug/view.cgi?id=1343 | ||||
|  [25] = http://curl.haxx.se/bug/view.cgi?id=1344 | ||||
|  [26] = http://curl.haxx.se/bug/view.cgi?id=1374 | ||||
|   | ||||
							
								
								
									
										126
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								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]) | ||||
|  | ||||
| @@ -1065,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) | ||||
| @@ -1172,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" | ||||
| @@ -1203,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) | ||||
|  | ||||
| @@ -1220,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 | ||||
|     ], | ||||
|     [ | ||||
| @@ -1241,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> | ||||
| @@ -1271,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 | ||||
|     ] | ||||
| @@ -1280,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)" | ||||
| @@ -1293,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 | ||||
| @@ -1309,7 +1316,14 @@ if test x"$want_gss" = xyes; then | ||||
|      esac | ||||
|   else | ||||
|      LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" | ||||
|      LIBS="-lgssapi $LIBS" | ||||
|      case $host in | ||||
|      *-hp-hpux*) | ||||
|         LIBS="-lgss $LIBS" | ||||
|         ;; | ||||
|      *) | ||||
|         LIBS="-lgssapi $LIBS" | ||||
|         ;; | ||||
|      esac | ||||
|   fi | ||||
| else | ||||
|   CPPFLAGS="$save_CPPFLAGS" | ||||
| @@ -1580,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 | ||||
| @@ -1983,6 +2000,12 @@ 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) | ||||
|  | ||||
|       dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h | ||||
|       AC_CHECK_HEADERS(cyassl/error-ssl.h) | ||||
|  | ||||
|       LIBS="-lcyassl -lm $LIBS" | ||||
|  | ||||
|       if test -n "$cyassllib"; then | ||||
| @@ -2067,8 +2090,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]) | ||||
| @@ -2084,14 +2107,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 | ||||
| @@ -2152,10 +2167,11 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then | ||||
|       USE_AXTLS="yes" | ||||
|       curl_ssl_msg="enabled (axTLS)" | ||||
|  | ||||
|  | ||||
|       LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS" | ||||
|       export LD_LIBRARY_PATH | ||||
|       AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH]) | ||||
|       if test "x$cross_compiling" != "xyes"; then | ||||
|         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS" | ||||
|         export LD_LIBRARY_PATH | ||||
|         AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH]) | ||||
|       fi | ||||
|       ],[ | ||||
|       LDFLAGS="$CLEANLDFLAGS" | ||||
|       CPPFLAGS="$CLEANCPPFLAGS" | ||||
| @@ -2457,19 +2473,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="" | ||||
| @@ -2687,7 +2703,7 @@ if test "$want_idn" = "yes"; then | ||||
|     if test "x$ac_cv_header_tld_h" = "xyes"; then | ||||
|       AC_SUBST([IDN_ENABLED], [1]) | ||||
|       curl_idn_msg="enabled" | ||||
|       if test -n "$IDN_DIR"; then | ||||
|       if test -n "$IDN_DIR" -a "x$cross_compiling" != "xyes"; then | ||||
|         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$IDN_DIR" | ||||
|         export LD_LIBRARY_PATH | ||||
|         AC_MSG_NOTICE([Added $IDN_DIR to LD_LIBRARY_PATH]) | ||||
| @@ -2725,13 +2741,12 @@ AC_HELP_STRING([--without-nghttp2],[Disable nghttp2 usage]), | ||||
| case "$OPT_H2" in | ||||
|   no) | ||||
|     dnl --without-nghttp2 option used | ||||
|     want_idn="no" | ||||
|     want_h2="no" | ||||
|     AC_MSG_RESULT([no]) | ||||
|     ;; | ||||
|   default) | ||||
|     dnl configure option not specified | ||||
|     want_h2="no" | ||||
|     want_h2_path="default" | ||||
|     AC_MSG_RESULT([no]) | ||||
|     ;; | ||||
|   yes) | ||||
| @@ -2743,31 +2758,30 @@ case "$OPT_H2" in | ||||
|   *) | ||||
|     dnl --with-nghttp2 option used with path | ||||
|     want_h2="yes" | ||||
|     want_h2_path="$withval" | ||||
|     want_h2_path="$withval/lib/pkgconfig" | ||||
|     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 | ||||
| if test X"$want_h2" != Xno; then | ||||
|   dnl backup the pre-nghttp2 variables | ||||
|   CLEANLDFLAGS="$LDFLAGS" | ||||
|   CLEANCPPFLAGS="$CPPFLAGS" | ||||
|   CLEANLIBS="$LIBS" | ||||
|  | ||||
|   h2pcdir=${want_h2_path}/lib/pkgconfig | ||||
|   CURL_CHECK_PKGCONFIG(libnghttp2, $h2pcdir) | ||||
|   CURL_CHECK_PKGCONFIG(libnghttp2, $want_h2_path) | ||||
|  | ||||
|   if test "$PKGCONFIG" != "no" ; then | ||||
|     LIB_H2=`CURL_EXPORT_PCDIR([$h2pcdir]) | ||||
|     LIB_H2=`CURL_EXPORT_PCDIR([$want_h2_path]) | ||||
|       $PKGCONFIG --libs-only-l libnghttp2` | ||||
|     AC_MSG_NOTICE([-l is $LIB_H2]) | ||||
|  | ||||
|     CPP_H2=`CURL_EXPORT_PCDIR([$h2pcdir]) dnl | ||||
|     CPP_H2=`CURL_EXPORT_PCDIR([$want_h2_path]) dnl | ||||
|       $PKGCONFIG --cflags-only-I libnghttp2` | ||||
|     AC_MSG_NOTICE([-I is $CPP_H2]) | ||||
|  | ||||
|     LD_H2=`CURL_EXPORT_PCDIR([$h2pcdir]) | ||||
|     LD_H2=`CURL_EXPORT_PCDIR([$want_h2_path]) | ||||
|       $PKGCONFIG --libs-only-L libnghttp2` | ||||
|     AC_MSG_NOTICE([-L is $LD_H2]) | ||||
|  | ||||
| @@ -3237,6 +3251,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) | ||||
|        ;; | ||||
| @@ -3370,7 +3385,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 | ||||
| @@ -3387,6 +3403,12 @@ fi | ||||
| if test "x$USE_NGHTTP2" = "x1"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2" | ||||
| fi | ||||
| if test "x$curl_spnego_msg" = "xenabled"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES SPNEGO" | ||||
| fi | ||||
| if test "x$want_gss" = "xyes"; then | ||||
|   SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API" | ||||
| fi | ||||
|  | ||||
| AC_SUBST(SUPPORT_FEATURES) | ||||
|  | ||||
| @@ -3533,7 +3555,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|   SSL support:      ${curl_ssl_msg} | ||||
|   SSH support:      ${curl_ssh_msg} | ||||
|   zlib support:     ${curl_zlib_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} | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 2013, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # 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 | ||||
| @@ -37,10 +37,29 @@ fi | ||||
| # 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 | ||||
| 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); | ||||
|  } | ||||
|  | ||||
| ' | ||||
|   | ||||
| @@ -278,6 +278,10 @@ | ||||
|       [full description, no wider than 72 columns that describe as much as | ||||
|       possible as to why this change is made, and possibly what things | ||||
|       it fixes and everything else that is related] | ||||
|  | ||||
|       [Bug: link to source of the report or more related discussion] | ||||
|       [Reported-by: John Doe - credit the reporter] | ||||
|       [whatever-else-by: credit all helpers, finders, doers] | ||||
|       ---- stop ---- | ||||
|  | ||||
|  Don't forget to use commit --author="" if you commit someone else's work, | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										16
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -99,6 +99,7 @@ FAQ | ||||
|   5.15 How do I get an FTP directory listing? | ||||
|   5.16 I want a different time-out! | ||||
|   5.17 Can I write a server with libcurl? | ||||
|   5.18 Does libcurl use threads? | ||||
|  | ||||
|  6. License Issues | ||||
|   6.1 I have a GPL program, can I use the libcurl library? | ||||
| @@ -422,7 +423,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 | ||||
|  | ||||
| @@ -1365,6 +1366,19 @@ FAQ | ||||
|   server for. And there are really good stand-alone ones that have been tested | ||||
|   and proven for many years. There's no need for you to reinvent them! | ||||
|  | ||||
|   5.18 Does libcurl use threads? | ||||
|  | ||||
|   Put simply: no, libcurl will execute in the same thread you call it in. All | ||||
|   callbacks will be called in the same thread as the one you call libcurl in. | ||||
|  | ||||
|   If you want to avoid your thread to be blocked by the libcurl call, you make | ||||
|   sure you use the non-blocking API which will do transfers asynchronously - | ||||
|   but still in the same single thread. | ||||
|  | ||||
|   libcurl will potentially internally use threads for name resolving, if it | ||||
|   was built to work like that, but in those cases it'll create the child | ||||
|   threads by itself and they will only be used and then killed internally by | ||||
|   libcurl and never exposed to the outside. | ||||
|  | ||||
| 6. License Issues | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										72
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								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. | ||||
|  | ||||
| @@ -264,8 +252,10 @@ Win32 | ||||
|    MSVC 6 caveats | ||||
|    -------------- | ||||
|  | ||||
|    If you use MSVC 6 it is required that you use the February 2003 edition PSDK: | ||||
|    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm | ||||
|    If you use MSVC 6 it is required that you use the February 2003 edition of | ||||
|    the 'Platform SDK' which can be downloaded from: | ||||
|  | ||||
|    http://www.microsoft.com/en-us/download/details.aspx?id=12261 | ||||
|  | ||||
|    Building any software with MSVC 6 without having PSDK installed is just | ||||
|    asking for trouble down the road once you have released it, you might notice | ||||
| @@ -273,8 +263,6 @@ Win32 | ||||
|    choice of static vs dynamic runtime and third party libraries. Anyone using | ||||
|    software built in such way will at some point regret having done so. | ||||
|  | ||||
|    When someone uses MSVC 6 without PSDK he is using a compiler back from 1998. | ||||
|  | ||||
|    If the compiler has been updated with the installation of a service pack as | ||||
|    those mentioned in http://support.microsoft.com/kb/194022 the compiler can be | ||||
|    safely used to read source code, translate and make it object code. | ||||
| @@ -284,13 +272,6 @@ Win32 | ||||
|    header files and libraries with bugs and security issues which have already | ||||
|    been addressed and fixed long time ago. | ||||
|  | ||||
|    In order to make use of the updated system headers and fixed libraries | ||||
|    for MSVC 6, it is required that 'Platform SDK', PSDK from now onwards, | ||||
|    is installed. The specific PSDK that must be installed for MSVC 6 is the | ||||
|    February 2003 edition, which is the latest one supporting the MSVC 6 compiler, | ||||
|    this PSDK is also known as 'Windows Server 2003 PSDK' and can be downloaded | ||||
|    from http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm | ||||
|  | ||||
|    So, building curl and libcurl with MSVC 6 without PSDK is absolutely | ||||
|    discouraged for the benefit of anyone using software built in such | ||||
|    environment. And it will not be supported in any way, as we could just | ||||
| @@ -352,39 +333,18 @@ Win32 | ||||
|    at runtime. | ||||
|    Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. | ||||
|  | ||||
|    MSVC 6 IDE | ||||
|    ---------- | ||||
|    MSVC IDE | ||||
|    -------- | ||||
|  | ||||
|    A minimal VC++ 6.0 reference workspace (vc6curl.dsw) is available with the | ||||
|    source distribution archive to allow proper building of the two included | ||||
|    projects, the libcurl library and the curl tool. | ||||
|    A fairly comprehensive set of Visual Studio project files are available for | ||||
|    v6.0 through v12.0 and are located in the projects folder to allow proper | ||||
|    building of both the libcurl library as well as the curl tool. | ||||
|  | ||||
|    1) Open the vs/vc6/vc6curl.dsw workspace with MSVC6's IDE. | ||||
|    2) Select 'Build' from top menu. | ||||
|    3) Select 'Batch Build' from dropdown menu. | ||||
|    4) Make sure that the eight project configurations are 'checked'. | ||||
|    5) Click on the 'Build' button. | ||||
|    6) Once the eight project configurations are built you are done. | ||||
|  | ||||
|    Dynamic and static libcurl libraries are built in debug and release flavours, | ||||
|    and can be located each one in its own subdirectory, dll-debug, dll-release, | ||||
|    lib-debug and lib-release, all of them below the 'vs/vc6/lib' subdirectory. | ||||
|  | ||||
|    In the same way four curl executables are created, each using its respective | ||||
|    library. The resulting curl executables are located in its own subdirectory, | ||||
|    dll-debug, dll-release, lib-debug and lib-release, below 'vs/vc6/src' subdir. | ||||
|  | ||||
|    These reference VC++ 6.0 configurations are generated using the dynamic CRT. | ||||
|  | ||||
|    Intentionally, these reference VC++ 6.0 projects and configurations don't use | ||||
|    third party libraries, such as OpenSSL or Zlib, to allow proper compilation | ||||
|    and configuration for all new users without further requirements. | ||||
|  | ||||
|    If you need something more 'involved' you might adjust them for your own use, | ||||
|    or explore the world of makefiles described above 'MSVC from command line'. | ||||
|    For more information about these projects and building via Visual Studio | ||||
|    please see the README file located in the projects folder. | ||||
|  | ||||
|    Borland C++ compiler | ||||
|    --------------------- | ||||
|    -------------------- | ||||
|  | ||||
|    Ensure that your build environment is properly set up to use the compiler | ||||
|    and associated tools. PATH environment variable must include the path to | ||||
| @@ -993,6 +953,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 +972,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 +986,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 | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
| ========= | ||||
|   | ||||
| @@ -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 | ||||
| @@ -300,7 +301,7 @@ Persistent Connections | ||||
|  o When libcurl is told to perform a transfer, it first checks for an already | ||||
|    existing connection in the cache that we can use. Otherwise it creates a | ||||
|    new one and adds that the cache. If the cache is full already when a new | ||||
|    conncetion is added added, it will first close the oldest unused one. | ||||
|    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. | ||||
| @@ -337,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 | ||||
| =============== | ||||
|   | ||||
| @@ -3,6 +3,25 @@ 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. | ||||
|  | ||||
| @@ -19,9 +38,9 @@ may have been fixed since this was written! | ||||
|   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 | ||||
|  | ||||
| @@ -50,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=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 | ||||
| @@ -161,16 +180,7 @@ may have been fixed since this was written! | ||||
|   --cflags suffers from the same effects with CFLAGS/CPPFLAGS. | ||||
|  | ||||
| 30. You need to use -g to the command line tool in order to use RFC2732-style | ||||
|   IPv6 numerical addresses in URLs. | ||||
|  | ||||
| 29. IPv6 URLs with zone ID is not nicely supported. | ||||
|   http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt (expired) | ||||
|   specifies the use of a plus sign instead of a percent when specifying zone | ||||
|   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): | ||||
|   http://curl.haxx.se/bug/view.cgi?id=555 | ||||
|   or RFC6874-style IPv6 numerical addresses in URLs. | ||||
|  | ||||
| 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 | ||||
|   | ||||
| @@ -47,7 +47,7 @@ for older and later versions as things don't change drastically that often. | ||||
|   ->mstate is the multi state of this particular SessionHandle. When | ||||
|   multi_runsingle() is called, it will act on this handle according to which | ||||
|   state it is in. The mstate is also what tells which sockets to return for a | ||||
|   speicific SessionHandle when curl_multi_fdset() is called etc. | ||||
|   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. | ||||
| @@ -60,7 +60,7 @@ for older and later versions as things don't change drastically that often. | ||||
|   re-use an existing one instead of creating a new as it creates a significant | ||||
|   performance boost. | ||||
|  | ||||
|   Each 'connectdata' identifies a single physical conncetion to a server. If | ||||
|   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. | ||||
|  | ||||
| @@ -158,18 +158,18 @@ for older and later versions as things don't change drastically that often. | ||||
|  | ||||
|   ->do_it is the function called to issue the transfer request. What we call | ||||
|   the DO action internally. If the DO is not enough and things need to be kept | ||||
|   getting done for the entier DO sequence to complete, ->doing is then usually | ||||
|   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 issudeing the transfer request command(s) | ||||
|   ->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 doring the DO_MORE state. The FTP protocol uses this | ||||
|   ->do_more gets called during the DO_MORE state. The FTP protocol uses this | ||||
|   state when setting up the second connection. | ||||
|  | ||||
|   ->proto_getsock | ||||
|   | ||||
| @@ -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. | ||||
|  | ||||
|   | ||||
| @@ -50,7 +50,7 @@ SIMPLE USAGE | ||||
|  | ||||
|   Get the main page from an IPv6 web server: | ||||
|  | ||||
|         curl -g "http://[2001:1890:1112:1::20]/" | ||||
|         curl "http://[2001:1890:1112:1::20]/" | ||||
|  | ||||
| DOWNLOAD TO A FILE | ||||
|  | ||||
| @@ -956,9 +956,9 @@ IPv6 | ||||
|   When this style is used, the -g option must be given to stop curl from | ||||
|   interpreting the square brackets as special globbing characters.  Link local | ||||
|   and site local addresses including a scope identifier, such as fe80::1234%1, | ||||
|   may also be used, but the scope portion must be numeric and the percent | ||||
|   character must be URL escaped. The previous example in an SFTP URL might | ||||
|   look like: | ||||
|   may also be used, but the scope portion must be numeric or match an existing | ||||
|   network interface on Linux and the percent character must be URL escaped. The | ||||
|   previous example in an SFTP URL might look like: | ||||
|  | ||||
|     sftp://[fe80::1234%251]/ | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
| @@ -37,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 LIBCURL-STRUCTS | ||||
|  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. | ||||
|   | ||||
							
								
								
									
										98
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										98
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -4,11 +4,14 @@ | ||||
|  | ||||
|  If you have contributed but are missing here, please let us know! | ||||
|  | ||||
| Aaro Koskinen | ||||
| Aaron Oneal | ||||
| Aaron Orenstein | ||||
| Abram Pousada | ||||
| Adam D. Moss | ||||
| Adam Light | ||||
| Adam Piggott | ||||
| Adam Sampson | ||||
| Adam Tkac | ||||
| Adrian Schuur | ||||
| Adriano Meirelles | ||||
| @@ -27,6 +30,7 @@ Alessandro Vesely | ||||
| Alex Bligh | ||||
| Alex Fishman | ||||
| Alex Gruz | ||||
| Alex McLellan | ||||
| Alex Neblett | ||||
| Alex Suykov | ||||
| Alex Vinnik | ||||
| @@ -62,6 +66,7 @@ Andreas Schuldei | ||||
| Andreas Wurf | ||||
| Andrei Benea | ||||
| Andrei Cipu | ||||
| Andrej E Baranov | ||||
| Andres Garcia | ||||
| Andrew Benham | ||||
| Andrew Biggs | ||||
| @@ -91,12 +96,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 | ||||
| @@ -109,9 +116,11 @@ 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 | ||||
| @@ -127,6 +136,7 @@ Bogdan Nicula | ||||
| Brad Burdick | ||||
| Brad Hards | ||||
| Brad King | ||||
| Brad Spencer | ||||
| Bradford Bruce | ||||
| Brandon Wang | ||||
| Brendan Jurd | ||||
| @@ -151,9 +161,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 | ||||
| @@ -181,6 +193,8 @@ Clarence Gardner | ||||
| Clemens Gruber | ||||
| Clifford Wolf | ||||
| Cody Jones | ||||
| Cody Mack | ||||
| Colby Ranger | ||||
| Colin Hogben | ||||
| Colin Watson | ||||
| Colm Buckley | ||||
| @@ -194,8 +208,10 @@ Cristian Rodríguez | ||||
| Curt Bogmine | ||||
| Cyrill Osterwalder | ||||
| Cédric Deltheil | ||||
| D. Flinkmann | ||||
| Dag Ekengren | ||||
| Dagobert Michelsen | ||||
| Damian Dixon | ||||
| Damien Adant | ||||
| Dan Becker | ||||
| Dan C | ||||
| @@ -221,6 +237,7 @@ Dave Halbakken | ||||
| Dave Hamilton | ||||
| Dave May | ||||
| Dave Reisner | ||||
| Dave Thompson | ||||
| Dave Vasilevsky | ||||
| David Bau | ||||
| David Binderman | ||||
| @@ -240,17 +257,23 @@ David McCreedy | ||||
| David Odin | ||||
| David Phillips | ||||
| David Rosenstrauch | ||||
| David Ryskalczyk | ||||
| David Shaw | ||||
| David Strauss | ||||
| David Tarendash | ||||
| David Thiel | ||||
| David Walser | ||||
| David Woodhouse | ||||
| David Wright | ||||
| David Yan | ||||
| Dengminwen | ||||
| Derek Higgins | ||||
| Detlef Schmier | ||||
| Didier Brisebourg | ||||
| Diego Casorran | ||||
| Dilyan Palauzov | ||||
| Dima Barsky | ||||
| Dima Tisnek | ||||
| Dimitre Dimitrov | ||||
| Dimitris Sarris | ||||
| Dinar | ||||
| @@ -289,6 +312,7 @@ Eelco Dolstra | ||||
| Eetu Ojanen | ||||
| Eldar Zaitov | ||||
| Ellis Pritchard | ||||
| Elmira A Semenova | ||||
| Emanuele Bovisio | ||||
| Emil Romanus | ||||
| Emiliano Ida | ||||
| @@ -298,6 +322,7 @@ Eric Cooper | ||||
| Eric Hu | ||||
| Eric Landes | ||||
| Eric Lavigne | ||||
| Eric Lubin | ||||
| Eric Melville | ||||
| Eric Mertens | ||||
| Eric Rautman | ||||
| @@ -314,14 +339,17 @@ 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 | ||||
| @@ -342,11 +370,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 | ||||
| @@ -361,7 +392,10 @@ Giuseppe Attardi | ||||
| Giuseppe D'Ambrosio | ||||
| Glen Nakamura | ||||
| Glen Scott | ||||
| Glenn Sheridan | ||||
| Gokhan Sengun | ||||
| Gordon Marler | ||||
| Gorilla Maguila | ||||
| Grant Erickson | ||||
| Greg Hewgill | ||||
| Greg Morse | ||||
| @@ -384,8 +418,10 @@ Hans-Jurgen May | ||||
| Hardeep Singh | ||||
| Harshal Pradhan | ||||
| Hauke Duden | ||||
| He Qin | ||||
| Heikki Korpela | ||||
| Heinrich Ko | ||||
| Heinrich Schaefer | ||||
| Hendrik Visage | ||||
| Henrik Storner | ||||
| Henry Ludemann | ||||
| @@ -395,6 +431,7 @@ Ho-chi Chen | ||||
| Hoi-Ho Chan | ||||
| Hongli Lai | ||||
| Howard Chu | ||||
| Hubert Kario | ||||
| Hzhijun | ||||
| Ian D Allen | ||||
| Ian Ford | ||||
| @@ -406,6 +443,7 @@ Ignacio Vazquez-Abrams | ||||
| Igor Franchuk | ||||
| Igor Novoseltsev | ||||
| Igor Polyakov | ||||
| Iida Yosiaki | ||||
| Ilguiz Latypov | ||||
| Ilja van Sprundel | ||||
| Immanuel Gregoire | ||||
| @@ -413,6 +451,7 @@ Ingmar Runge | ||||
| Ingo Ralf Blum | ||||
| Ingo Wilken | ||||
| Ishan SinghLevett | ||||
| Ivo Bellin Salarin | ||||
| Jack Zhang | ||||
| Jacky Lam | ||||
| Jacob Meuser | ||||
| @@ -422,6 +461,7 @@ James Bursa | ||||
| James Cheng | ||||
| James Clancy | ||||
| James Cone | ||||
| James Dury | ||||
| James Gallagher | ||||
| James Griffiths | ||||
| James Housley | ||||
| @@ -441,6 +481,7 @@ Jason Glasgow | ||||
| Jason Liu | ||||
| Jason McDonald | ||||
| Jason S. Priebe | ||||
| Javier Barroso | ||||
| Jay Austin | ||||
| Jayesh A Shah | ||||
| Jaz Fresh | ||||
| @@ -452,7 +493,9 @@ Jean-Marc Ranger | ||||
| Jean-Noel Rouvignac | ||||
| Jean-Philippe Barrette-LaPierre | ||||
| Jeff Connelly | ||||
| Jeff Hodges | ||||
| Jeff Johnson | ||||
| Jeff King | ||||
| Jeff Lawson | ||||
| Jeff Phillips | ||||
| Jeff Pohlmeyer | ||||
| @@ -460,8 +503,10 @@ Jeff Weber | ||||
| Jeffrey Pohlmeyer | ||||
| Jeremy Friesner | ||||
| Jeremy Huddleston | ||||
| Jeroen Koekkoek | ||||
| Jerome Muffat-Meridol | ||||
| Jerome Vouillon | ||||
| Jerry Krinock | ||||
| Jerry Wu | ||||
| Jes Badwal | ||||
| Jesper Jensen | ||||
| @@ -473,6 +518,7 @@ Jim Hollinger | ||||
| Jim Meyering | ||||
| Jiri Hruska | ||||
| Jiri Jaburek | ||||
| Jiri Malak | ||||
| Jocelyn Jaubert | ||||
| Joe Halpin | ||||
| Joe Malicki | ||||
| @@ -486,6 +532,7 @@ Johannes Bauer | ||||
| John Bradshaw | ||||
| John Crow | ||||
| John Dennis | ||||
| John Dunn | ||||
| John E. Malmberg | ||||
| John Gardiner Myers | ||||
| John Janssen | ||||
| @@ -503,6 +550,7 @@ Johnny Luong | ||||
| Jon Grubbs | ||||
| Jon Nelson | ||||
| Jon Sargeant | ||||
| Jon Torrey | ||||
| Jon Travis | ||||
| Jon Turner | ||||
| Jonas Forsman | ||||
| @@ -530,6 +578,7 @@ Jun-ichiro itojun Hagino | ||||
| Jurij Smakov | ||||
| Justin Fletcher | ||||
| Justin Karneges | ||||
| Justin Maggard | ||||
| Jörg Mueller-Tolk | ||||
| Jörn Hartroth | ||||
| Kai Engert | ||||
| @@ -569,10 +618,12 @@ Krishnendu Majumdar | ||||
| Krister Johansen | ||||
| Kristian Gunstone | ||||
| Kristian Köhntopp | ||||
| Kyle L. Huff | ||||
| Kyle Sallee | ||||
| Lachlan O'Dea | ||||
| Larry Campbell | ||||
| Larry Fahnoe | ||||
| Larry Lin | ||||
| Lars Buitinck | ||||
| Lars Gustafsson | ||||
| Lars J. Aas | ||||
| @@ -583,9 +634,11 @@ Lau Hang Kin | ||||
| Laurent Rabret | ||||
| Legoff Vincent | ||||
| Lehel Bernadt | ||||
| Leif W | ||||
| Len Krause | ||||
| Lenaic Lefever | ||||
| Lenny Rachitsky | ||||
| Leon Winter | ||||
| Liam Healy | ||||
| Lijo Antony | ||||
| Linas Vepstas | ||||
| @@ -603,14 +656,18 @@ Ludovico Cavedon | ||||
| Lukasz Czekierda | ||||
| Luke Amery | ||||
| Luke Call | ||||
| Luke Dashjr | ||||
| Luong Dinh Dung | ||||
| Maciej Karpiuk | ||||
| Maciej Puzio | ||||
| Maciej W. Rozycki | ||||
| Maks Naumov | ||||
| Mamoru Tasaka | ||||
| Mandy Wu | ||||
| Manfred Schwarb | ||||
| Manuel Massing | ||||
| Marc Boucher | ||||
| Marc Deslauriers | ||||
| Marc Doughty | ||||
| Marc Hoersken | ||||
| Marc Kleine-Budde | ||||
| @@ -618,6 +675,7 @@ Marcel Raad | ||||
| Marcel Roelofs | ||||
| Marcelo Juchem | ||||
| Marcin Adamski | ||||
| Marcin Gryszkalis | ||||
| Marcin Konicki | ||||
| Marco G. Salvagno | ||||
| Marco Maggi | ||||
| @@ -672,6 +730,7 @@ Maxim Prohorov | ||||
| Maxime Larocque | ||||
| Mehmet Bozkurt | ||||
| Mekonikum | ||||
| Melissa Mears | ||||
| Mettgut Jamalla | ||||
| Michael Benedict | ||||
| Michael Calmer | ||||
| @@ -683,6 +742,7 @@ Michael Jahn | ||||
| Michael Jerris | ||||
| Michael Mealling | ||||
| Michael Mueller | ||||
| Michael Osipov | ||||
| Michael Smith | ||||
| Michael Stillwell | ||||
| Michael Wallner | ||||
| @@ -699,13 +759,16 @@ 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 | ||||
| @@ -744,6 +807,7 @@ Olaf Flebbe | ||||
| Olaf Stueben | ||||
| Olaf Stüben | ||||
| Oliver Gondža | ||||
| Oliver Kuckertz | ||||
| Olivier Berger | ||||
| Oren Tirosh | ||||
| Ori Avtalion | ||||
| @@ -751,6 +815,7 @@ Oscar Koeroo | ||||
| Oscar Norlander | ||||
| P R Schaffner | ||||
| Paolo Piacentini | ||||
| Paras Sethia | ||||
| Pascal Terjan | ||||
| Pasha Kuznetsov | ||||
| Pat Ray | ||||
| @@ -760,10 +825,13 @@ Patrick Bihan-Faou | ||||
| Patrick Monnerat | ||||
| Patrick Scott | ||||
| Patrick Smith | ||||
| Patrick Watson | ||||
| Patrik Thunstrom | ||||
| Pau Garcia i Quiles | ||||
| Paul Donohue | ||||
| Paul Harrington | ||||
| Paul Howarth | ||||
| Paul Marks | ||||
| Paul Marquis | ||||
| Paul Moore | ||||
| Paul Nolan | ||||
| @@ -792,6 +860,9 @@ Peter Todd | ||||
| Peter Verhas | ||||
| Peter Wullinger | ||||
| Peteris Krumins | ||||
| Petr Bahula | ||||
| Petr Novak | ||||
| Petr Pisar | ||||
| Phil Blundell | ||||
| Phil Karn | ||||
| Phil Lisiecki | ||||
| @@ -809,10 +880,13 @@ Pierre Joye | ||||
| Pierre Ynard | ||||
| Pooyan McSporran | ||||
| Pramod Sharma | ||||
| Prash Dush | ||||
| Priyanka Shah | ||||
| Puneet Pawaia | ||||
| Quagmire | ||||
| Quanah Gibson-Mount | ||||
| Quinn Slack | ||||
| Radu Simionescu | ||||
| Rafa Muyo | ||||
| Rafael Sagula | ||||
| Rainer Canavan | ||||
| @@ -828,6 +902,7 @@ Ravi Pratap | ||||
| Ray Dassen | ||||
| Ray Pekowski | ||||
| Reinout van Schouwen | ||||
| Remi Gacogne | ||||
| Renato Botelho | ||||
| Renaud Chaillat | ||||
| Renaud Duhaut | ||||
| @@ -851,6 +926,7 @@ Richard Silverman | ||||
| Rick Jones | ||||
| Rick Richardson | ||||
| Rob Crittenden | ||||
| Rob Davies | ||||
| Rob Jones | ||||
| Rob Stanzel | ||||
| Rob Ward | ||||
| @@ -875,15 +951,18 @@ Roland Zimmermann | ||||
| Rolland Dudemaine | ||||
| Roman Koifman | ||||
| Roman Mamedov | ||||
| Romulo A. Ceccon | ||||
| Ron Zapp | ||||
| Rosimildo da Silva | ||||
| Roy Shan | ||||
| Rune Kleveland | ||||
| Ruslan Gazizov | ||||
| Rutger Hofman | ||||
| Ryan Braud | ||||
| Ryan Chan | ||||
| Ryan Nelson | ||||
| Ryan Schmidt | ||||
| Rémy Léone | ||||
| S. Moonesamy | ||||
| Salvador Dávila | ||||
| Salvatore Sorrentino | ||||
| @@ -909,11 +988,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 | ||||
| @@ -964,12 +1046,15 @@ 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 | ||||
| Till Maas | ||||
| Tim Ansell | ||||
| Tim Baker | ||||
| Tim Bartley | ||||
| @@ -981,6 +1066,7 @@ Tim Newsome | ||||
| Tim Sneddon | ||||
| Timo Sirainen | ||||
| Tinus van den Berg | ||||
| Tobias Markus | ||||
| Tobias Rundström | ||||
| Toby Peterson | ||||
| Todd A Ouska | ||||
| @@ -995,8 +1081,10 @@ Tom Mattison | ||||
| Tom Moers | ||||
| Tom Mueller | ||||
| Tom Regner | ||||
| Tom Sparrow | ||||
| Tom Wright | ||||
| Tom Zerucha | ||||
| Tomas Hoger | ||||
| Tomas Mlcoch | ||||
| Tomas Pospisek | ||||
| Tomas Szepe | ||||
| @@ -1014,12 +1102,17 @@ Traian Nicolescu | ||||
| Troels Walsted Hansen | ||||
| Troy Engel | ||||
| Tupone Alfredo | ||||
| Tyler Hall | ||||
| Török Edwin | ||||
| Ulf Härnhammar | ||||
| Ulf Samuelsson | ||||
| Ulrich Doehner | ||||
| Ulrich Zadow | ||||
| Venkat Akella | ||||
| Victor Snezhko | ||||
| Vijay Panghal | ||||
| Vikram Saxena | ||||
| Viktor Szakáts | ||||
| Vilmos Nebehaj | ||||
| Vincent Bronner | ||||
| Vincent Le Normand | ||||
| @@ -1041,15 +1134,20 @@ 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 | ||||
|   | ||||
							
								
								
									
										202
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -16,29 +16,30 @@ | ||||
|  1.3 struct lifreq | ||||
|  1.4 signal-based resolver timeouts | ||||
|  1.5 get rid of PATH_MAX | ||||
|  1.6 Happy Eyeball dual stack connect | ||||
|  1.7 Modified buffer size approach | ||||
|  1.6 Modified buffer size approach | ||||
|  1.7 Detect when called from within callbacks | ||||
|  1.8 Allow SSL (HTTPS) to proxy | ||||
|  | ||||
|  2. libcurl - multi interface | ||||
|  2.1 More non-blocking | ||||
|  2.2 Fix HTTP Pipelining for PUT | ||||
|  | ||||
|  3. Documentation | ||||
|  3.1  More and better | ||||
|  3.1 Update date and version in man pages | ||||
|  | ||||
|  4. FTP | ||||
|  4.1 HOST | ||||
|  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,7 @@ | ||||
|  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 | ||||
|  | ||||
|  16. Build | ||||
|  16.1 roffit | ||||
| @@ -102,9 +97,10 @@ | ||||
|  17.2 nicer lacking perl message | ||||
|  17.3 more protocols supported | ||||
|  17.4 more platforms supported | ||||
|  17.5 Add support for concurrent connections | ||||
|  | ||||
|  18. Next SONAME bump | ||||
|  18.1 http-style HEAD output for ftp | ||||
|  18.1 http-style HEAD output for FTP | ||||
|  18.2 combine error codes | ||||
|  18.3 extend CURLOPT_SOCKOPTFUNCTION prototype | ||||
|  | ||||
| @@ -157,19 +153,7 @@ | ||||
|  we need libssh2 to properly tell us when we pass in a too small buffer and | ||||
|  its current API (as of libssh2 1.2.7) doesn't. | ||||
|  | ||||
| 1.6 Happy Eyeball dual stack connect | ||||
|  | ||||
|  In order to make alternative technologies not suffer when transitioning, like | ||||
|  when introducing IPv6 as an alternative to IPv4 and there are more than one | ||||
|  option existing simultaneously there are reasons to reconsider internal | ||||
|  choices. | ||||
|  | ||||
|  To make libcurl do blazing fast IPv6 in a dual-stack configuration, this needs | ||||
|  to be addressed: | ||||
|  | ||||
|     http://tools.ietf.org/html/rfc6555 | ||||
|  | ||||
| 1.7 Modified buffer size approach | ||||
| 1.6 Modified buffer size approach | ||||
|  | ||||
|  Current libcurl allocates a fixed 16K size buffer for download and an | ||||
|  additional 16K for upload. They are always unconditionally part of the easy | ||||
| @@ -190,6 +174,20 @@ | ||||
|  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 within 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 | ||||
|  | ||||
|  ...and by Firefox soon: | ||||
|  https://bugzilla.mozilla.org/show_bug.cgi?id=378637 | ||||
|  | ||||
| 2. libcurl - multi interface | ||||
|  | ||||
| @@ -215,18 +213,20 @@ | ||||
|  | ||||
| 3. Documentation | ||||
|  | ||||
| 3.1  More and better | ||||
| 3.1 Update date and version in man pages | ||||
|  | ||||
|  Exactly | ||||
|  'maketgz' or another suitable script could update the .TH sections of the man | ||||
|  pages at release time to use the current date and curl/libcurl version | ||||
|  number. | ||||
|  | ||||
| 4. FTP | ||||
|  | ||||
| 4.1 HOST | ||||
|  | ||||
|  HOST is a suggested command in the works for a client to tell which host name | ||||
|  to use, to offer FTP servers named-based virtual hosting: | ||||
|  HOST is a command for a client to tell which host name to use, to offer FTP | ||||
|  servers named-based virtual hosting: | ||||
|  | ||||
|  http://tools.ietf.org/html/draft-hethmon-mcmurray-ftp-hosts-11 | ||||
|  http://tools.ietf.org/html/rfc7151 | ||||
|  | ||||
| 4.2 Alter passive/active on failure and retry | ||||
|  | ||||
| @@ -237,7 +237,7 @@ | ||||
|  | ||||
| 4.3 Earlier bad letter detection | ||||
|  | ||||
|  Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the | ||||
|  Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the | ||||
|  process to avoid doing a resolve and connect in vain. | ||||
|  | ||||
| 4.4 REST for large files | ||||
| @@ -246,13 +246,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. | ||||
| @@ -282,24 +276,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 specifying --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 | ||||
|  | ||||
| @@ -331,14 +326,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. | ||||
| @@ -349,28 +337,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. | ||||
| @@ -382,7 +356,7 @@ to provide the data to send. | ||||
|  Currently the LDAP module only supports ldap_simple_bind_s() in order to bind | ||||
|  to an LDAP server. However, this function sends username and password details | ||||
|  using the simple authentication mechanism (as clear text). However, it should | ||||
|  be possible to use ldap_bind_s() instead specifing the security context | ||||
|  be possible to use ldap_bind_s() instead specifying the security context | ||||
|  information ourselves. | ||||
|  | ||||
| 11. New protocols | ||||
| @@ -413,7 +387,7 @@ to provide the data to send. | ||||
| 12.4 Cache OpenSSL contexts | ||||
|  | ||||
|  "Look at SSL cafile - quick traces look to me like these are done on every | ||||
|  request as well, when they should only be necessary once per ssl context (or | ||||
|  request as well, when they should only be necessary once per SSL context (or | ||||
|  once per handle)". The major improvement we can rather easily do is to make | ||||
|  sure we don't create and kill a new SSL "context" for every request, but | ||||
|  instead make one for every connection and re-use that SSL context in the same | ||||
| @@ -434,17 +408,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. | ||||
| @@ -518,33 +487,12 @@ 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 | ||||
|  | ||||
|   Currently the command line client needs to get url globbing disabled (with | ||||
|   -g) for it to support IPv6 numerical addresses. This is a rather silly flaw | ||||
|   that should be corrected. It probably involves a smarter detection of the | ||||
|   '[' and ']' letters. | ||||
|  | ||||
| 16. Build | ||||
|  | ||||
| 16.1 roffit | ||||
| @@ -567,7 +515,7 @@ to provide the data to send. | ||||
|  | ||||
| 17.3 more protocols supported | ||||
|  | ||||
|  Extend the test suite to include more protocols. The telnet could just do ftp | ||||
|  Extend the test suite to include more protocols. The telnet could just do FTP | ||||
|  or http operations (for which we have test servers). | ||||
|  | ||||
| 17.4 more platforms supported | ||||
| @@ -575,12 +523,26 @@ to provide the data to send. | ||||
|  Make the test suite work on more platforms. OpenBSD and Mac OS. Remove | ||||
|  fork()s and it should become even more portable. | ||||
|  | ||||
| 17.5 Add support for concurrent connections | ||||
|  | ||||
|  Tests 836, 882 and 938 were designed to verify that separate connections aren't | ||||
|  used when using different login credentials in protocols that shouldn't re-use | ||||
|  a connection under such circumstances. | ||||
|  | ||||
|  Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent | ||||
|  connections. The read while() loop seems to loop until it receives a disconnect | ||||
|  from the client, where it then enters the waiting for connections loop. When | ||||
|  the client opens a second connection to the server, the first connection hasn't | ||||
|  been dropped (unless it has been forced - which we shouldn't do in these tests) | ||||
|  and thus the wait for connections loop is never entered to receive the second | ||||
|  connection. | ||||
|  | ||||
| 18. Next SONAME bump | ||||
|  | ||||
| 18.1 http-style HEAD output for ftp | ||||
| 18.1 http-style HEAD output for FTP | ||||
|  | ||||
|  #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers | ||||
|  from being output in NOBODY requests over ftp | ||||
|  from being output in NOBODY requests over FTP | ||||
|  | ||||
| 18.2 combine error codes | ||||
|  | ||||
| @@ -614,7 +576,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 | ||||
|  | ||||
| @@ -678,7 +640,7 @@ to provide the data to send. | ||||
|  but instead often restricts how the form functions can or can't be modified. | ||||
|  | ||||
|  Changing them to return a private handle will benefit the implementation and | ||||
|  allow us much greater freedoms while still maintining a solid API and ABI. | ||||
|  allow us much greater freedoms while still maintaining a solid API and ABI. | ||||
|  | ||||
| 19.9 have form functions use CURL handle argument | ||||
|  | ||||
| @@ -692,7 +654,7 @@ to provide the data to send. | ||||
|  | ||||
|  Rather than use the URL to specify the mail client string to present in the | ||||
|  HELO and EHLO commands, libcurl should support a new CURLOPT specifically for | ||||
|  specifing this data as the URL is non-standard and to be honest a bit of a | ||||
|  specifying this data as the URL is non-standard and to be honest a bit of a | ||||
|  hack ;-) | ||||
|  | ||||
|  Please see the following thread for more information: | ||||
|   | ||||
| @@ -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 | ||||
| @@ -473,35 +667,40 @@ Date:    Jan 19, 2011 | ||||
|  browser's requests: | ||||
|  | ||||
|  * Use the --trace-ascii option to store fully detailed logs of the requests | ||||
|    for easier analyzing and better understanding | ||||
|  for easier analyzing and better understanding | ||||
|  | ||||
|  * Make sure you check for and use cookies when needed (both reading with | ||||
|    --cookie and writing with --cookie-jar) | ||||
|  --cookie and writing with --cookie-jar) | ||||
|  | ||||
|  * Set user-agent to one like a recent popular browser does | ||||
|  | ||||
|  * 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 | ||||
|   | ||||
							
								
								
									
										229
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										229
									
								
								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 | ||||
| @@ -124,18 +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) 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.0" | ||||
| (HTTP) Tells curl to issue its requests using HTTP 2.0. This requires that the | ||||
| .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. | ||||
| @@ -287,11 +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\fP @foobar. When --data is told to read from a file like that, | ||||
| carriage returns and newlines will be stripped out. | ||||
| 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. | ||||
|  | ||||
| @@ -422,7 +442,7 @@ 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 | ||||
| @@ -646,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. | ||||
| @@ -658,16 +678,16 @@ If this option is used several times, only the first one is used. This is | ||||
| because undoing a GET doesn't make sense, but you should then instead enforce | ||||
| the alternative method you prefer. | ||||
| .IP "-H, --header <header>" | ||||
| (HTTP) Extra header to use when getting a web page. You may specify any number | ||||
| of extra headers. Note that if you should add a custom header that has the | ||||
| same name as one of the internal ones curl would use, your externally set | ||||
| header will be used instead of the internal one. This allows you to make even | ||||
| trickier stuff than curl would normally do. You should not replace internally | ||||
| set headers without knowing perfectly well what you're doing. Remove an | ||||
| internal header by giving a replacement without content on the right side of | ||||
| the colon, as in: -H \&"Host:". If you send the custom header with no-value | ||||
| then its header must be terminated with a semicolon, such as \-H | ||||
| \&"X-Custom-Header;" to send "X-Custom-Header:". | ||||
| (HTTP) Extra header to include in the request when sending HTTP to a | ||||
| server. You may specify any number of extra headers. Note that if you should | ||||
| add a custom header that has the same name as one of the internal ones curl | ||||
| would use, your externally set header will be used instead of the internal | ||||
| one. This allows you to make even trickier stuff than curl would normally | ||||
| do. You should not replace internally set headers without knowing perfectly | ||||
| well what you're doing. Remove an internal header by giving a replacement | ||||
| without content on the right side of the colon, as in: -H \&"Host:". If you | ||||
| send the custom header with no-value then its header must be terminated with a | ||||
| semicolon, such as \-H \&"X-Custom-Header;" to send "X-Custom-Header:". | ||||
|  | ||||
| curl will make sure that each header you add/replace is sent with the proper | ||||
| end-of-line marker, you should thus \fBnot\fP add that as a part of the header | ||||
| @@ -676,6 +696,9 @@ for you. | ||||
|  | ||||
| See also the \fI-A, --user-agent\fP and \fI-e, --referer\fP options. | ||||
|  | ||||
| Starting in 7.37.0, you need \fI--proxy-header\fP to send custom headers | ||||
| intended for a proxy. | ||||
|  | ||||
| This option can be used multiple times to add/replace/remove multiple headers. | ||||
| .IP "--hostpubmd5 <md5>" | ||||
| (SCP/SFTP) Pass a string containing 32 hexadecimal digits. The string should | ||||
| @@ -711,6 +734,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 | ||||
| @@ -722,16 +748,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. | ||||
| @@ -742,9 +773,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: | ||||
| @@ -806,15 +834,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), | ||||
| @@ -874,6 +910,16 @@ 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 "--login-options <options>" | ||||
| Specify the login options to use during server authentication. | ||||
|  | ||||
| You can use the login options to specify protocol specific options that may | ||||
| be used during authentication. At present only IMAP, POP3 and SMTP support | ||||
| login options. 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.34.0). | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--mail-auth <address>" | ||||
| (SMTP) Specify a single address. This will be used to specify the | ||||
| @@ -894,10 +940,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 | ||||
| @@ -1053,15 +1107,37 @@ 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 conjuction with the user name which can be | ||||
| specified as part of the \fI--url\fP or \fI-u, --user\fP options. | ||||
| (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 "--proxy-header <header>" | ||||
| (HTTP) Extra header to include in the request when sending HTTP to a | ||||
| proxy. You may specify any number of extra headers. This is the equivalent | ||||
| option to \fI-H, --header\fP but is for proxy communication only like in | ||||
| CONNECT requests when you want a separate header sent to the proxy to what is | ||||
| sent to the actual remote host. | ||||
|  | ||||
| curl will make sure that each header you add/replace is sent with the proper | ||||
| end-of-line marker, you should thus \fBnot\fP add that as a part of the header | ||||
| content: do not add newlines or carriage returns, they will only mess things | ||||
| up for you. | ||||
|  | ||||
| Headers specified with this option will not be included in requests that curl | ||||
| knows will not be sent to a proxy. | ||||
|  | ||||
| This option can be used multiple times to add/replace/remove multiple headers. | ||||
|  | ||||
| (Added in 7.37.0) | ||||
| .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 | ||||
| @@ -1379,7 +1455,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]>" | ||||
| @@ -1498,14 +1574,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. | ||||
| @@ -1535,23 +1623,15 @@ 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;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. | ||||
| .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. | ||||
|  | ||||
| If you simply specify the user name, with or without the login options, curl | ||||
| will prompt for a password. | ||||
| If you simply specify the user name, curl will prompt for a password. | ||||
|  | ||||
| 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 specfying 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).  | ||||
| specifying a single colon with this option: "-u :". | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-U, --proxy-user <user:password>" | ||||
| @@ -1761,8 +1841,17 @@ 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 extended file attributes. Currently, the URL is stored in the | ||||
| @@ -2055,6 +2144,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,8 +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 postinmemory | ||||
|   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. | ||||
| @@ -13,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 usercertinmem.c | ||||
|   multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c | ||||
|   | ||||
| @@ -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 | ||||
| @@ -103,6 +103,10 @@ static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm) | ||||
|   if (X509_STORE_add_cert(store, cert)==0) | ||||
|     printf("error adding certificate\n"); | ||||
|  | ||||
|   /* decrease reference counts */ | ||||
|   X509_free(cert); | ||||
|   BIO_free(bio); | ||||
|  | ||||
|   /* all set to go */ | ||||
|   return CURLE_OK ; | ||||
| } | ||||
|   | ||||
| @@ -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 - 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 | ||||
|   | ||||
							
								
								
									
										116
									
								
								docs/examples/imap-append.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								docs/examples/imap-append.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  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 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; | ||||
| } | ||||
							
								
								
									
										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,139 +19,151 @@ | ||||
|  * 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) | ||||
| { | ||||
|    CURL *curl; | ||||
|    CURLM *mcurl; | ||||
|    int still_running = 1; | ||||
|    struct timeval mp_start; | ||||
|    struct WriteThis pooh; | ||||
|    struct curl_slist* rcpt_list = NULL; | ||||
|   CURL *curl; | ||||
|   CURLM *mcurl; | ||||
|   int still_running = 1; | ||||
|   struct timeval mp_start; | ||||
|   struct curl_slist *recipients = NULL; | ||||
|   struct upload_status upload_ctx; | ||||
|  | ||||
|    pooh.counter = 0; | ||||
|   upload_ctx.lines_read = 0; | ||||
|  | ||||
|    curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
|   curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
|  | ||||
|    curl = curl_easy_init(); | ||||
|    if(!curl) | ||||
|      return 1; | ||||
|   curl = curl_easy_init(); | ||||
|   if(!curl) | ||||
|     return 1; | ||||
|  | ||||
|    mcurl = curl_multi_init(); | ||||
|    if(!mcurl) | ||||
|      return 2; | ||||
|   mcurl = curl_multi_init(); | ||||
|   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"); | ||||
|  | ||||
|   /* 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); | ||||
|  | ||||
|    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); | ||||
|    curl_multi_add_handle(mcurl, curl); | ||||
|   /* 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); | ||||
|  | ||||
|    mp_start = tvnow(); | ||||
|   /* 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); | ||||
|  | ||||
|   /* we start some action by calling perform right away */ | ||||
|   /* 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; | ||||
|     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,32 +184,32 @@ 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 */ | ||||
|     case 0:   /* timeout */ | ||||
|     default:  /* action */ | ||||
|       curl_multi_perform(mcurl, &still_running); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   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 - 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 | ||||
| @@ -109,7 +109,9 @@ uploaded. | ||||
| .IP CURLINFO_SIZE_DOWNLOAD | ||||
| Pass a pointer to a double to receive the total amount of bytes that were | ||||
| downloaded. The amount is only for the latest transfer and will be reset again | ||||
| for each new transfer. | ||||
| for each new transfer. This counts actual payload data, what's also commonly | ||||
| called body. All meta and header data are excluded and will not be counted in | ||||
| this number. | ||||
| .IP CURLINFO_SPEED_DOWNLOAD | ||||
| Pass a pointer to a double to receive the average download speed that curl | ||||
| measured for the complete download. Measured in bytes/second. | ||||
| @@ -219,8 +221,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 | ||||
|   | ||||
| @@ -31,8 +31,8 @@ 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 | ||||
| @@ -68,6 +68,10 @@ 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. | ||||
|   | ||||
| @@ -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 | ||||
| @@ -347,6 +347,8 @@ Pass a pointer to a function that matches the following prototype: | ||||
| \fBint function(void *clientp, double dltotal, double dlnow, double ultotal, | ||||
| double ulnow);\fP | ||||
|  | ||||
| We encourage users to use \fICURLOPT_XFERINFOFUNCTION\fP instead, if you can. | ||||
|  | ||||
| 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 | ||||
| @@ -493,6 +495,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 | ||||
| @@ -817,8 +823,9 @@ the user | ||||
|  | ||||
| The path part of an IMAP request not only specifies the mailbox to list (Added | ||||
| in 7.30.0) or select, but can also be used to check the UIDVALIDITY of the | ||||
| mailbox and to specify the UID and SECTION of the message to fetch (Added in | ||||
| 7.30.0). | ||||
| mailbox, to specify the UID, SECTION (Added in 7.30.0) and PARTIAL octets | ||||
| (Added in 7.37.0) of the message to fetch and to specify what nessages to | ||||
| search for (Added in 7.37.0). | ||||
|  | ||||
| imap://user:password@mail.example.com - Performs a top level folder list | ||||
|  | ||||
| @@ -833,7 +840,17 @@ the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches | ||||
| message 2 if it is | ||||
|  | ||||
| imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the | ||||
| user's inbox and fetches message 3 with only the text portion of the message | ||||
| user's inbox and fetches the text portial of message 3 | ||||
|  | ||||
| imap://user:password@mail.example.com/INBOX/;UID=4/;PARTIAL=0.1024 - Selects | ||||
| the user's inbox and fetches the first 1024 octets of message 4 | ||||
|  | ||||
| imap://user:password@mail.example.com/INBOX?NEW - Selects the user's inbox and | ||||
| checks for NEW messages | ||||
|  | ||||
| imap://user:password@mail.example.com/INBOX?SUBJECT%20shadows - Selects the | ||||
| user's inbox and searches for messages containing "shadows" in the subject | ||||
| line | ||||
|  | ||||
| For more information about the individual components of an IMAP URL please | ||||
| see RFC5092. | ||||
| @@ -936,9 +953,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 | ||||
| @@ -985,8 +1002,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 | ||||
| @@ -1131,7 +1148,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 | ||||
| @@ -1145,15 +1162,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 | ||||
| @@ -1164,14 +1184,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. | ||||
| @@ -1291,8 +1323,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 | ||||
| @@ -1302,10 +1333,10 @@ 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_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) | ||||
| .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. | ||||
| @@ -1497,17 +1528,20 @@ set the User-Agent: header in the http request sent to the remote server. This | ||||
| can be used to fool servers or scripts. You can also set any custom header | ||||
| with \fICURLOPT_HTTPHEADER\fP. | ||||
| .IP CURLOPT_HTTPHEADER | ||||
| Pass a pointer to a linked list of HTTP headers to pass to the server in your | ||||
| HTTP 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. If you add a header that is otherwise generated and used by libcurl | ||||
| internally, your added one will be used instead. If you add a header with no | ||||
| content as in 'Accept:' (no data on the right side of the colon), the | ||||
| internally used header will get disabled. Thus, using this option you can add | ||||
| new headers, replace internal headers and remove internal headers. To add a | ||||
| header with no content (nothing to the right side of the colon), use the | ||||
| form 'MyHeader;' (note the ending semicolon). | ||||
| Pass a pointer to a linked list of HTTP headers to pass to the server and/or | ||||
| proxy in your HTTP request. The same list is used for both host and proxy | ||||
| requests! | ||||
|  | ||||
| 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. If you add a | ||||
| header that is otherwise generated and used by libcurl internally, your added | ||||
| one will be used instead. If you add a header with no content as in 'Accept:' | ||||
| (no data on the right side of the colon), the internally used header will get | ||||
| disabled. With this option you can add new headers, replace internal headers | ||||
| and remove internal headers. To add a header with no content (nothing to the | ||||
| right side of the colon), use the form 'MyHeader;' (note the ending | ||||
| semicolon). | ||||
|  | ||||
| The headers included in the linked list must not be CRLF-terminated, because | ||||
| curl adds CRLF after each header item. Failure to comply with this will result | ||||
| @@ -1523,6 +1557,42 @@ Pass a NULL to this to reset back to no custom headers. | ||||
|  | ||||
| The most commonly replaced headers have "shortcuts" in the options | ||||
| \fICURLOPT_COOKIE\fP, \fICURLOPT_USERAGENT\fP and \fICURLOPT_REFERER\fP. | ||||
|  | ||||
| There's an alternative option that sets or replaces headers only for requests | ||||
| that are sent with CONNECT to a proxy: \fICURLOPT_PROXYHEADER\fP. Use | ||||
| \fICURLOPT_HEADEROPT\fP to control the behavior. | ||||
| .IP CURLOPT_HEADEROPT | ||||
| Pass a long that is a bitmask of options of how to deal with headers. The two | ||||
| mutually exclusive options are: | ||||
|  | ||||
| CURLHEADER_UNIFIED - keep working as before. This means CURLOPT_HTTPHEADER | ||||
| headers will be used in requests both to servers and proxies. With this option | ||||
| enabled, \fICURLOPT_PROXYHEADER\fP will not have any effect. | ||||
|  | ||||
| CURLHEADER_SEPARATE - makes \fICURLOPT_HTTPHEADER\fP headers only get sent to | ||||
| a server and not to a proxy. Proxy headers must be set with | ||||
| \fICURLOPT_PROXYHEADER\fP to get used. Note that if a non-CONNECT request is | ||||
| sent to a proxy, libcurl will send both server headers and proxy headers. When | ||||
| doing CONNECT, libcurl will send \fICURLOPT_PROXYHEADER\fP headers only do the | ||||
| proxy and then \fICURLOPT_HTTPHEADER\fP headers only to the server. | ||||
|  | ||||
| (Added in 7.37.0) | ||||
| .IP CURLOPT_PROXYHEADER | ||||
| Pass a pointer to a linked list of HTTP headers to pass in your HTTP request | ||||
| sent to a proxy. The rules for this list is identical to the | ||||
| \fICURLOPT_HTTPHEADER\fP option's. | ||||
|  | ||||
| The headers set with this option is only ever used in requests sent to a proxy | ||||
| - when there's also a request sent to a host. | ||||
|  | ||||
| The first line in a request (containing the method, usually a GET or POST) is | ||||
| NOT a header and cannot be replaced using this option. Only the lines | ||||
| following the request-line are headers. Adding this method line in this list | ||||
| of headers will only cause your request to send an invalid header. | ||||
|  | ||||
| Pass a NULL to this to reset back to no custom headers. | ||||
|  | ||||
| This option was added in libcurl 7.37.0. | ||||
| .IP CURLOPT_HTTP200ALIASES | ||||
| Pass a pointer to a linked list of aliases to be treated as valid HTTP 200 | ||||
| responses.  Some servers respond with a custom header response line.  For | ||||
| @@ -1605,7 +1675,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 | ||||
| @@ -1614,6 +1685,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 | ||||
| @@ -1631,6 +1705,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 | ||||
| @@ -1651,12 +1731,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 | ||||
| @@ -2028,35 +2114,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. | ||||
| Pass a pointer to a zero terminated string as parameter. | ||||
|  | ||||
| Please don't perform this at will, on HTTP based requests, by making sure | ||||
| your server supports the command you are sending first. | ||||
|   | ||||
| 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 | ||||
| @@ -2066,7 +2149,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 | ||||
| @@ -2088,6 +2199,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) | ||||
|  | ||||
| @@ -2100,6 +2213,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 | ||||
| @@ -2183,12 +2301,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 | ||||
| @@ -2293,7 +2417,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 | ||||
| @@ -2364,7 +2490,7 @@ prefix, in order to avoid confusion with a nickname. | ||||
| 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", except | ||||
| with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport | ||||
| (on iOS 5 or later, or OS X 10.6 or later) also support "P12" for | ||||
| (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 | ||||
| @@ -2391,6 +2517,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 | ||||
| @@ -2410,6 +2550,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 | ||||
| @@ -2417,11 +2559,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. | ||||
| @@ -2522,9 +2670,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. | ||||
| @@ -2534,14 +2683,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 | ||||
| @@ -2646,6 +2795,14 @@ known_host matching has been done, to allow the application to act and decide | ||||
| for libcurl how to proceed. The callback will only be called if | ||||
| \fICURLOPT_SSH_KNOWNHOSTS\fP is also set. | ||||
|  | ||||
| .nf | ||||
| int curl_sshkeycallback (CURL *easy,     /* easy handle */ | ||||
|                          const struct curl_khkey *knownkey, /* known */ | ||||
|                          const struct curl_khkey *foundkey, /* found */ | ||||
|                          enum curl_khmatch, /* libcurl's view on the keys */ | ||||
|                          void *clientp); | ||||
| .fi | ||||
|  | ||||
| The curl_sshkeycallback function gets passed the CURL handle, the key from the | ||||
| known_hosts file, the key from the remote site, info from libcurl on the | ||||
| matching status and a custom pointer (set with \fICURLOPT_SSH_KEYDATA\fP). It | ||||
|   | ||||
| @@ -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 - 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 | ||||
| @@ -33,8 +33,10 @@ 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 | ||||
|   | ||||
| @@ -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 - 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 | ||||
| @@ -29,22 +29,21 @@ 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 for a single specific 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 will | ||||
| be used on every repeated use of this handle until you either call the | ||||
| function again and change the option, or you reset them all with | ||||
| \fIcurl_easy_reset(3)\fP. | ||||
| 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. | ||||
| @@ -98,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 | ||||
| @@ -115,8 +116,8 @@ 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 | ||||
|   | ||||
| @@ -193,6 +193,8 @@ CURLFTP_CREATE_DIR_RETRY        7.19.4 | ||||
| CURLGSSAPI_DELEGATION_FLAG      7.22.0 | ||||
| CURLGSSAPI_DELEGATION_NONE      7.22.0 | ||||
| CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0 | ||||
| CURLHEADER_SEPARATE             7.37.0 | ||||
| CURLHEADER_UNIFIED              7.37.0 | ||||
| CURLINFO_APPCONNECT_TIME        7.19.0 | ||||
| CURLINFO_CERTINFO               7.19.1 | ||||
| CURLINFO_CONDITION_UNMET        7.19.4 | ||||
| @@ -250,6 +252,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 | ||||
| @@ -340,6 +343,7 @@ 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 | ||||
| @@ -368,6 +372,7 @@ CURLOPT_GSSAPI_DELEGATION       7.22.0 | ||||
| CURLOPT_HEADER                  7.1 | ||||
| CURLOPT_HEADERDATA              7.10 | ||||
| CURLOPT_HEADERFUNCTION          7.7.2 | ||||
| CURLOPT_HEADEROPT               7.37.0 | ||||
| CURLOPT_HTTP200ALIASES          7.10.3 | ||||
| CURLOPT_HTTPAUTH                7.10.6 | ||||
| CURLOPT_HTTPGET                 7.8.1 | ||||
| @@ -394,6 +399,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 | ||||
| @@ -436,6 +442,7 @@ CURLOPT_PROGRESSFUNCTION        7.1           7.32.0 | ||||
| CURLOPT_PROTOCOLS               7.19.4 | ||||
| CURLOPT_PROXY                   7.1 | ||||
| CURLOPT_PROXYAUTH               7.10.7 | ||||
| CURLOPT_PROXYHEADER             7.37.0 | ||||
| CURLOPT_PROXYPASSWORD           7.19.1 | ||||
| CURLOPT_PROXYPORT               7.1 | ||||
| CURLOPT_PROXYTYPE               7.10 | ||||
| @@ -496,6 +503,8 @@ CURLOPT_SSLVERSION              7.1 | ||||
| CURLOPT_SSL_CIPHER_LIST         7.9 | ||||
| CURLOPT_SSL_CTX_DATA            7.10.6 | ||||
| CURLOPT_SSL_CTX_FUNCTION        7.10.6 | ||||
| CURLOPT_SSL_ENABLE_ALPN         7.36.0 | ||||
| CURLOPT_SSL_ENABLE_NPN          7.36.0 | ||||
| CURLOPT_SSL_OPTIONS             7.25.0 | ||||
| CURLOPT_SSL_SESSIONID_CACHE     7.16.0 | ||||
| CURLOPT_SSL_VERIFYHOST          7.8.1 | ||||
| @@ -593,6 +602,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 | ||||
| @@ -695,6 +714,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 | ||||
|   | ||||
| @@ -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,17 +20,18 @@ | ||||
| .\" * | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .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 | ||||
| mk-ca-bundle [bilnqtuv] | ||||
| mk-ca-bundle [bilnpqstuv] | ||||
| .I [outputfile] | ||||
| .SH DESCRIPTION | ||||
| The mk-ca-bundle tool downloads the certdata.txt file from Mozilla's source | ||||
| tree over HTTP, then parses certdata.txt and extracts CA Root Certificates | ||||
| into PEM format.  These are then processed with the OpenSSL commandline tool | ||||
| to produce the final ca-bundle file. | ||||
| tree over HTTP, then parses certdata.txt and extracts certificates | ||||
| into PEM format.  By default, only CA root certificates trusted to issue SSL | ||||
| server authentication certificates are extracted. These are then processed with | ||||
| the OpenSSL commandline tool to produce the final ca-bundle file. | ||||
|  | ||||
| The default \fIoutputfile\fP name is \fBca-bundle.crt\fP. By setting it to '-' | ||||
| (a single dash) you will get the output sent to STDOUT instead of a file. | ||||
| @@ -42,6 +43,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 | ||||
| @@ -50,10 +55,40 @@ print version info about used modules | ||||
| print license info about certdata.txt | ||||
| .IP -n | ||||
| no download of certdata.txt (to use existing) | ||||
| .IP "-p [purposes]:[levels]" | ||||
| list of Mozilla trust purposes and levels for certificates to include in output. | ||||
| Takes the form of a comma separated list of purposes, a colon, and a comma | ||||
| separated list of levels. The default is to include all certificates trusted | ||||
| to issue SSL Server certificates (SERVER_AUTH:TRUSTED_DELEGATOR). | ||||
|  | ||||
| (Added in version 1.21, Perl only) | ||||
|  | ||||
| Valid purposes are: | ||||
| .RS | ||||
| ALL, DIGITAL_SIGNATURE, NON_REPUDIATION, KEY_ENCIPHERMENT, | ||||
| DATA_ENCIPHERMENT, KEY_AGREEMENT, KEY_CERT_SIGN, CRL_SIGN, | ||||
| SERVER_AUTH (default), CLIENT_AUTH, CODE_SIGNING, EMAIL_PROTECTION, | ||||
| IPSEC_END_SYSTEM, IPSEC_TUNNEL, IPSEC_USER, TIME_STAMPING, STEP_UP_APPROVED | ||||
| .RE | ||||
|  | ||||
| Valid trust levels are: | ||||
| .RS | ||||
| ALL, TRUSTED_DELEGATOR (default), NOT_TRUSTED, MUST_VERIFY_TRUST, TRUSTED | ||||
| .RE | ||||
| .IP -q | ||||
| be really quiet (no progress output at all) | ||||
| .IP -t | ||||
| include plain text listing of certificates | ||||
| .IP "-s [algorithms]" | ||||
| comma separated list of signature algorithms with which to hash/fingerprint | ||||
| each certificate and output when run in plain text mode. | ||||
|  | ||||
| (Added in version 1.21, Perl only) | ||||
|  | ||||
| Valid algorithms are: | ||||
| .RS | ||||
| ALL, NONE, MD5 (default), SHA1, SHA256, SHA512 | ||||
| .RE | ||||
| .IP -u | ||||
| unlink (remove) certdata.txt after processing | ||||
| .IP -v | ||||
|   | ||||
| @@ -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 | ||||
| @@ -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 | ||||
| @@ -754,6 +754,10 @@ typedef enum { | ||||
|   CURLFTPMETHOD_LAST       /* not an option, never use */ | ||||
| } curl_ftpmethod; | ||||
|  | ||||
| /* bitmask defines for CURLOPT_HEADEROPT */ | ||||
| #define CURLHEADER_UNIFIED  0 | ||||
| #define CURLHEADER_SEPARATE (1<<0) | ||||
|  | ||||
| /* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ | ||||
| #define CURLPROTO_HTTP   (1<<0) | ||||
| #define CURLPROTO_HTTPS  (1<<1) | ||||
| @@ -827,10 +831,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. */ | ||||
| @@ -903,7 +907,8 @@ typedef enum { | ||||
|   /* Set cookie in request: */ | ||||
|   CINIT(COOKIE, OBJECTPOINT, 22), | ||||
|  | ||||
|   /* This points to a linked list of headers, struct curl_slist kind */ | ||||
|   /* This points to a linked list of headers, struct curl_slist kind. This | ||||
|      list is also used for RTSP (in spite of its name) */ | ||||
|   CINIT(HTTPHEADER, OBJECTPOINT, 23), | ||||
|  | ||||
|   /* This points to a linked list of post entries, struct curl_httppost */ | ||||
| @@ -1388,8 +1393,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. */ | ||||
| @@ -1569,6 +1573,26 @@ typedef enum { | ||||
|    * 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), | ||||
|  | ||||
|   /* This points to a linked list of headers used for proxy requests only, | ||||
|      struct curl_slist kind */ | ||||
|   CINIT(PROXYHEADER, OBJECTPOINT, 228), | ||||
|  | ||||
|   /* Pass in a bitmask of "header options" */ | ||||
|   CINIT(HEADEROPT, LONG, 229), | ||||
|  | ||||
|   CURLOPT_LASTENTRY /* the last unused */ | ||||
| } CURLoption; | ||||
|  | ||||
| @@ -1659,9 +1683,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 */ | ||||
| }; | ||||
| @@ -1980,6 +2007,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 | ||||
| @@ -2031,9 +2080,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 | ||||
|   | ||||
| @@ -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.33.0-DEV" | ||||
| #define LIBCURL_VERSION "7.37.0-DEV" | ||||
|  | ||||
| /* The numeric version number is also available "in parts" by using these | ||||
|    defines: */ | ||||
| #define LIBCURL_VERSION_MAJOR 7 | ||||
| #define LIBCURL_VERSION_MINOR 33 | ||||
| #define LIBCURL_VERSION_MINOR 37 | ||||
| #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 0x072100 | ||||
| #define LIBCURL_VERSION_NUM 0x072500 | ||||
|  | ||||
| /* | ||||
|  * 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 | ||||
| @@ -269,6 +269,7 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist, | ||||
|    (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 */ | ||||
|   | ||||
| @@ -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 | ||||
| !  loaddll wlink   wlinkd | ||||
| !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 | ||||
|   | ||||
| @@ -49,9 +49,9 @@ CC_FLAGS = -5 -O2 -tWM -w -w-aus -w-ccc -w-dup -w-prc -w-pro -w-rch -w-sig -w-sp | ||||
| LIBFLAGS = /C /P32 | ||||
| LDFLAGS  = -q -lq -laa -tWD | ||||
|  | ||||
| SRCDIR   = . | ||||
| SRCDIR   = .;.\vtls | ||||
| OBJDIR   = .\BCC_objs | ||||
| INCDIRS  = -I.;..\include | ||||
| INCDIRS  = -I.;.\lib;..\include | ||||
| LINKLIB  = $(BCCDIR)\lib\cw32mt.lib $(BCCDIR)\lib\ws2_32.lib | ||||
| DEFINES  = -DNDEBUG -DWIN32 -DBUILDING_LIBCURL | ||||
|  | ||||
| @@ -94,10 +94,11 @@ LINKLIB  = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\l | ||||
| # build source files with hyphens in their name as objects with underscores | ||||
| # using explicit compilation build rules instead of implicit ones. | ||||
|  | ||||
| NOHYPHEN = $(CSOURCES:-=_) | ||||
| NOHYPHEN1 = $(CSOURCES:-=_) | ||||
| NOHYPHEN2 = $(NOHYPHEN1:vtls/=) | ||||
|  | ||||
| OBJECTS = $(NOHYPHEN:.c=.obj) | ||||
| PREPROCESSED = $(NOHYPHEN:.c=.int) | ||||
| OBJECTS = $(NOHYPHEN2:.c=.obj) | ||||
| PREPROCESSED = $(NOHYPHEN2:.c=.int) | ||||
|  | ||||
| # Borland's command line compiler (BCC32) version 5.5.1 integrated | ||||
| # preprocessor has a bug which results in silently generating wrong | ||||
|   | ||||
							
								
								
									
										112
									
								
								lib/Makefile.inc
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								lib/Makefile.inc
									
									
									
									
									
								
							| @@ -1,49 +1,71 @@ | ||||
| # ./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 - 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. | ||||
| # | ||||
| ########################################################################### | ||||
|  | ||||
| CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c	\ | ||||
| LIB_VTLS_CFILES = 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 | ||||
|  | ||||
| LIB_VTLS_HFILES = 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 | ||||
|  | ||||
| LIB_CFILES = 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      	\ | ||||
|   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 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 dotdot.c x509asn1.c      \ | ||||
|   gskit.c http2.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 curl_sasl_sspi.c | ||||
|  | ||||
| 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 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 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 dotdot.h x509asn1.h gskit.h	\ | ||||
|   http2.h | ||||
| LIB_HFILES = 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 | ||||
|  | ||||
| LIB_RCFILES = libcurl.rc | ||||
|  | ||||
| CSOURCES = $(LIB_CFILES) $(LIB_VTLS_CFILES) | ||||
| HHEADERS = $(LIB_HFILES) $(LIB_VTLS_HFILES) | ||||
|   | ||||
| @@ -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 | ||||
| @@ -165,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 | ||||
|  | ||||
| @@ -530,6 +542,7 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\curl_ntlm_wb.obj \ | ||||
| 	$(DIROBJ)\curl_rtmp.obj \ | ||||
| 	$(DIROBJ)\curl_sasl.obj \ | ||||
| 	$(DIROBJ)\curl_sasl_sspi.obj \ | ||||
| 	$(DIROBJ)\curl_schannel.obj \ | ||||
| 	$(DIROBJ)\curl_sspi.obj \ | ||||
| 	$(DIROBJ)\curl_threads.obj \ | ||||
| @@ -601,8 +614,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 \ | ||||
| @@ -641,6 +654,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 \ | ||||
|   | ||||
| @@ -1,28 +1,73 @@ | ||||
|  | ||||
| HTTP2 with libcurl | ||||
|  | ||||
|  Spec: http://tools.ietf.org/html/draft-ietf-httpbis-http2-06 | ||||
|  Spec: http://tools.ietf.org/html/draft-ietf-httpbis-http2 | ||||
|  | ||||
|  Build prerequisites | ||||
|   - nghttp2 | ||||
|   - OpenSSL or NSS or GnutTLS with a new enough version | ||||
|  | ||||
|  nghttp2 (https://github.com/tatsuhiro-t/nghttp2) | ||||
|  | ||||
|   We're depending on this 3rd party library for the actual low level protocol | ||||
|   handling parts. The reason for this is that HTTP2 is much more complex at | ||||
|   that layer than HTTP1.1 (which we implement on our own) and that nghttp2 is | ||||
|   an already existing and well functional library. | ||||
|   libcurl uses this 3rd party library for the low level protocol handling | ||||
|   parts. The reason for this is that HTTP2 is much more complex at that layer | ||||
|   than HTTP1.1 (which we implement on our own) and that nghttp2 is an already | ||||
|   existing and well functional library. | ||||
|  | ||||
|   Right now, nghttp2 implements http2 draft-09 | ||||
|  | ||||
|   We require at least version 0.3.0 | ||||
|  | ||||
|  Over an http:// URL | ||||
|  | ||||
|   If CURLOPT_HTTP_VERSION is set to CURL_HTTP_VERSION_2, libcurl will include | ||||
|   an upgrade header in the initial request to the host to allow upgrading to | ||||
|   http2. Possibly introduce an option that will cause libcurl to fail if not | ||||
|   possible to upgrade. Possibly introduce an option that makes libcurl use | ||||
|   http2 at once over http:// | ||||
|   http2. | ||||
|  | ||||
|   Possibly we can later introduce an option that will cause libcurl to fail if | ||||
|   not possible to upgrade. Possibly we introduce an option that makes libcurl | ||||
|   use http2 at once over http:// | ||||
|  | ||||
|  Over an https:// URL | ||||
|  | ||||
|   If CURLOPT_HTTP_VERSION is set to CURL_HTTP_VERSION_2, libcurl will use ALPN | ||||
|   (or NPN) to negotiate which protocol to continue with. Possibly introduce an | ||||
|   option that will cause libcurl to fail if not possible to use http2. | ||||
|   Consider options to explicitly disable ALPN and/or NPN. | ||||
|  | ||||
|   ALPN is the TLS extension that http2 is expected to use. The NPN extension | ||||
|   is for a similar purpose, was made prior to ALPN and is used for SPDY so | ||||
|   early http2 servers are implemented using NPN before ALPN support is | ||||
|   widespread. | ||||
|  | ||||
| SSL libs | ||||
|  | ||||
|   The challenge is the ALPN and NPN support and all our different SSL | ||||
|   backends. You may need a fairly updated SSL library version for it to | ||||
|   provide the necessary TLS features. Right now we support: | ||||
|  | ||||
|     OpenSSL: ALPN and NPN | ||||
|     NSS:     ALPN and NPN | ||||
|     GnuTLS:  ALPN | ||||
|  | ||||
| Alt-Svc | ||||
|  | ||||
|   Alt-Svc is a suggested new header with a corresponding frame (ALTSVC) in | ||||
|   http2 that tells the client about an alternative "route" to the same content | ||||
|   for the same origin server that you get the response from. A browser or | ||||
|   long-living client can use that hint to create a new connection | ||||
|   asynchronously.  For libcurl, we may introduce a way to bring such clues to | ||||
|   the applicaton and/or let a subsequent request use the alternate route | ||||
|   automatically. | ||||
|  | ||||
| Applications | ||||
|  | ||||
|   We hide http2's binary nature and convert received http2 traffic to headers | ||||
|   in HTTP 1.1 style. This allows applications to work unmodified. | ||||
|  | ||||
| curl tool | ||||
|  | ||||
|   curl offers the --http2 command line option to enable use of http2 | ||||
|  | ||||
| To consider: | ||||
|  | ||||
|   | ||||
| @@ -645,10 +645,10 @@ CURLcode Curl_set_dns_local_ip4(struct SessionHandle *data, | ||||
|                                 const char *local_ip4) | ||||
| { | ||||
| #if (ARES_VERSION >= 0x010704) | ||||
|   uint32_t a4; | ||||
|   struct in_addr a4; | ||||
|  | ||||
|   if((!local_ip4) || (local_ip4[0] == 0)) { | ||||
|     a4 = 0; /* disabled: do not bind to a specific address */ | ||||
|     a4.s_addr = 0; /* disabled: do not bind to a specific address */ | ||||
|   } | ||||
|   else { | ||||
|     if(Curl_inet_pton(AF_INET, local_ip4, &a4) != 1) { | ||||
| @@ -656,7 +656,7 @@ CURLcode Curl_set_dns_local_ip4(struct SessionHandle *data, | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   ares_set_local_ip4((ares_channel)data->state.resolver, ntohl(a4)); | ||||
|   ares_set_local_ip4((ares_channel)data->state.resolver, ntohl(a4.s_addr)); | ||||
|  | ||||
|   return CURLE_OK; | ||||
| #else /* c-ares version too old! */ | ||||
|   | ||||
| @@ -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 | ||||
| @@ -209,7 +209,7 @@ int init_thread_sync_data(struct thread_sync_data * tsd, | ||||
|   memset(tsd, 0, sizeof(*tsd)); | ||||
|  | ||||
|   tsd->port = port; | ||||
| #ifdef CURLRES_IPV6 | ||||
| #ifdef HAVE_GETADDRINFO | ||||
|   DEBUGASSERT(hints); | ||||
|   tsd->hints = *hints; | ||||
| #else | ||||
|   | ||||
							
								
								
									
										109
									
								
								lib/base64.c
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								lib/base64.c
									
									
									
									
									
								
							| @@ -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 | ||||
| @@ -40,29 +40,45 @@ | ||||
| static const char table64[]= | ||||
|   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||||
|  | ||||
| static void decodeQuantum(unsigned char *dest, const char *src) | ||||
| static size_t decodeQuantum(unsigned char *dest, const char *src) | ||||
| { | ||||
|   size_t padding = 0; | ||||
|   const char *s, *p; | ||||
|   unsigned long i, v, x = 0; | ||||
|  | ||||
|   for(i = 0, s = src; i < 4; i++, s++) { | ||||
|     v = 0; | ||||
|     p = table64; | ||||
|     while(*p && (*p != *s)) { | ||||
|       v++; | ||||
|       p++; | ||||
|     } | ||||
|     if(*p == *s) | ||||
|       x = (x << 6) + v; | ||||
|     else if(*s == '=') | ||||
|  | ||||
|     if(*s == '=') { | ||||
|       x = (x << 6); | ||||
|       padding++; | ||||
|     } | ||||
|     else { | ||||
|       p = table64; | ||||
|  | ||||
|       while(*p && (*p != *s)) { | ||||
|         v++; | ||||
|         p++; | ||||
|       } | ||||
|  | ||||
|       if(*p == *s) | ||||
|         x = (x << 6) + v; | ||||
|       else | ||||
|         return 0; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   dest[2] = curlx_ultouc(x & 0xFFUL); | ||||
|   if(padding < 1) | ||||
|     dest[2] = curlx_ultouc(x & 0xFFUL); | ||||
|  | ||||
|   x >>= 8; | ||||
|   dest[1] = curlx_ultouc(x & 0xFFUL); | ||||
|   if(padding < 2) | ||||
|     dest[1] = curlx_ultouc(x & 0xFFUL); | ||||
|  | ||||
|   x >>= 8; | ||||
|   dest[0] = curlx_ultouc(x & 0xFFUL); | ||||
|  | ||||
|   return 3 - padding; | ||||
| } | ||||
|  | ||||
| /* | ||||
| @@ -82,58 +98,71 @@ static void decodeQuantum(unsigned char *dest, const char *src) | ||||
| CURLcode Curl_base64_decode(const char *src, | ||||
|                             unsigned char **outptr, size_t *outlen) | ||||
| { | ||||
|   size_t srclen = 0; | ||||
|   size_t length = 0; | ||||
|   size_t equalsTerm = 0; | ||||
|   size_t padding = 0; | ||||
|   size_t i; | ||||
|   size_t result; | ||||
|   size_t numQuantums; | ||||
|   unsigned char lastQuantum[3]; | ||||
|   size_t rawlen = 0; | ||||
|   unsigned char *pos; | ||||
|   unsigned char *newstr; | ||||
|  | ||||
|   *outptr = NULL; | ||||
|   *outlen = 0; | ||||
|   srclen = strlen(src); | ||||
|  | ||||
|   /* Check the length of the input string is valid */ | ||||
|   if(!srclen || srclen % 4) | ||||
|     return CURLE_BAD_CONTENT_ENCODING; | ||||
|  | ||||
|   /* Find the position of any = padding characters */ | ||||
|   while((src[length] != '=') && src[length]) | ||||
|     length++; | ||||
|  | ||||
|   /* A maximum of two = padding characters is allowed */ | ||||
|   if(src[length] == '=') { | ||||
|     equalsTerm++; | ||||
|     if(src[length+equalsTerm] == '=') | ||||
|       equalsTerm++; | ||||
|     padding++; | ||||
|     if(src[length + 1] == '=') | ||||
|       padding++; | ||||
|   } | ||||
|   numQuantums = (length + equalsTerm) / 4; | ||||
|  | ||||
|   /* Don't allocate a buffer if the decoded length is 0 */ | ||||
|   if(numQuantums == 0) | ||||
|     return CURLE_OK; | ||||
|   /* Check the = padding characters weren't part way through the input */ | ||||
|   if(length + padding != srclen) | ||||
|     return CURLE_BAD_CONTENT_ENCODING; | ||||
|  | ||||
|   rawlen = (numQuantums * 3) - equalsTerm; | ||||
|   /* Calculate the number of quantums */ | ||||
|   numQuantums = srclen / 4; | ||||
|  | ||||
|   /* The buffer must be large enough to make room for the last quantum | ||||
|   (which may be partially thrown out) and the zero terminator. */ | ||||
|   newstr = malloc(rawlen+4); | ||||
|   /* Calculate the size of the decoded string */ | ||||
|   rawlen = (numQuantums * 3) - padding; | ||||
|  | ||||
|   /* Allocate our buffer including room for a zero terminator */ | ||||
|   newstr = malloc(rawlen + 1); | ||||
|   if(!newstr) | ||||
|     return CURLE_OUT_OF_MEMORY; | ||||
|  | ||||
|   *outptr = newstr; | ||||
|   pos = newstr; | ||||
|  | ||||
|   /* Decode all but the last quantum (which may not decode to a | ||||
|   multiple of 3 bytes) */ | ||||
|   for(i = 0; i < numQuantums - 1; i++) { | ||||
|     decodeQuantum(newstr, src); | ||||
|     newstr += 3; src += 4; | ||||
|   /* Decode the quantums */ | ||||
|   for(i = 0; i < numQuantums; i++) { | ||||
|     result = decodeQuantum(pos, src); | ||||
|     if(!result) { | ||||
|       Curl_safefree(newstr); | ||||
|  | ||||
|       return CURLE_BAD_CONTENT_ENCODING; | ||||
|     } | ||||
|  | ||||
|     pos += result; | ||||
|     src += 4; | ||||
|   } | ||||
|  | ||||
|   /* This final decode may actually read slightly past the end of the buffer | ||||
|   if the input string is missing pad bytes.  This will almost always be | ||||
|   harmless. */ | ||||
|   decodeQuantum(lastQuantum, src); | ||||
|   for(i = 0; i < 3 - equalsTerm; i++) | ||||
|     newstr[i] = lastQuantum[i]; | ||||
|   /* Zero terminate */ | ||||
|   *pos = '\0'; | ||||
|  | ||||
|   newstr[i] = '\0'; /* zero terminate */ | ||||
|  | ||||
|   *outlen = rawlen; /* return size of decoded data */ | ||||
|   /* Return the decoded data */ | ||||
|   *outptr = newstr; | ||||
|   *outlen = rawlen; | ||||
|  | ||||
|   return CURLE_OK; | ||||
| } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user