Compare commits
247 Commits
curl-7_36_
...
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 |
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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# 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/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \
|
||||||
CMake/Utilities.cmake include/curl/curlbuild.h.cmake
|
CMake/Utilities.cmake include/curl/curlbuild.h.cmake
|
||||||
|
|
||||||
VC6LIBDSP = vs/vc6/lib/vc6libcurl.dsp
|
VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
|
||||||
VC6LIBDSPHEAD = vs/t/lib/vc6_libcurl_dsp.head
|
VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp
|
||||||
VC6LIBDSPFOOT = vs/t/lib/vc6_libcurl_dsp.foot
|
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
|
VC7_LIBTMPL = projects/Windows/VC7/lib/libcurl.tmpl
|
||||||
VC8LIBPRJHEAD = vs/t/lib/vc8_libcurl_prj.head
|
VC7_LIBVCPROJ = projects/Windows/VC7/lib/libcurl.vcproj
|
||||||
VC8LIBPRJFOOT = vs/t/lib/vc8_libcurl_prj.foot
|
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 = \
|
VC71_LIBTMPL = projects/Windows/VC7.1/lib/libcurl.tmpl
|
||||||
vs/t/README \
|
VC71_LIBVCPROJ = projects/Windows/VC7.1/lib/libcurl.vcproj
|
||||||
$(VC6LIBDSP) $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \
|
VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc
|
||||||
$(VC8LIBPRJ) $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \
|
VC71_SRCTMPL = projects/Windows/VC7.1/src/curlsrc.tmpl
|
||||||
vs/vc6/vc6curl.dsw \
|
VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curlsrc.vcproj
|
||||||
vs/vc6/lib/vc6libcurl.dsw \
|
VC71_SRCVCPROJ_DEPS = $(VC71_SRCTMPL) Makefile.am src/Makefile.inc
|
||||||
vs/vc6/src/vc6curltool.dsw \
|
|
||||||
vs/vc6/src/vc6curltool.dsp
|
|
||||||
|
|
||||||
VC6LIBDSP_DEPS = $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \
|
VC8_LIBTMPL = projects/Windows/VC8/lib/libcurl.tmpl
|
||||||
Makefile.am lib/Makefile.inc
|
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) \
|
VC9_LIBTMPL = projects/Windows/VC9/lib/libcurl.tmpl
|
||||||
Makefile.am lib/Makefile.inc
|
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_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
|
||||||
winbuild/MakefileBuild.vc winbuild/Makefile.vc \
|
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 \
|
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
|
||||||
$(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in
|
$(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
|
bin_SCRIPTS = curl-config
|
||||||
|
|
||||||
@@ -71,11 +134,9 @@ DIST_SUBDIRS = $(SUBDIRS) tests packages docs
|
|||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libcurl.pc
|
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
|
include lib/Makefile.inc
|
||||||
|
include src/Makefile.inc
|
||||||
WIN32SOURCES = $(CSOURCES)
|
|
||||||
WIN32HEADERS = $(HHEADERS) config-win32.h
|
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
rm -rf $(top_builddir)/tests/log
|
rm -rf $(top_builddir)/tests/log
|
||||||
@@ -187,96 +248,249 @@ uninstall-hook:
|
|||||||
cd docs && $(MAKE) uninstall
|
cd docs && $(MAKE) uninstall
|
||||||
|
|
||||||
ca-bundle: lib/mk-ca-bundle.pl
|
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
|
@perl $< -b -l -u lib/ca-bundle.crt
|
||||||
|
|
||||||
ca-firefox: lib/firefox-db2pem.sh
|
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
|
./lib/firefox-db2pem.sh lib/ca-bundle.crt
|
||||||
|
|
||||||
checksrc:
|
checksrc:
|
||||||
cd lib && $(MAKE) checksrc
|
cd lib && $(MAKE) checksrc
|
||||||
cd src && $(MAKE) checksrc
|
cd src && $(MAKE) checksrc
|
||||||
|
|
||||||
.PHONY: vc6-ide
|
.PHONY: vc-ide
|
||||||
|
|
||||||
vc6-ide:
|
vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
|
||||||
$(MAKE) $(VC6LIBDSP)
|
$(VC7_SRCVCPROJ_DEPS) $(VC71_LIBVCPROJ_DEPS) $(VC71_SRCVCPROJ_DEPS) \
|
||||||
|
$(VC8_LIBVCPROJ_DEPS) $(VC8_SRCVCPROJ_DEPS) $(VC9_LIBVCPROJ_DEPS) \
|
||||||
$(VC6LIBDSP): $(VC6LIBDSP_DEPS)
|
$(VC9_SRCVCPROJ_DEPS) $(VC10_LIBVCXPROJ_DEPS) $(VC10_SRCVCXPROJ_DEPS) \
|
||||||
@(echo "generating '$(VC6LIBDSP)'"; \
|
$(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 \
|
sorted_lib_srcs=`for file in $$win32_lib_srcs; do echo $$file; done | sort`; \
|
||||||
test -d "$$dir" || mkdir "$$dir" || exit 1; \
|
sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done | sort`; \
|
||||||
done; \
|
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\'; \
|
awk_code='\
|
||||||
body='$(VC6LIBDSP)'.body; \
|
function gen_element(type, dir, file)\
|
||||||
win32_srcs='$(WIN32SOURCES)'; \
|
{\
|
||||||
win32_hdrs='$(WIN32HEADERS)'; \
|
sub(/vtls\//, "", file);\
|
||||||
sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \
|
\
|
||||||
sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \
|
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 "generating '$(VC6_LIBDSP)'"; \
|
||||||
echo "" >> $$body; \
|
awk -v proj_type=dsp \
|
||||||
echo "# PROP Default_Filter \"\"" >> $$body; \
|
-v lib_srcs="$$sorted_lib_srcs" \
|
||||||
for file in $$sorted_srcs; do \
|
-v lib_hdrs="$$sorted_lib_hdrs" \
|
||||||
echo "# Begin Source File" >> $$body; \
|
-v lib_rc="$$win32_lib_rc" \
|
||||||
echo "" >> $$body; \
|
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
|
||||||
echo "SOURCE="$$dir$$file >> $$body; \
|
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
|
||||||
echo "# End Source File" >> $$body; \
|
"$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \
|
||||||
done; \
|
|
||||||
echo "# End Group" >> $$body; \
|
|
||||||
echo "# Begin Group \"Header Files\"" >> $$body; \
|
|
||||||
echo "" >> $$body; \
|
|
||||||
echo "# PROP Default_Filter \"\"" >> $$body; \
|
|
||||||
for file in $$sorted_hdrs; do \
|
|
||||||
echo "# Begin Source File" >> $$body; \
|
|
||||||
echo "" >> $$body; \
|
|
||||||
echo "SOURCE="$$dir$$file >> $$body; \
|
|
||||||
echo "# End Source File" >> $$body; \
|
|
||||||
done; \
|
|
||||||
echo "# End Group" >> $$body; \
|
|
||||||
\
|
\
|
||||||
awk '{ printf("%s\r\n", $$0); }' \
|
echo "generating '$(VC6_SRCDSP)'"; \
|
||||||
$(srcdir)/$(VC6LIBDSPHEAD) $$body $(srcdir)/$(VC6LIBDSPFOOT) \
|
awk -v proj_type=dsp \
|
||||||
> $(VC6LIBDSP) || { rm -f $$body; exit 1; }; \
|
-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)
|
echo "generating '$(VC7_LIBVCPROJ)'"; \
|
||||||
|
awk -v proj_type=vcproj1 \
|
||||||
.PHONY: vc8-ide
|
-v lib_srcs="$$sorted_lib_srcs" \
|
||||||
|
-v lib_hdrs="$$sorted_lib_hdrs" \
|
||||||
vc8-ide:
|
-v lib_rc="$$win32_lib_rc" \
|
||||||
$(MAKE) $(VC8LIBPRJ)
|
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
|
||||||
|
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
|
||||||
$(VC8LIBPRJ): $(VC8LIBPRJ_DEPS)
|
"$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \
|
||||||
@(echo "generating '$(VC8LIBPRJ)'"; \
|
|
||||||
\
|
\
|
||||||
for dir in 'vs' 'vs/vc8' 'vs/vc8/lib'; do \
|
echo "generating '$(VC7_SRCVCPROJ)'"; \
|
||||||
test -d "$$dir" || mkdir "$$dir" || exit 1; \
|
awk -v proj_type=vcproj1 \
|
||||||
done; \
|
-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\'; \
|
echo "generating '$(VC71_LIBVCPROJ)'"; \
|
||||||
body='$(VC8LIBPRJ)'.body; \
|
awk -v proj_type=vcproj1 \
|
||||||
win32_srcs='$(WIN32SOURCES)'; \
|
-v lib_srcs="$$sorted_lib_srcs" \
|
||||||
win32_hdrs='$(WIN32HEADERS)'; \
|
-v lib_hdrs="$$sorted_lib_hdrs" \
|
||||||
sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \
|
-v lib_rc="$$win32_lib_rc" \
|
||||||
sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \
|
-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; \
|
echo "generating '$(VC71_SRCVCPROJ)'"; \
|
||||||
for file in $$sorted_srcs; do \
|
awk -v proj_type=vcproj1 \
|
||||||
echo "%tab%%tab%%tab%<File RelativePath=\""$$dir$$file"\"></File>" >> $$body; \
|
-v src_srcs="$$sorted_src_srcs" \
|
||||||
done; \
|
-v src_hdrs="$$sorted_src_hdrs" \
|
||||||
echo "%tab%%tab%</Filter>" >> $$body; \
|
-v src_rc="$$win32_src_rc" \
|
||||||
echo "%tab%%tab%<Filter Name=\"Header Files\">" >> $$body; \
|
"$$awk_code" $(srcdir)/$(VC71_SRCTMPL) > $(VC71_SRCVCPROJ) || { exit 1; }; \
|
||||||
for file in $$sorted_hdrs; do \
|
|
||||||
echo "%tab%%tab%%tab%<File RelativePath=\""$$dir$$file"\"></File>" >> $$body; \
|
|
||||||
done; \
|
|
||||||
echo "%tab%%tab%</Filter>" >> $$body; \
|
|
||||||
\
|
\
|
||||||
awk '{ gsub(/%tab%/, "\t"); printf("%s\r\n", $$0); }' \
|
echo "generating '$(VC8_LIBVCPROJ)'"; \
|
||||||
$(srcdir)/$(VC8LIBPRJHEAD) $$body $(srcdir)/$(VC8LIBPRJFOOT) \
|
awk -v proj_type=vcproj2 \
|
||||||
> $(VC8LIBPRJ) || { rm -f $$body; exit 1; }; \
|
-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; };)
|
||||||
|
205
RELEASE-NOTES
205
RELEASE-NOTES
@@ -1,86 +1,87 @@
|
|||||||
Curl and libcurl 7.36.0
|
Curl and libcurl 7.37.0
|
||||||
|
|
||||||
Public curl releases: 138
|
Public curl releases: 139
|
||||||
Command line options: 161
|
Command line options: 161
|
||||||
curl_easy_setopt() options: 206
|
curl_easy_setopt() options: 206
|
||||||
Public functions in libcurl: 58
|
Public functions in libcurl: 58
|
||||||
Known libcurl bindings: 42
|
Contributors: 1137
|
||||||
Contributors: 1123
|
|
||||||
|
|
||||||
This release includes the following SECURITY ADVISORIES:
|
|
||||||
|
|
||||||
o wrong re-use of connections [16]
|
|
||||||
o IP address wildcard certificate validation [17]
|
|
||||||
o not verifying certs for TLS to IP address / Darwinssl [18]
|
|
||||||
o not verifying certs for TLS to IP address / Winssl [19]
|
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o ntlm: Added support for NTLMv2 [2]
|
o URL parser: IPv6 zone identifiers are now supported
|
||||||
o tool: Added support for URL specific options [3]
|
o CURLOPT_PROXYHEADER: set headers for proxy-only
|
||||||
o openssl: add ALPN support
|
o CURLOPT_HEADEROPT: added
|
||||||
o gtls: add ALPN support
|
o curl: add --proxy-header
|
||||||
o nss: add ALPN and NPN support
|
o sasl: Added support for DIGEST-MD5 via Windows SSPI
|
||||||
o added CURLOPT_EXPECT_100_TIMEOUT_MS [7]
|
o sasl: Added DIGEST-MD5 qop-option validation in native challange handling
|
||||||
o tool: add --no-alpn and --no-npn
|
o imap: Expanded mailbox SEARCH support to use URL query strings [7]
|
||||||
o added CURLOPT_SSL_ENABLE_NPN and CURLOPT_SSL_ENABLE_ALPN
|
o imap: Extended FETCH support to include PARTIAL URL specifier [7]
|
||||||
o winssl: enable TLSv1.1 and TLSv1.2 by default
|
o nss: implement non-blocking SSL handshake
|
||||||
o winssl: TLSv1.2 disables certificate signatures using MD5 hash
|
o build: Reworked Visual Studio project files
|
||||||
o winssl: enable hostname verification of IP address using SAN or CN [11]
|
o poll: enable poll on darwin13
|
||||||
o darwinssl: Don't omit CN verification when an IP address is used [12]
|
o mk-ca-bundle: added -p
|
||||||
o http2: build with current nghttp2 version
|
o libtests: add a wait_ms() function
|
||||||
o polarssl: dropped support for PolarSSL < 1.3.0
|
|
||||||
o openssl: info message with SSL version used
|
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o nss: allow to use ECC ciphers if NSS implements them [1]
|
o mkhelp: generate code for --disable-manual as well [1]
|
||||||
o netrc: Fixed a memory leak in an OOM condition
|
o hostcheck: added a system include to define struct in_addr
|
||||||
o ftp: fixed a memory leak on wildcard error path
|
o winbuild: added warnless.c to fix build
|
||||||
o pipeline: Fixed a NULL pointer dereference on OOM
|
o Makefile.vc6: added warnless.c to fix build
|
||||||
o nss: prefer highest available TLS version
|
o smtp: Fixed login denied when server doesn't support AUTH capability [2]
|
||||||
o 100-continue: fix timeout condition [4]
|
o smtp: Fixed login denied with a RFC-821 based server [2]
|
||||||
o ssh: Fixed a NULL pointer dereference on OOM condition
|
o curl: stop interpreting IPv6 literals as glob patterns
|
||||||
o formpost: use semicolon in multipart/mixed [5]
|
o http2: remove _DRAFT09 from the NPN_HTTP2 enum
|
||||||
o --help: add missing --tlsv1.x options
|
o http2: let openssl mention the exact protocol negotiated
|
||||||
o formdata: Fixed memory leak on OOM condition
|
o http2+openssl: fix compiler warnings in ALPN using code
|
||||||
o ConnectionExists: reusing possible HTTP+NTLM connections better [6]
|
o ftp: in passive data connect wait for happy eyeballs sockets [3]
|
||||||
o mingw32: fix compilation
|
o HTTP: don't send Content-Length: 0 _and_ Expect: 100-continue [4]
|
||||||
o chunked decoder: track overflows correctly [8]
|
o http2: Compile with current nghttp2, which supports h2-11 [5]
|
||||||
o curl_easy_setopt.3: add CURL_HTTP_VERSION_2_0
|
o http_negotiate_sspi: Fixed compilation when USE_HTTP_NEGOTIATE not defined
|
||||||
o dict: fix memory leak in OOM exit path
|
o strerror: fix comment about vxworks' strerror_r buffer size [6]
|
||||||
o valgrind: added suppression on optimized code
|
o url: only use if_nametoindex() if IFNAMSIZ is available
|
||||||
o curl: output protocol headers using binary mode
|
o imap: Fixed untagged response detection when no data after command
|
||||||
o tool: Added URL index to password prompt for multiple operations
|
o various: fix possible dereference of null pointer
|
||||||
o ConnectionExists: re-use non-NTLM connections better [9]
|
o various: fix use of uninitialized variable
|
||||||
o axtls: call ssl_read repeatedly
|
o various: fix use of non-null terminated strings
|
||||||
o multi: make MAXCONNECTS default 4 x number of easy handles function
|
o telnet.c: check sscanf results before passing them to snprintf
|
||||||
o configure: Fix the --disable-crypto-auth option
|
o parsedate.c: check sscanf result before passing it to strlen
|
||||||
o multi: ignore SIGPIPE internally
|
o sockfilt.c: free memory in case of memory allocation errors
|
||||||
o curl.1: update the description of --tlsv1
|
o sockfilt.c: ignore non-key-events and continue waiting for input
|
||||||
o SFTP: skip reading the dir when NOBODY=1 [10]
|
o sockfilt.c: properly handle disk files, pipes and character input
|
||||||
o easy: Fixed a memory leak on OOM condition
|
o sockfilt.c: fixed getting stuck waiting for MinGW stdin pipe
|
||||||
o tool: Fixed incorrect return code when setting HTTP request fails
|
o sockfilt.c: clean up threaded approach and add documentation
|
||||||
o configure: Tiny fix to honor POSIX
|
o configure: use the nghttp2 path correctly with pkg-config [8]
|
||||||
o tool: Do not output libcurl source for the information only parameters
|
o curl_global_init_mem: bump initialized even if already initialized [9]
|
||||||
o Rework Open Watcom make files to use standard Wmake features
|
o gtls: fix NULL pointer dereference [10]
|
||||||
o x509asn: moved out Curl_verifyhost from NSS builds
|
o cyassl: Use error-ssl.h when available
|
||||||
o configure: call it GSS-API
|
o handler: make 'protocol' always specified as a single bit [11]
|
||||||
o hostcheck: Curl_cert_hostcheck is not used by NSS builds
|
o INFILESIZE: fields in UserDefined must not be changed run-time
|
||||||
o multi_runsingle: move timestamp into INIT [13]
|
o openssl: biomem->data is not zero terminated
|
||||||
o remote_port: allow connect to port 0
|
o config-win32.h: Fixed HAVE_LONGLONG for Visual Studio .NET 2003 and up
|
||||||
o parse_remote_port: error out on illegal port numbers better
|
o curl_ntlm_core: Fixed use of long long for VC6 and VC7
|
||||||
o ssh: Pass errors from libssh2_sftp_read up the stack
|
o SNI: strip off a single trailing dot from host name [12]
|
||||||
o docs: remove documentation on setting up krb4 support
|
o curl: bail on cookie use when built with disabled cookies
|
||||||
o polarssl: build fixes to work with PolarSSL 1.3.x
|
o curl_easy_setopt.3: added the proto for CURLOPT_SSH_KNOWNHOSTS
|
||||||
o polarssl: fix possible handshake timeout issue in multi
|
o curl_multi_cleanup: ignore SIGPIPE better [13]
|
||||||
o nss: allow to enable/disable cipher-suites better
|
o schannel: don't use the connect-timeout during send [14]
|
||||||
o ssh: prevent a logic error that could result in an infinite loop
|
o mprintf: allow %.s with data not being zero terminated
|
||||||
o http2: free resources on disconnect
|
o tool_help: Fixed missing --login-options option
|
||||||
o polarssl: avoid extra newlines in debug messages
|
o configure: Don't set LD_LIBRARY_PATH when cross-compiling
|
||||||
o rtsp: parse "Session:" header properly [14]
|
o http: auth failure on duplicated 'WWW-Authenticate: Negotiate' header [15]
|
||||||
o trynextip: don't store 'ai' on failed connects
|
o cacertinmem: fix memory leak [16]
|
||||||
o Curl_cert_hostcheck: strip trailing dots in host name and wildcard
|
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:
|
This release includes the following known bugs:
|
||||||
|
|
||||||
@@ -89,33 +90,41 @@ This release includes the following known bugs:
|
|||||||
This release would not have looked like this without help, code, reports and
|
This release would not have looked like this without help, code, reports and
|
||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
Adam Sampson, Arvid Norberg, Brad Spencer, Colin Hogben, Dan Fandrich,
|
Aaro Koskinen, Cody Mack, Damian Dixon, Dan Fandrich, Daniel Johnson,
|
||||||
Daniel Stenberg, David Ryskalczyk, Fabian Frank, Gaël PORTAY, Gisle Vanem,
|
Daniel Stenberg, David Woodhouse, Dilyan Palauzov, Fabian Frank,
|
||||||
Hubert Kario, Jeff King, Jiri Malak, Kamil Dudka, Maks Naumov, Marc Hoersken,
|
Ivo Bellin Salarin, Jeff King, Jeroen Koekkoek, Jon Torrey, Kamil Dudka,
|
||||||
Michael Osipov, Mike Hasselberg, Nick Zitzmann, Patrick Monnerat, Prash Dush,
|
Larry Lin, Leon Winter, Maciej Puzio, Marc Hoersken, Michael Osipov,
|
||||||
Remi Gacogne, Rob Davies, Romulo A. Ceccon, Shao Shuchao, Steve Holme,
|
Nick Zitzmann, Patrick Watson, Paul Marks, Radu Simionescu, Remi Gacogne,
|
||||||
Tatsuhiro Tsujikawa, Thomas Braun, Tiit Pikma, Yehezkel Horowitz,
|
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)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|
||||||
References to bug reports and discussions on issues:
|
References to bug reports and discussions on issues:
|
||||||
|
|
||||||
[1] = https://bugzilla.redhat.com/1058776
|
[1] = http://curl.haxx.se/bug/view.cgi?id=1350
|
||||||
[2] = http://curl.haxx.se/mail/lib-2014-01/0183.html
|
[2] = http://curl.haxx.se/mail/lib-2014-03/0173.html
|
||||||
[3] = http://curl.haxx.se/mail/archive-2013-11/0006.html
|
[3] = http://curl.haxx.se/mail/lib-2014-02/0135.html (ruined)
|
||||||
[4] = http://curl.haxx.se/bug/view.cgi?id=1334
|
[4] = http://curl.haxx.se/bug/view.cgi?id=1349
|
||||||
[5] = http://curl.haxx.se/bug/view.cgi?id=1333
|
[5] = http://curl.haxx.se/mail/lib-2014-04/0053.html
|
||||||
[6] = http://curl.haxx.se/mail/lib-2014-02/0100.html
|
[6] = http://curl.haxx.se/mail/lib-2014-04/0063.html
|
||||||
[7] = http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTEXPECT100TIMEOUTMS
|
[7] = http://curl.haxx.se/mail/lib-2014-04/0067.html
|
||||||
[8] = http://curl.haxx.se/mail/lib-2014-02/0097.html
|
[8] = http://curl.haxx.se/mail/lib-2014-04/0159.html
|
||||||
[9] = http://thread.gmane.org/gmane.comp.version-control.git/242213
|
[9] = http://curl.haxx.se/bug/view.cgi?id=1362
|
||||||
[10] = http://curl.haxx.se/mail/lib-2014-02/0155.html
|
[10] = http://curl.haxx.se/mail/lib-2014-04/0145.html
|
||||||
[11] = http://curl.haxx.se/mail/lib-2014-02/0243.html
|
[11] = https://github.com/bagder/curl/pull/97
|
||||||
[12] = https://github.com/bagder/curl/pull/93
|
[12] = http://curl.haxx.se/mail/lib-2014-04/0161.html
|
||||||
[13] = http://curl.haxx.se/mail/lib-2014-02/0036.html
|
[13] = http://thread.gmane.org/gmane.comp.version-control.git/238242
|
||||||
[14] = http://curl.haxx.se/mail/lib-2014-03/0134.html
|
[14] = http://curl.haxx.se/bug/view.cgi?id=1352
|
||||||
[15] = http://curl.haxx.se/bug/view.cgi?id=1337
|
[15] = https://bugzilla.redhat.com/1093348
|
||||||
[16] = http://curl.haxx.se/docs/adv_20140326A.html
|
[16] = http://curl.haxx.se/bug/view.cgi?id=1368
|
||||||
[17] = http://curl.haxx.se/docs/adv_20140326B.html
|
[17] = http://curl.haxx.se/mail/lib-2014-05/0081.html
|
||||||
[18] = http://curl.haxx.se/docs/adv_20140326C.html
|
[18] = http://curl.haxx.se/mail/lib-2014-05/0025.html
|
||||||
[19] = http://curl.haxx.se/docs/adv_20140326D.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
|
||||||
|
38
configure.ac
38
configure.ac
@@ -2003,6 +2003,9 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
|
|||||||
dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
|
dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
|
||||||
AC_CHECK_SIZEOF(long long)
|
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"
|
LIBS="-lcyassl -lm $LIBS"
|
||||||
|
|
||||||
if test -n "$cyassllib"; then
|
if test -n "$cyassllib"; then
|
||||||
@@ -2164,10 +2167,11 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
|
|||||||
USE_AXTLS="yes"
|
USE_AXTLS="yes"
|
||||||
curl_ssl_msg="enabled (axTLS)"
|
curl_ssl_msg="enabled (axTLS)"
|
||||||
|
|
||||||
|
if test "x$cross_compiling" != "xyes"; then
|
||||||
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS"
|
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS"
|
||||||
export LD_LIBRARY_PATH
|
export LD_LIBRARY_PATH
|
||||||
AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH])
|
AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH])
|
||||||
|
fi
|
||||||
],[
|
],[
|
||||||
LDFLAGS="$CLEANLDFLAGS"
|
LDFLAGS="$CLEANLDFLAGS"
|
||||||
CPPFLAGS="$CLEANCPPFLAGS"
|
CPPFLAGS="$CLEANCPPFLAGS"
|
||||||
@@ -2699,7 +2703,7 @@ if test "$want_idn" = "yes"; then
|
|||||||
if test "x$ac_cv_header_tld_h" = "xyes"; then
|
if test "x$ac_cv_header_tld_h" = "xyes"; then
|
||||||
AC_SUBST([IDN_ENABLED], [1])
|
AC_SUBST([IDN_ENABLED], [1])
|
||||||
curl_idn_msg="enabled"
|
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"
|
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$IDN_DIR"
|
||||||
export LD_LIBRARY_PATH
|
export LD_LIBRARY_PATH
|
||||||
AC_MSG_NOTICE([Added $IDN_DIR to LD_LIBRARY_PATH])
|
AC_MSG_NOTICE([Added $IDN_DIR to LD_LIBRARY_PATH])
|
||||||
@@ -2737,13 +2741,12 @@ AC_HELP_STRING([--without-nghttp2],[Disable nghttp2 usage]),
|
|||||||
case "$OPT_H2" in
|
case "$OPT_H2" in
|
||||||
no)
|
no)
|
||||||
dnl --without-nghttp2 option used
|
dnl --without-nghttp2 option used
|
||||||
want_idn="no"
|
want_h2="no"
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
;;
|
;;
|
||||||
default)
|
default)
|
||||||
dnl configure option not specified
|
dnl configure option not specified
|
||||||
want_h2="no"
|
want_h2="no"
|
||||||
want_h2_path="default"
|
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
;;
|
;;
|
||||||
yes)
|
yes)
|
||||||
@@ -2755,31 +2758,30 @@ case "$OPT_H2" in
|
|||||||
*)
|
*)
|
||||||
dnl --with-nghttp2 option used with path
|
dnl --with-nghttp2 option used with path
|
||||||
want_h2="yes"
|
want_h2="yes"
|
||||||
want_h2_path="$withval"
|
want_h2_path="$withval/lib/pkgconfig"
|
||||||
AC_MSG_RESULT([yes ($withval)])
|
AC_MSG_RESULT([yes ($withval)])
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
curl_h2_msg="disabled (--with-nghttp2)"
|
curl_h2_msg="disabled (--with-nghttp2)"
|
||||||
if test X"$OPT_H2" != Xno; then
|
if test X"$want_h2" != Xno; then
|
||||||
dnl backup the pre-librtmp variables
|
dnl backup the pre-nghttp2 variables
|
||||||
CLEANLDFLAGS="$LDFLAGS"
|
CLEANLDFLAGS="$LDFLAGS"
|
||||||
CLEANCPPFLAGS="$CPPFLAGS"
|
CLEANCPPFLAGS="$CPPFLAGS"
|
||||||
CLEANLIBS="$LIBS"
|
CLEANLIBS="$LIBS"
|
||||||
|
|
||||||
h2pcdir=${want_h2_path}/lib/pkgconfig
|
CURL_CHECK_PKGCONFIG(libnghttp2, $want_h2_path)
|
||||||
CURL_CHECK_PKGCONFIG(libnghttp2, $h2pcdir)
|
|
||||||
|
|
||||||
if test "$PKGCONFIG" != "no" ; then
|
if test "$PKGCONFIG" != "no" ; then
|
||||||
LIB_H2=`CURL_EXPORT_PCDIR([$h2pcdir])
|
LIB_H2=`CURL_EXPORT_PCDIR([$want_h2_path])
|
||||||
$PKGCONFIG --libs-only-l libnghttp2`
|
$PKGCONFIG --libs-only-l libnghttp2`
|
||||||
AC_MSG_NOTICE([-l is $LIB_H2])
|
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`
|
$PKGCONFIG --cflags-only-I libnghttp2`
|
||||||
AC_MSG_NOTICE([-I is $CPP_H2])
|
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`
|
$PKGCONFIG --libs-only-L libnghttp2`
|
||||||
AC_MSG_NOTICE([-L is $LD_H2])
|
AC_MSG_NOTICE([-L is $LD_H2])
|
||||||
|
|
||||||
@@ -3401,6 +3403,12 @@ fi
|
|||||||
if test "x$USE_NGHTTP2" = "x1"; then
|
if test "x$USE_NGHTTP2" = "x1"; then
|
||||||
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
|
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
|
||||||
fi
|
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)
|
AC_SUBST(SUPPORT_FEATURES)
|
||||||
|
|
||||||
|
@@ -278,6 +278,10 @@
|
|||||||
[full description, no wider than 72 columns that describe as much as
|
[full description, no wider than 72 columns that describe as much as
|
||||||
possible as to why this change is made, and possibly what things
|
possible as to why this change is made, and possibly what things
|
||||||
it fixes and everything else that is related]
|
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 ----
|
---- stop ----
|
||||||
|
|
||||||
Don't forget to use commit --author="" if you commit someone else's work,
|
Don't forget to use commit --author="" if you commit someone else's work,
|
||||||
|
14
docs/FAQ
14
docs/FAQ
@@ -99,6 +99,7 @@ FAQ
|
|||||||
5.15 How do I get an FTP directory listing?
|
5.15 How do I get an FTP directory listing?
|
||||||
5.16 I want a different time-out!
|
5.16 I want a different time-out!
|
||||||
5.17 Can I write a server with libcurl?
|
5.17 Can I write a server with libcurl?
|
||||||
|
5.18 Does libcurl use threads?
|
||||||
|
|
||||||
6. License Issues
|
6. License Issues
|
||||||
6.1 I have a GPL program, can I use the libcurl library?
|
6.1 I have a GPL program, can I use the libcurl library?
|
||||||
@@ -1365,6 +1366,19 @@ FAQ
|
|||||||
server for. And there are really good stand-alone ones that have been tested
|
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!
|
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
|
6. License Issues
|
||||||
|
|
||||||
|
52
docs/INSTALL
52
docs/INSTALL
@@ -252,8 +252,10 @@ Win32
|
|||||||
MSVC 6 caveats
|
MSVC 6 caveats
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
If you use MSVC 6 it is required that you use the February 2003 edition PSDK:
|
If you use MSVC 6 it is required that you use the February 2003 edition of
|
||||||
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
|
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
|
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
|
asking for trouble down the road once you have released it, you might notice
|
||||||
@@ -261,8 +263,6 @@ Win32
|
|||||||
choice of static vs dynamic runtime and third party libraries. Anyone using
|
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.
|
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
|
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
|
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.
|
safely used to read source code, translate and make it object code.
|
||||||
@@ -272,13 +272,6 @@ Win32
|
|||||||
header files and libraries with bugs and security issues which have already
|
header files and libraries with bugs and security issues which have already
|
||||||
been addressed and fixed long time ago.
|
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
|
So, building curl and libcurl with MSVC 6 without PSDK is absolutely
|
||||||
discouraged for the benefit of anyone using software built in such
|
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
|
environment. And it will not be supported in any way, as we could just
|
||||||
@@ -340,39 +333,18 @@ Win32
|
|||||||
at runtime.
|
at runtime.
|
||||||
Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support.
|
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
|
A fairly comprehensive set of Visual Studio project files are available for
|
||||||
source distribution archive to allow proper building of the two included
|
v6.0 through v12.0 and are located in the projects folder to allow proper
|
||||||
projects, the libcurl library and the curl tool.
|
building of both the libcurl library as well as the curl tool.
|
||||||
|
|
||||||
1) Open the vs/vc6/vc6curl.dsw workspace with MSVC6's IDE.
|
For more information about these projects and building via Visual Studio
|
||||||
2) Select 'Build' from top menu.
|
please see the README file located in the projects folder.
|
||||||
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'.
|
|
||||||
|
|
||||||
Borland C++ compiler
|
Borland C++ compiler
|
||||||
---------------------
|
--------------------
|
||||||
|
|
||||||
Ensure that your build environment is properly set up to use the 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
|
and associated tools. PATH environment variable must include the path to
|
||||||
|
@@ -180,16 +180,7 @@ may have been fixed since this was written!
|
|||||||
--cflags suffers from the same effects with CFLAGS/CPPFLAGS.
|
--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
|
30. You need to use -g to the command line tool in order to use RFC2732-style
|
||||||
IPv6 numerical addresses in URLs.
|
or RFC6874-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
|
|
||||||
|
|
||||||
26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in
|
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
|
"system context" will make it use wrong(?) user name - at least when compared
|
||||||
|
@@ -50,7 +50,7 @@ SIMPLE USAGE
|
|||||||
|
|
||||||
Get the main page from an IPv6 web server:
|
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
|
DOWNLOAD TO A FILE
|
||||||
|
|
||||||
@@ -956,9 +956,9 @@ IPv6
|
|||||||
When this style is used, the -g option must be given to stop curl from
|
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
|
interpreting the square brackets as special globbing characters. Link local
|
||||||
and site local addresses including a scope identifier, such as fe80::1234%1,
|
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
|
may also be used, but the scope portion must be numeric or match an existing
|
||||||
character must be URL escaped. The previous example in an SFTP URL might
|
network interface on Linux and the percent character must be URL escaped. The
|
||||||
look like:
|
previous example in an SFTP URL might look like:
|
||||||
|
|
||||||
sftp://[fe80::1234%251]/
|
sftp://[fe80::1234%251]/
|
||||||
|
|
||||||
|
18
docs/THANKS
18
docs/THANKS
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
If you have contributed but are missing here, please let us know!
|
If you have contributed but are missing here, please let us know!
|
||||||
|
|
||||||
|
Aaro Koskinen
|
||||||
Aaron Oneal
|
Aaron Oneal
|
||||||
Aaron Orenstein
|
Aaron Orenstein
|
||||||
Abram Pousada
|
Abram Pousada
|
||||||
@@ -192,6 +193,7 @@ Clarence Gardner
|
|||||||
Clemens Gruber
|
Clemens Gruber
|
||||||
Clifford Wolf
|
Clifford Wolf
|
||||||
Cody Jones
|
Cody Jones
|
||||||
|
Cody Mack
|
||||||
Colby Ranger
|
Colby Ranger
|
||||||
Colin Hogben
|
Colin Hogben
|
||||||
Colin Watson
|
Colin Watson
|
||||||
@@ -209,6 +211,7 @@ Cédric Deltheil
|
|||||||
D. Flinkmann
|
D. Flinkmann
|
||||||
Dag Ekengren
|
Dag Ekengren
|
||||||
Dagobert Michelsen
|
Dagobert Michelsen
|
||||||
|
Damian Dixon
|
||||||
Damien Adant
|
Damien Adant
|
||||||
Dan Becker
|
Dan Becker
|
||||||
Dan C
|
Dan C
|
||||||
@@ -260,6 +263,7 @@ David Strauss
|
|||||||
David Tarendash
|
David Tarendash
|
||||||
David Thiel
|
David Thiel
|
||||||
David Walser
|
David Walser
|
||||||
|
David Woodhouse
|
||||||
David Wright
|
David Wright
|
||||||
David Yan
|
David Yan
|
||||||
Dengminwen
|
Dengminwen
|
||||||
@@ -267,6 +271,7 @@ Derek Higgins
|
|||||||
Detlef Schmier
|
Detlef Schmier
|
||||||
Didier Brisebourg
|
Didier Brisebourg
|
||||||
Diego Casorran
|
Diego Casorran
|
||||||
|
Dilyan Palauzov
|
||||||
Dima Barsky
|
Dima Barsky
|
||||||
Dima Tisnek
|
Dima Tisnek
|
||||||
Dimitre Dimitrov
|
Dimitre Dimitrov
|
||||||
@@ -446,6 +451,7 @@ Ingmar Runge
|
|||||||
Ingo Ralf Blum
|
Ingo Ralf Blum
|
||||||
Ingo Wilken
|
Ingo Wilken
|
||||||
Ishan SinghLevett
|
Ishan SinghLevett
|
||||||
|
Ivo Bellin Salarin
|
||||||
Jack Zhang
|
Jack Zhang
|
||||||
Jacky Lam
|
Jacky Lam
|
||||||
Jacob Meuser
|
Jacob Meuser
|
||||||
@@ -497,6 +503,7 @@ Jeff Weber
|
|||||||
Jeffrey Pohlmeyer
|
Jeffrey Pohlmeyer
|
||||||
Jeremy Friesner
|
Jeremy Friesner
|
||||||
Jeremy Huddleston
|
Jeremy Huddleston
|
||||||
|
Jeroen Koekkoek
|
||||||
Jerome Muffat-Meridol
|
Jerome Muffat-Meridol
|
||||||
Jerome Vouillon
|
Jerome Vouillon
|
||||||
Jerry Krinock
|
Jerry Krinock
|
||||||
@@ -543,6 +550,7 @@ Johnny Luong
|
|||||||
Jon Grubbs
|
Jon Grubbs
|
||||||
Jon Nelson
|
Jon Nelson
|
||||||
Jon Sargeant
|
Jon Sargeant
|
||||||
|
Jon Torrey
|
||||||
Jon Travis
|
Jon Travis
|
||||||
Jon Turner
|
Jon Turner
|
||||||
Jonas Forsman
|
Jonas Forsman
|
||||||
@@ -615,6 +623,7 @@ Kyle Sallee
|
|||||||
Lachlan O'Dea
|
Lachlan O'Dea
|
||||||
Larry Campbell
|
Larry Campbell
|
||||||
Larry Fahnoe
|
Larry Fahnoe
|
||||||
|
Larry Lin
|
||||||
Lars Buitinck
|
Lars Buitinck
|
||||||
Lars Gustafsson
|
Lars Gustafsson
|
||||||
Lars J. Aas
|
Lars J. Aas
|
||||||
@@ -629,6 +638,7 @@ Leif W
|
|||||||
Len Krause
|
Len Krause
|
||||||
Lenaic Lefever
|
Lenaic Lefever
|
||||||
Lenny Rachitsky
|
Lenny Rachitsky
|
||||||
|
Leon Winter
|
||||||
Liam Healy
|
Liam Healy
|
||||||
Lijo Antony
|
Lijo Antony
|
||||||
Linas Vepstas
|
Linas Vepstas
|
||||||
@@ -649,6 +659,7 @@ Luke Call
|
|||||||
Luke Dashjr
|
Luke Dashjr
|
||||||
Luong Dinh Dung
|
Luong Dinh Dung
|
||||||
Maciej Karpiuk
|
Maciej Karpiuk
|
||||||
|
Maciej Puzio
|
||||||
Maciej W. Rozycki
|
Maciej W. Rozycki
|
||||||
Maks Naumov
|
Maks Naumov
|
||||||
Mamoru Tasaka
|
Mamoru Tasaka
|
||||||
@@ -814,6 +825,7 @@ Patrick Bihan-Faou
|
|||||||
Patrick Monnerat
|
Patrick Monnerat
|
||||||
Patrick Scott
|
Patrick Scott
|
||||||
Patrick Smith
|
Patrick Smith
|
||||||
|
Patrick Watson
|
||||||
Patrik Thunstrom
|
Patrik Thunstrom
|
||||||
Pau Garcia i Quiles
|
Pau Garcia i Quiles
|
||||||
Paul Donohue
|
Paul Donohue
|
||||||
@@ -874,6 +886,7 @@ Puneet Pawaia
|
|||||||
Quagmire
|
Quagmire
|
||||||
Quanah Gibson-Mount
|
Quanah Gibson-Mount
|
||||||
Quinn Slack
|
Quinn Slack
|
||||||
|
Radu Simionescu
|
||||||
Rafa Muyo
|
Rafa Muyo
|
||||||
Rafael Sagula
|
Rafael Sagula
|
||||||
Rainer Canavan
|
Rainer Canavan
|
||||||
@@ -945,6 +958,7 @@ Roy Shan
|
|||||||
Rune Kleveland
|
Rune Kleveland
|
||||||
Ruslan Gazizov
|
Ruslan Gazizov
|
||||||
Rutger Hofman
|
Rutger Hofman
|
||||||
|
Ryan Braud
|
||||||
Ryan Chan
|
Ryan Chan
|
||||||
Ryan Nelson
|
Ryan Nelson
|
||||||
Ryan Schmidt
|
Ryan Schmidt
|
||||||
@@ -1040,6 +1054,7 @@ Thomas Lopatic
|
|||||||
Thomas Schwinge
|
Thomas Schwinge
|
||||||
Thomas Tonino
|
Thomas Tonino
|
||||||
Tiit Pikma
|
Tiit Pikma
|
||||||
|
Till Maas
|
||||||
Tim Ansell
|
Tim Ansell
|
||||||
Tim Baker
|
Tim Baker
|
||||||
Tim Bartley
|
Tim Bartley
|
||||||
@@ -1066,6 +1081,7 @@ Tom Mattison
|
|||||||
Tom Moers
|
Tom Moers
|
||||||
Tom Mueller
|
Tom Mueller
|
||||||
Tom Regner
|
Tom Regner
|
||||||
|
Tom Sparrow
|
||||||
Tom Wright
|
Tom Wright
|
||||||
Tom Zerucha
|
Tom Zerucha
|
||||||
Tomas Hoger
|
Tomas Hoger
|
||||||
@@ -1087,12 +1103,14 @@ Troels Walsted Hansen
|
|||||||
Troy Engel
|
Troy Engel
|
||||||
Tupone Alfredo
|
Tupone Alfredo
|
||||||
Tyler Hall
|
Tyler Hall
|
||||||
|
Török Edwin
|
||||||
Ulf Härnhammar
|
Ulf Härnhammar
|
||||||
Ulf Samuelsson
|
Ulf Samuelsson
|
||||||
Ulrich Doehner
|
Ulrich Doehner
|
||||||
Ulrich Zadow
|
Ulrich Zadow
|
||||||
Venkat Akella
|
Venkat Akella
|
||||||
Victor Snezhko
|
Victor Snezhko
|
||||||
|
Vijay Panghal
|
||||||
Vikram Saxena
|
Vikram Saxena
|
||||||
Viktor Szakáts
|
Viktor Szakáts
|
||||||
Vilmos Nebehaj
|
Vilmos Nebehaj
|
||||||
|
63
docs/TODO
63
docs/TODO
@@ -17,7 +17,7 @@
|
|||||||
1.4 signal-based resolver timeouts
|
1.4 signal-based resolver timeouts
|
||||||
1.5 get rid of PATH_MAX
|
1.5 get rid of PATH_MAX
|
||||||
1.6 Modified buffer size approach
|
1.6 Modified buffer size approach
|
||||||
1.7 Detect when called from witin callbacks
|
1.7 Detect when called from within callbacks
|
||||||
1.8 Allow SSL (HTTPS) to proxy
|
1.8 Allow SSL (HTTPS) to proxy
|
||||||
|
|
||||||
2. libcurl - multi interface
|
2. libcurl - multi interface
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
2.2 Fix HTTP Pipelining for PUT
|
2.2 Fix HTTP Pipelining for PUT
|
||||||
|
|
||||||
3. Documentation
|
3. Documentation
|
||||||
3.1 More and better
|
3.1 Update date and version in man pages
|
||||||
|
|
||||||
4. FTP
|
4. FTP
|
||||||
4.1 HOST
|
4.1 HOST
|
||||||
@@ -88,7 +88,6 @@
|
|||||||
15.4 simultaneous parallel transfers
|
15.4 simultaneous parallel transfers
|
||||||
15.5 provide formpost headers
|
15.5 provide formpost headers
|
||||||
15.6 warning when setting an option
|
15.6 warning when setting an option
|
||||||
15.7 IPv6 addresses with globbing
|
|
||||||
|
|
||||||
16. Build
|
16. Build
|
||||||
16.1 roffit
|
16.1 roffit
|
||||||
@@ -98,9 +97,10 @@
|
|||||||
17.2 nicer lacking perl message
|
17.2 nicer lacking perl message
|
||||||
17.3 more protocols supported
|
17.3 more protocols supported
|
||||||
17.4 more platforms supported
|
17.4 more platforms supported
|
||||||
|
17.5 Add support for concurrent connections
|
||||||
|
|
||||||
18. Next SONAME bump
|
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.2 combine error codes
|
||||||
18.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
18.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||||
|
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
Dynamically allocate buffer size depending on protocol in use in combination
|
Dynamically allocate buffer size depending on protocol in use in combination
|
||||||
with freeing it after each individual transfer? Other suggestions?
|
with freeing it after each individual transfer? Other suggestions?
|
||||||
|
|
||||||
1.7 Detect when called from witin callbacks
|
1.7 Detect when called from within callbacks
|
||||||
|
|
||||||
We should set a state variable before calling callbacks, so that we
|
We should set a state variable before calling callbacks, so that we
|
||||||
subsequently can add code within libcurl that returns error if called within
|
subsequently can add code within libcurl that returns error if called within
|
||||||
@@ -186,6 +186,8 @@
|
|||||||
by Chrome already:
|
by Chrome already:
|
||||||
http://www.chromium.org/developers/design-documents/secure-web-proxy
|
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
|
2. libcurl - multi interface
|
||||||
|
|
||||||
@@ -211,18 +213,20 @@
|
|||||||
|
|
||||||
3. Documentation
|
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. FTP
|
||||||
|
|
||||||
4.1 HOST
|
4.1 HOST
|
||||||
|
|
||||||
HOST is a suggested command in the works for a client to tell which host name
|
HOST is a command for a client to tell which host name to use, to offer FTP
|
||||||
to use, to offer FTP servers named-based virtual hosting:
|
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
|
4.2 Alter passive/active on failure and retry
|
||||||
|
|
||||||
@@ -233,7 +237,7 @@
|
|||||||
|
|
||||||
4.3 Earlier bad letter detection
|
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.
|
process to avoid doing a resolve and connect in vain.
|
||||||
|
|
||||||
4.4 REST for large files
|
4.4 REST for large files
|
||||||
@@ -287,7 +291,7 @@
|
|||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
http://test:pass;auth=NTLM@example.com would be equivalent to specifing --user
|
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.
|
test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
|
||||||
|
|
||||||
Additionally this should be implemented for proxy base URLs as well.
|
Additionally this should be implemented for proxy base URLs as well.
|
||||||
@@ -352,7 +356,7 @@ to provide the data to send.
|
|||||||
Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
|
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
|
to an LDAP server. However, this function sends username and password details
|
||||||
using the simple authentication mechanism (as clear text). However, it should
|
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.
|
information ourselves.
|
||||||
|
|
||||||
11. New protocols
|
11. New protocols
|
||||||
@@ -383,7 +387,7 @@ to provide the data to send.
|
|||||||
12.4 Cache OpenSSL contexts
|
12.4 Cache OpenSSL contexts
|
||||||
|
|
||||||
"Look at SSL cafile - quick traces look to me like these are done on every
|
"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
|
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
|
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
|
instead make one for every connection and re-use that SSL context in the same
|
||||||
@@ -489,13 +493,6 @@ to provide the data to send.
|
|||||||
This can be useful to tell when support for a particular feature hasn't been
|
This can be useful to tell when support for a particular feature hasn't been
|
||||||
compiled into the library.
|
compiled into the library.
|
||||||
|
|
||||||
15.7 IPv6 addresses with globbing
|
|
||||||
|
|
||||||
Currently the command line client needs to get url globbing disabled (with
|
|
||||||
-g) for it to support IPv6 numerical addresses. This is a rather silly flaw
|
|
||||||
that should be corrected. It probably involves a smarter detection of the
|
|
||||||
'[' and ']' letters.
|
|
||||||
|
|
||||||
16. Build
|
16. Build
|
||||||
|
|
||||||
16.1 roffit
|
16.1 roffit
|
||||||
@@ -518,7 +515,7 @@ to provide the data to send.
|
|||||||
|
|
||||||
17.3 more protocols supported
|
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).
|
or http operations (for which we have test servers).
|
||||||
|
|
||||||
17.4 more platforms supported
|
17.4 more platforms supported
|
||||||
@@ -526,12 +523,26 @@ to provide the data to send.
|
|||||||
Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
|
Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
|
||||||
fork()s and it should become even more portable.
|
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. 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
|
#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
|
18.2 combine error codes
|
||||||
|
|
||||||
@@ -629,7 +640,7 @@ to provide the data to send.
|
|||||||
but instead often restricts how the form functions can or can't be modified.
|
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
|
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
|
19.9 have form functions use CURL handle argument
|
||||||
|
|
||||||
@@ -643,7 +654,7 @@ to provide the data to send.
|
|||||||
|
|
||||||
Rather than use the URL to specify the mail client string to present in the
|
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
|
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 ;-)
|
hack ;-)
|
||||||
|
|
||||||
Please see the following thread for more information:
|
Please see the following thread for more information:
|
||||||
|
69
docs/curl.1
69
docs/curl.1
@@ -678,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
|
because undoing a GET doesn't make sense, but you should then instead enforce
|
||||||
the alternative method you prefer.
|
the alternative method you prefer.
|
||||||
.IP "-H, --header <header>"
|
.IP "-H, --header <header>"
|
||||||
(HTTP) Extra header to use when getting a web page. You may specify any number
|
(HTTP) Extra header to include in the request when sending HTTP to a
|
||||||
of extra headers. Note that if you should add a custom header that has the
|
server. You may specify any number of extra headers. Note that if you should
|
||||||
same name as one of the internal ones curl would use, your externally set
|
add a custom header that has the same name as one of the internal ones curl
|
||||||
header will be used instead of the internal one. This allows you to make even
|
would use, your externally set header will be used instead of the internal
|
||||||
trickier stuff than curl would normally do. You should not replace internally
|
one. This allows you to make even trickier stuff than curl would normally
|
||||||
set headers without knowing perfectly well what you're doing. Remove an
|
do. You should not replace internally set headers without knowing perfectly
|
||||||
internal header by giving a replacement without content on the right side of
|
well what you're doing. Remove an internal header by giving a replacement
|
||||||
the colon, as in: -H \&"Host:". If you send the custom header with no-value
|
without content on the right side of the colon, as in: -H \&"Host:". If you
|
||||||
then its header must be terminated with a semicolon, such as \-H
|
send the custom header with no-value then its header must be terminated with a
|
||||||
\&"X-Custom-Header;" to send "X-Custom-Header:".
|
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
|
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
|
end-of-line marker, you should thus \fBnot\fP add that as a part of the header
|
||||||
@@ -696,6 +696,9 @@ for you.
|
|||||||
|
|
||||||
See also the \fI-A, --user-agent\fP and \fI-e, --referer\fP options.
|
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.
|
This option can be used multiple times to add/replace/remove multiple headers.
|
||||||
.IP "--hostpubmd5 <md5>"
|
.IP "--hostpubmd5 <md5>"
|
||||||
(SCP/SFTP) Pass a string containing 32 hexadecimal digits. The string should
|
(SCP/SFTP) Pass a string containing 32 hexadecimal digits. The string should
|
||||||
@@ -907,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
|
timeout increases in decimal precision. See also the \fI--connect-timeout\fP
|
||||||
option.
|
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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--mail-auth <address>"
|
.IP "--mail-auth <address>"
|
||||||
(SMTP) Specify a single address. This will be used to specify the
|
(SMTP) Specify a single address. This will be used to specify the
|
||||||
@@ -1107,6 +1120,24 @@ is used in conjunction with the user name which can be specified as part of the
|
|||||||
The Bearer Token and user name are formatted according to RFC 6750.
|
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.
|
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"
|
.IP "-p, --proxytunnel"
|
||||||
When an HTTP proxy is used (\fI-x, --proxy\fP), this option will cause non-HTTP
|
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
|
protocols to attempt to tunnel through the proxy instead of merely using it to
|
||||||
@@ -1592,23 +1623,15 @@ If this option is used several times, the last one will be used.
|
|||||||
.IP "--trace-time"
|
.IP "--trace-time"
|
||||||
Prepends a time stamp to each trace or verbose line that curl displays.
|
Prepends a time stamp to each trace or verbose line that curl displays.
|
||||||
(Added in 7.14.0)
|
(Added in 7.14.0)
|
||||||
.IP "-u, --user <user:password;options>"
|
.IP "-u, --user <user:password>"
|
||||||
Specify the user name, password and optional login options to use for server
|
Specify the user name and password to use for server authentication. Overrides
|
||||||
authentication. Overrides \fI-n, --netrc\fP and \fI--netrc-optional\fP.
|
\fI-n, --netrc\fP and \fI--netrc-optional\fP.
|
||||||
|
|
||||||
If you simply specify the user name, with or without the login options, curl
|
If you simply specify the user name, curl will prompt for a password.
|
||||||
will prompt for a password.
|
|
||||||
|
|
||||||
If you use an SSPI-enabled curl binary and perform NTLM authentication, you
|
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
|
can force curl to select the user name and password from your environment by
|
||||||
simply specifying a single colon with this option: "-u :" or by specifying the
|
specifying a single colon with this option: "-u :".
|
||||||
login options on their own, for example "-u ;auth=NTLM".
|
|
||||||
|
|
||||||
You can use the optional login options part to specify protocol specific
|
|
||||||
options that may be used during authentication. At present only IMAP, POP3 and
|
|
||||||
SMTP support login options as part of the user login information. For more
|
|
||||||
information about the login options please see RFC 2384, RFC 5092 and IETF
|
|
||||||
draft draft-earhart-url-smtp-00.txt (Added in 7.31.0).
|
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-U, --proxy-user <user:password>"
|
.IP "-U, --proxy-user <user:password>"
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* 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)
|
if (X509_STORE_add_cert(store, cert)==0)
|
||||||
printf("error adding certificate\n");
|
printf("error adding certificate\n");
|
||||||
|
|
||||||
|
/* decrease reference counts */
|
||||||
|
X509_free(cert);
|
||||||
|
BIO_free(bio);
|
||||||
|
|
||||||
/* all set to go */
|
/* all set to go */
|
||||||
return CURLE_OK ;
|
return CURLE_OK ;
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/* This is a simple example showing how to send mail using libcurl's IMAP
|
/* This is a simple example showing how to send mail using libcurl's IMAP
|
||||||
|
@@ -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
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -109,7 +109,9 @@ uploaded.
|
|||||||
.IP CURLINFO_SIZE_DOWNLOAD
|
.IP CURLINFO_SIZE_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the total amount of bytes that were
|
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
|
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
|
.IP CURLINFO_SPEED_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the average download speed that curl
|
Pass a pointer to a double to receive the average download speed that curl
|
||||||
measured for the complete download. Measured in bytes/second.
|
measured for the complete download. Measured in bytes/second.
|
||||||
|
@@ -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,
|
\fBint function(void *clientp, double dltotal, double dlnow, double ultotal,
|
||||||
double ulnow);\fP
|
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
|
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
|
frequent interval. While data is being transferred it will be called very
|
||||||
frequently, and during slow periods like when nothing is being transferred it
|
frequently, and during slow periods like when nothing is being transferred it
|
||||||
@@ -821,8 +823,9 @@ the user
|
|||||||
|
|
||||||
The path part of an IMAP request not only specifies the mailbox to list (Added
|
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
|
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
|
mailbox, to specify the UID, SECTION (Added in 7.30.0) and PARTIAL octets
|
||||||
7.30.0).
|
(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
|
imap://user:password@mail.example.com - Performs a top level folder list
|
||||||
|
|
||||||
@@ -837,7 +840,17 @@ the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches
|
|||||||
message 2 if it is
|
message 2 if it is
|
||||||
|
|
||||||
imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the
|
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
|
For more information about the individual components of an IMAP URL please
|
||||||
see RFC5092.
|
see RFC5092.
|
||||||
@@ -1515,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
|
can be used to fool servers or scripts. You can also set any custom header
|
||||||
with \fICURLOPT_HTTPHEADER\fP.
|
with \fICURLOPT_HTTPHEADER\fP.
|
||||||
.IP CURLOPT_HTTPHEADER
|
.IP CURLOPT_HTTPHEADER
|
||||||
Pass a pointer to a linked list of HTTP headers to pass to the server in your
|
Pass a pointer to a linked list of HTTP headers to pass to the server and/or
|
||||||
HTTP request. The linked list should be a fully valid list of \fBstruct
|
proxy in your HTTP request. The same list is used for both host and proxy
|
||||||
curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to
|
requests!
|
||||||
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
|
The linked list should be a fully valid list of \fBstruct curl_slist\fP
|
||||||
internally, your added one will be used instead. If you add a header with no
|
structs properly filled in. Use \fIcurl_slist_append(3)\fP to create the list
|
||||||
content as in 'Accept:' (no data on the right side of the colon), the
|
and \fIcurl_slist_free_all(3)\fP to clean up an entire list. If you add a
|
||||||
internally used header will get disabled. Thus, using this option you can add
|
header that is otherwise generated and used by libcurl internally, your added
|
||||||
new headers, replace internal headers and remove internal headers. To add a
|
one will be used instead. If you add a header with no content as in 'Accept:'
|
||||||
header with no content (nothing to the right side of the colon), use the
|
(no data on the right side of the colon), the internally used header will get
|
||||||
form 'MyHeader;' (note the ending semicolon).
|
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
|
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
|
curl adds CRLF after each header item. Failure to comply with this will result
|
||||||
@@ -1541,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
|
The most commonly replaced headers have "shortcuts" in the options
|
||||||
\fICURLOPT_COOKIE\fP, \fICURLOPT_USERAGENT\fP and \fICURLOPT_REFERER\fP.
|
\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
|
.IP CURLOPT_HTTP200ALIASES
|
||||||
Pass a pointer to a linked list of aliases to be treated as valid HTTP 200
|
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
|
responses. Some servers respond with a custom header response line. For
|
||||||
@@ -2743,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
|
for libcurl how to proceed. The callback will only be called if
|
||||||
\fICURLOPT_SSH_KNOWNHOSTS\fP is also set.
|
\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
|
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
|
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
|
matching status and a custom pointer (set with \fICURLOPT_SSH_KEYDATA\fP). It
|
||||||
|
@@ -193,6 +193,8 @@ CURLFTP_CREATE_DIR_RETRY 7.19.4
|
|||||||
CURLGSSAPI_DELEGATION_FLAG 7.22.0
|
CURLGSSAPI_DELEGATION_FLAG 7.22.0
|
||||||
CURLGSSAPI_DELEGATION_NONE 7.22.0
|
CURLGSSAPI_DELEGATION_NONE 7.22.0
|
||||||
CURLGSSAPI_DELEGATION_POLICY_FLAG 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_APPCONNECT_TIME 7.19.0
|
||||||
CURLINFO_CERTINFO 7.19.1
|
CURLINFO_CERTINFO 7.19.1
|
||||||
CURLINFO_CONDITION_UNMET 7.19.4
|
CURLINFO_CONDITION_UNMET 7.19.4
|
||||||
@@ -370,6 +372,7 @@ CURLOPT_GSSAPI_DELEGATION 7.22.0
|
|||||||
CURLOPT_HEADER 7.1
|
CURLOPT_HEADER 7.1
|
||||||
CURLOPT_HEADERDATA 7.10
|
CURLOPT_HEADERDATA 7.10
|
||||||
CURLOPT_HEADERFUNCTION 7.7.2
|
CURLOPT_HEADERFUNCTION 7.7.2
|
||||||
|
CURLOPT_HEADEROPT 7.37.0
|
||||||
CURLOPT_HTTP200ALIASES 7.10.3
|
CURLOPT_HTTP200ALIASES 7.10.3
|
||||||
CURLOPT_HTTPAUTH 7.10.6
|
CURLOPT_HTTPAUTH 7.10.6
|
||||||
CURLOPT_HTTPGET 7.8.1
|
CURLOPT_HTTPGET 7.8.1
|
||||||
@@ -439,6 +442,7 @@ CURLOPT_PROGRESSFUNCTION 7.1 7.32.0
|
|||||||
CURLOPT_PROTOCOLS 7.19.4
|
CURLOPT_PROTOCOLS 7.19.4
|
||||||
CURLOPT_PROXY 7.1
|
CURLOPT_PROXY 7.1
|
||||||
CURLOPT_PROXYAUTH 7.10.7
|
CURLOPT_PROXYAUTH 7.10.7
|
||||||
|
CURLOPT_PROXYHEADER 7.37.0
|
||||||
CURLOPT_PROXYPASSWORD 7.19.1
|
CURLOPT_PROXYPASSWORD 7.19.1
|
||||||
CURLOPT_PROXYPORT 7.1
|
CURLOPT_PROXYPORT 7.1
|
||||||
CURLOPT_PROXYTYPE 7.10
|
CURLOPT_PROXYTYPE 7.10
|
||||||
@@ -496,11 +500,11 @@ CURLOPT_SSLKEY 7.9.3
|
|||||||
CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0
|
CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0
|
||||||
CURLOPT_SSLKEYTYPE 7.9.3
|
CURLOPT_SSLKEYTYPE 7.9.3
|
||||||
CURLOPT_SSLVERSION 7.1
|
CURLOPT_SSLVERSION 7.1
|
||||||
CURLOPT_SSL_ENABLE_ALPN 7.36.0
|
|
||||||
CURLOPT_SSL_ENABLE_NPN 7.36.0
|
|
||||||
CURLOPT_SSL_CIPHER_LIST 7.9
|
CURLOPT_SSL_CIPHER_LIST 7.9
|
||||||
CURLOPT_SSL_CTX_DATA 7.10.6
|
CURLOPT_SSL_CTX_DATA 7.10.6
|
||||||
CURLOPT_SSL_CTX_FUNCTION 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_OPTIONS 7.25.0
|
||||||
CURLOPT_SSL_SESSIONID_CACHE 7.16.0
|
CURLOPT_SSL_SESSIONID_CACHE 7.16.0
|
||||||
CURLOPT_SSL_VERIFYHOST 7.8.1
|
CURLOPT_SSL_VERIFYHOST 7.8.1
|
||||||
|
@@ -24,13 +24,14 @@
|
|||||||
.SH NAME
|
.SH NAME
|
||||||
mk-ca-bundle \- convert mozilla's certdata.txt to PEM format
|
mk-ca-bundle \- convert mozilla's certdata.txt to PEM format
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
mk-ca-bundle [bilnqtuv]
|
mk-ca-bundle [bilnpqstuv]
|
||||||
.I [outputfile]
|
.I [outputfile]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
The mk-ca-bundle tool downloads the certdata.txt file from Mozilla's source
|
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
|
tree over HTTP, then parses certdata.txt and extracts certificates
|
||||||
into PEM format. These are then processed with the OpenSSL commandline tool
|
into PEM format. By default, only CA root certificates trusted to issue SSL
|
||||||
to produce the final ca-bundle file.
|
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 '-'
|
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.
|
(a single dash) you will get the output sent to STDOUT instead of a file.
|
||||||
@@ -54,10 +55,40 @@ print version info about used modules
|
|||||||
print license info about certdata.txt
|
print license info about certdata.txt
|
||||||
.IP -n
|
.IP -n
|
||||||
no download of certdata.txt (to use existing)
|
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
|
.IP -q
|
||||||
be really quiet (no progress output at all)
|
be really quiet (no progress output at all)
|
||||||
.IP -t
|
.IP -t
|
||||||
include plain text listing of certificates
|
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
|
.IP -u
|
||||||
unlink (remove) certdata.txt after processing
|
unlink (remove) certdata.txt after processing
|
||||||
.IP -v
|
.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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -754,6 +754,10 @@ typedef enum {
|
|||||||
CURLFTPMETHOD_LAST /* not an option, never use */
|
CURLFTPMETHOD_LAST /* not an option, never use */
|
||||||
} curl_ftpmethod;
|
} curl_ftpmethod;
|
||||||
|
|
||||||
|
/* bitmask defines for CURLOPT_HEADEROPT */
|
||||||
|
#define CURLHEADER_UNIFIED 0
|
||||||
|
#define CURLHEADER_SEPARATE (1<<0)
|
||||||
|
|
||||||
/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */
|
/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */
|
||||||
#define CURLPROTO_HTTP (1<<0)
|
#define CURLPROTO_HTTP (1<<0)
|
||||||
#define CURLPROTO_HTTPS (1<<1)
|
#define CURLPROTO_HTTPS (1<<1)
|
||||||
@@ -903,7 +907,8 @@ typedef enum {
|
|||||||
/* Set cookie in request: */
|
/* Set cookie in request: */
|
||||||
CINIT(COOKIE, OBJECTPOINT, 22),
|
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),
|
CINIT(HTTPHEADER, OBJECTPOINT, 23),
|
||||||
|
|
||||||
/* This points to a linked list of post entries, struct curl_httppost */
|
/* This points to a linked list of post entries, struct curl_httppost */
|
||||||
@@ -1581,6 +1586,13 @@ typedef enum {
|
|||||||
* Expect: 100-continue header before sending the data anyway. */
|
* Expect: 100-continue header before sending the data anyway. */
|
||||||
CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227),
|
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 */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
|
|
||||||
|
@@ -30,12 +30,12 @@
|
|||||||
|
|
||||||
/* This is the version number of the libcurl package from which this header
|
/* This is the version number of the libcurl package from which this header
|
||||||
file origins: */
|
file origins: */
|
||||||
#define LIBCURL_VERSION "7.36.0-DEV"
|
#define LIBCURL_VERSION "7.37.0-DEV"
|
||||||
|
|
||||||
/* The numeric version number is also available "in parts" by using these
|
/* The numeric version number is also available "in parts" by using these
|
||||||
defines: */
|
defines: */
|
||||||
#define LIBCURL_VERSION_MAJOR 7
|
#define LIBCURL_VERSION_MAJOR 7
|
||||||
#define LIBCURL_VERSION_MINOR 36
|
#define LIBCURL_VERSION_MINOR 37
|
||||||
#define LIBCURL_VERSION_PATCH 0
|
#define LIBCURL_VERSION_PATCH 0
|
||||||
|
|
||||||
/* This is the numeric version of the libcurl version number, meant for easier
|
/* 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
|
and it is always a greater number in a more recent release. It makes
|
||||||
comparisons with greater than and less than work.
|
comparisons with greater than and less than work.
|
||||||
*/
|
*/
|
||||||
#define LIBCURL_VERSION_NUM 0x072400
|
#define LIBCURL_VERSION_NUM 0x072500
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the date and time when the full source package was created. The
|
* This is the date and time when the full source package was created. The
|
||||||
|
@@ -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
|
LIBFLAGS = /C /P32
|
||||||
LDFLAGS = -q -lq -laa -tWD
|
LDFLAGS = -q -lq -laa -tWD
|
||||||
|
|
||||||
SRCDIR = .
|
SRCDIR = .;.\vtls
|
||||||
OBJDIR = .\BCC_objs
|
OBJDIR = .\BCC_objs
|
||||||
INCDIRS = -I.;..\include
|
INCDIRS = -I.;.\lib;..\include
|
||||||
LINKLIB = $(BCCDIR)\lib\cw32mt.lib $(BCCDIR)\lib\ws2_32.lib
|
LINKLIB = $(BCCDIR)\lib\cw32mt.lib $(BCCDIR)\lib\ws2_32.lib
|
||||||
DEFINES = -DNDEBUG -DWIN32 -DBUILDING_LIBCURL
|
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
|
# build source files with hyphens in their name as objects with underscores
|
||||||
# using explicit compilation build rules instead of implicit ones.
|
# using explicit compilation build rules instead of implicit ones.
|
||||||
|
|
||||||
NOHYPHEN = $(CSOURCES:-=_)
|
NOHYPHEN1 = $(CSOURCES:-=_)
|
||||||
|
NOHYPHEN2 = $(NOHYPHEN1:vtls/=)
|
||||||
|
|
||||||
OBJECTS = $(NOHYPHEN:.c=.obj)
|
OBJECTS = $(NOHYPHEN2:.c=.obj)
|
||||||
PREPROCESSED = $(NOHYPHEN:.c=.int)
|
PREPROCESSED = $(NOHYPHEN2:.c=.int)
|
||||||
|
|
||||||
# Borland's command line compiler (BCC32) version 5.5.1 integrated
|
# Borland's command line compiler (BCC32) version 5.5.1 integrated
|
||||||
# preprocessor has a bug which results in silently generating wrong
|
# preprocessor has a bug which results in silently generating wrong
|
||||||
|
@@ -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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -20,14 +20,15 @@
|
|||||||
#
|
#
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
VSOURCES=vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c vtls/qssl.c \
|
LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \
|
||||||
vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c vtls/cyassl.c \
|
vtls/qssl.c vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c \
|
||||||
vtls/curl_schannel.c vtls/curl_darwinssl.c vtls/gskit.c
|
vtls/cyassl.c vtls/curl_schannel.c vtls/curl_darwinssl.c vtls/gskit.c
|
||||||
VHEADERS= vtls/qssl.h vtls/openssl.h vtls/vtls.h vtls/gtls.h \
|
|
||||||
|
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/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
|
vtls/cyassl.h vtls/curl_schannel.h vtls/curl_darwinssl.h vtls/gskit.h
|
||||||
|
|
||||||
CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
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 \
|
cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \
|
||||||
ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.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 \
|
getinfo.c transfer.c strequal.c easy.c security.c curl_fnmatch.c \
|
||||||
@@ -44,9 +45,9 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
|||||||
asyn-thread.c curl_gssapi.c curl_ntlm.c curl_ntlm_wb.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 \
|
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 \
|
hostcheck.c bundles.c conncache.c pipeline.c dotdot.c x509asn1.c \
|
||||||
http2.c $(VSOURCES)
|
http2.c curl_sasl_sspi.c
|
||||||
|
|
||||||
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.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 \
|
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 \
|
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 \
|
strequal.h curl_sec.h memdebug.h http_chunks.h curl_fnmatch.h \
|
||||||
@@ -62,4 +63,9 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
|
|||||||
curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.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 \
|
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 \
|
conncache.h curl_setup_once.h multihandle.h setup-vms.h pipeline.h \
|
||||||
dotdot.h x509asn1.h http2.h sigpipe.h $(VHEADERS)
|
dotdot.h x509asn1.h http2.h sigpipe.h
|
||||||
|
|
||||||
|
LIB_RCFILES = libcurl.rc
|
||||||
|
|
||||||
|
CSOURCES = $(LIB_CFILES) $(LIB_VTLS_CFILES)
|
||||||
|
HHEADERS = $(LIB_HFILES) $(LIB_VTLS_HFILES)
|
||||||
|
@@ -542,6 +542,7 @@ X_OBJS= \
|
|||||||
$(DIROBJ)\curl_ntlm_wb.obj \
|
$(DIROBJ)\curl_ntlm_wb.obj \
|
||||||
$(DIROBJ)\curl_rtmp.obj \
|
$(DIROBJ)\curl_rtmp.obj \
|
||||||
$(DIROBJ)\curl_sasl.obj \
|
$(DIROBJ)\curl_sasl.obj \
|
||||||
|
$(DIROBJ)\curl_sasl_sspi.obj \
|
||||||
$(DIROBJ)\curl_schannel.obj \
|
$(DIROBJ)\curl_schannel.obj \
|
||||||
$(DIROBJ)\curl_sspi.obj \
|
$(DIROBJ)\curl_sspi.obj \
|
||||||
$(DIROBJ)\curl_threads.obj \
|
$(DIROBJ)\curl_threads.obj \
|
||||||
|
@@ -50,6 +50,16 @@ SSL libs
|
|||||||
NSS: ALPN and NPN
|
NSS: ALPN and NPN
|
||||||
GnuTLS: ALPN
|
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
|
Applications
|
||||||
|
|
||||||
We hide http2's binary nature and convert received http2 traffic to headers
|
We hide http2's binary nature and convert received http2 traffic to headers
|
||||||
|
@@ -7,7 +7,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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -465,7 +465,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define if the compiler supports the 'long long' data type. */
|
/* Define if the compiler supports the 'long long' data type. */
|
||||||
#if defined(__MINGW32__) || defined(__WATCOMC__)
|
#if defined(__MINGW32__) || defined(__WATCOMC__) || \
|
||||||
|
(defined(_MSC_VER) && (_MSC_VER >= 1310))
|
||||||
#define HAVE_LONGLONG 1
|
#define HAVE_LONGLONG 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -224,7 +224,12 @@ long Curl_timeleft(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* subtract elapsed time */
|
/* subtract elapsed time */
|
||||||
timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle);
|
if(duringconnect)
|
||||||
|
/* since this most recent connect started */
|
||||||
|
timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle);
|
||||||
|
else
|
||||||
|
/* since the entire operation started */
|
||||||
|
timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startop);
|
||||||
if(!timeout_ms)
|
if(!timeout_ms)
|
||||||
/* avoid returning 0 as that means no timeout! */
|
/* avoid returning 0 as that means no timeout! */
|
||||||
return -1;
|
return -1;
|
||||||
@@ -545,7 +550,7 @@ static CURLcode trynextip(struct connectdata *conn,
|
|||||||
conn->tempsock[tempindex] = CURL_SOCKET_BAD;
|
conn->tempsock[tempindex] = CURL_SOCKET_BAD;
|
||||||
|
|
||||||
if(sockindex == FIRSTSOCKET) {
|
if(sockindex == FIRSTSOCKET) {
|
||||||
Curl_addrinfo *ai;
|
Curl_addrinfo *ai = NULL;
|
||||||
int family;
|
int family;
|
||||||
|
|
||||||
if(conn->tempaddr[tempindex]) {
|
if(conn->tempaddr[tempindex]) {
|
||||||
@@ -553,7 +558,7 @@ static CURLcode trynextip(struct connectdata *conn,
|
|||||||
family = conn->tempaddr[tempindex]->ai_family;
|
family = conn->tempaddr[tempindex]->ai_family;
|
||||||
ai = conn->tempaddr[tempindex]->ai_next;
|
ai = conn->tempaddr[tempindex]->ai_next;
|
||||||
}
|
}
|
||||||
else {
|
else if(conn->tempaddr[0]) {
|
||||||
/* happy eyeballs - try the other protocol family */
|
/* happy eyeballs - try the other protocol family */
|
||||||
int firstfamily = conn->tempaddr[0]->ai_family;
|
int firstfamily = conn->tempaddr[0]->ai_family;
|
||||||
#ifdef ENABLE_IPV6
|
#ifdef ENABLE_IPV6
|
||||||
@@ -811,14 +816,16 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
char ipaddress[MAX_IPADR_LEN];
|
char ipaddress[MAX_IPADR_LEN];
|
||||||
data->state.os_errno = error;
|
data->state.os_errno = error;
|
||||||
SET_SOCKERRNO(error);
|
SET_SOCKERRNO(error);
|
||||||
Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
|
if(conn->tempaddr[i]) {
|
||||||
infof(data, "connect to %s port %ld failed: %s\n",
|
Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
|
||||||
ipaddress, conn->port, Curl_strerror(conn, error));
|
infof(data, "connect to %s port %ld failed: %s\n",
|
||||||
|
ipaddress, conn->port, Curl_strerror(conn, error));
|
||||||
|
|
||||||
conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
|
conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
|
||||||
allow : allow / 2;
|
allow : allow / 2;
|
||||||
|
|
||||||
code = trynextip(conn, sockindex, i);
|
code = trynextip(conn, sockindex, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -402,7 +402,11 @@ static void write32_le(const int value, unsigned char *buffer)
|
|||||||
buffer[3] = (char)((value & 0xFF000000) >> 24);
|
buffer[3] = (char)((value & 0xFF000000) >> 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_LONGLONG)
|
||||||
static void write64_le(const long long value, unsigned char *buffer)
|
static void write64_le(const long long value, unsigned char *buffer)
|
||||||
|
#else
|
||||||
|
static void write64_le(const __int64 value, unsigned char *buffer)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
write32_le((int)value, buffer);
|
write32_le((int)value, buffer);
|
||||||
write32_le((int)(value >> 32), buffer + 4);
|
write32_le((int)(value >> 32), buffer + 4);
|
||||||
@@ -550,16 +554,27 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
|
|||||||
unsigned int len = 0;
|
unsigned int len = 0;
|
||||||
unsigned char *ptr = NULL;
|
unsigned char *ptr = NULL;
|
||||||
unsigned char hmac_output[NTLM_HMAC_MD5_LEN];
|
unsigned char hmac_output[NTLM_HMAC_MD5_LEN];
|
||||||
|
#if defined(HAVE_LONGLONG)
|
||||||
long long tw;
|
long long tw;
|
||||||
|
#else
|
||||||
|
__int64 tw;
|
||||||
|
#endif
|
||||||
CURLcode res = CURLE_OK;
|
CURLcode res = CURLE_OK;
|
||||||
|
|
||||||
/* Calculate the timestamp */
|
/* Calculate the timestamp */
|
||||||
|
#if defined(HAVE_LONGLONG)
|
||||||
#if defined(DEBUGBUILD)
|
#if defined(DEBUGBUILD)
|
||||||
tw = 11644473600ULL * 10000000ULL;
|
tw = 11644473600ULL * 10000000ULL;
|
||||||
#else
|
#else
|
||||||
tw = ((long long)time(NULL) + 11644473600ULL) * 10000000ULL;
|
tw = ((long long)time(NULL) + 11644473600ULL) * 10000000ULL;
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
#if defined(DEBUGBUILD)
|
||||||
|
tw = 11644473600ui64 * 10000000ui64;
|
||||||
|
#else
|
||||||
|
tw = ((__int64)time(NULL) + 11644473600ui64) * 10000000ui64;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
/* Calculate the response len */
|
/* Calculate the response len */
|
||||||
len = NTLM_HMAC_MD5_LEN + NTLMv2_BLOB_LEN;
|
len = NTLM_HMAC_MD5_LEN + NTLMv2_BLOB_LEN;
|
||||||
|
|
||||||
|
@@ -346,17 +346,15 @@ CURLcode Curl_ntlm_decode_type2_message(struct SessionHandle *data,
|
|||||||
void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm)
|
void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm)
|
||||||
{
|
{
|
||||||
Curl_safefree(ntlm->type_2);
|
Curl_safefree(ntlm->type_2);
|
||||||
|
|
||||||
if(ntlm->has_handles) {
|
if(ntlm->has_handles) {
|
||||||
s_pSecFn->DeleteSecurityContext(&ntlm->c_handle);
|
s_pSecFn->DeleteSecurityContext(&ntlm->c_handle);
|
||||||
s_pSecFn->FreeCredentialsHandle(&ntlm->handle);
|
s_pSecFn->FreeCredentialsHandle(&ntlm->handle);
|
||||||
ntlm->has_handles = 0;
|
ntlm->has_handles = 0;
|
||||||
}
|
}
|
||||||
if(ntlm->p_identity) {
|
|
||||||
Curl_safefree(ntlm->identity.User);
|
Curl_sspi_free_identity(ntlm->p_identity);
|
||||||
Curl_safefree(ntlm->identity.Password);
|
ntlm->p_identity = NULL;
|
||||||
Curl_safefree(ntlm->identity.Domain);
|
|
||||||
ntlm->p_identity = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -416,92 +414,30 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
|
|||||||
|
|
||||||
#ifdef USE_WINDOWS_SSPI
|
#ifdef USE_WINDOWS_SSPI
|
||||||
|
|
||||||
SecBuffer buf;
|
SecBuffer type_1_buf;
|
||||||
SecBufferDesc desc;
|
SecBufferDesc type_1_desc;
|
||||||
SECURITY_STATUS status;
|
SECURITY_STATUS status;
|
||||||
unsigned long attrs;
|
unsigned long attrs;
|
||||||
xcharp_u useranddomain;
|
|
||||||
xcharp_u user, dup_user;
|
|
||||||
xcharp_u domain, dup_domain;
|
|
||||||
xcharp_u passwd, dup_passwd;
|
|
||||||
size_t domlen = 0;
|
|
||||||
TimeStamp tsDummy; /* For Windows 9x compatibility of SSPI calls */
|
TimeStamp tsDummy; /* For Windows 9x compatibility of SSPI calls */
|
||||||
|
|
||||||
domain.const_tchar_ptr = TEXT("");
|
|
||||||
|
|
||||||
Curl_ntlm_sspi_cleanup(ntlm);
|
Curl_ntlm_sspi_cleanup(ntlm);
|
||||||
|
|
||||||
if(userp && *userp) {
|
if(userp && *userp) {
|
||||||
|
CURLcode result;
|
||||||
|
|
||||||
/* null initialize ntlm identity's data to allow proper cleanup */
|
/* Populate our identity structure */
|
||||||
|
result = Curl_create_sspi_identity(userp, passwdp, &ntlm->identity);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* Allow proper cleanup of the identity structure */
|
||||||
ntlm->p_identity = &ntlm->identity;
|
ntlm->p_identity = &ntlm->identity;
|
||||||
memset(ntlm->p_identity, 0, sizeof(*ntlm->p_identity));
|
|
||||||
|
|
||||||
useranddomain.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)userp);
|
|
||||||
if(!useranddomain.tchar_ptr)
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('\\'));
|
|
||||||
if(!user.const_tchar_ptr)
|
|
||||||
user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('/'));
|
|
||||||
|
|
||||||
if(user.tchar_ptr) {
|
|
||||||
domain.tchar_ptr = useranddomain.tchar_ptr;
|
|
||||||
domlen = user.tchar_ptr - useranddomain.tchar_ptr;
|
|
||||||
user.tchar_ptr++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
user.tchar_ptr = useranddomain.tchar_ptr;
|
|
||||||
domain.const_tchar_ptr = TEXT("");
|
|
||||||
domlen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* setup ntlm identity's user and length */
|
|
||||||
dup_user.tchar_ptr = _tcsdup(user.tchar_ptr);
|
|
||||||
if(!dup_user.tchar_ptr) {
|
|
||||||
Curl_unicodefree(useranddomain.tchar_ptr);
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
ntlm->identity.User = dup_user.tbyte_ptr;
|
|
||||||
ntlm->identity.UserLength = curlx_uztoul(_tcslen(dup_user.tchar_ptr));
|
|
||||||
dup_user.tchar_ptr = NULL;
|
|
||||||
|
|
||||||
/* setup ntlm identity's domain and length */
|
|
||||||
dup_domain.tchar_ptr = malloc(sizeof(TCHAR) * (domlen + 1));
|
|
||||||
if(!dup_domain.tchar_ptr) {
|
|
||||||
Curl_unicodefree(useranddomain.tchar_ptr);
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
_tcsncpy(dup_domain.tchar_ptr, domain.tchar_ptr, domlen);
|
|
||||||
*(dup_domain.tchar_ptr + domlen) = TEXT('\0');
|
|
||||||
ntlm->identity.Domain = dup_domain.tbyte_ptr;
|
|
||||||
ntlm->identity.DomainLength = curlx_uztoul(domlen);
|
|
||||||
dup_domain.tchar_ptr = NULL;
|
|
||||||
|
|
||||||
Curl_unicodefree(useranddomain.tchar_ptr);
|
|
||||||
|
|
||||||
/* setup ntlm identity's password and length */
|
|
||||||
passwd.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)passwdp);
|
|
||||||
if(!passwd.tchar_ptr)
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
dup_passwd.tchar_ptr = _tcsdup(passwd.tchar_ptr);
|
|
||||||
if(!dup_passwd.tchar_ptr) {
|
|
||||||
Curl_unicodefree(passwd.tchar_ptr);
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
ntlm->identity.Password = dup_passwd.tbyte_ptr;
|
|
||||||
ntlm->identity.PasswordLength =
|
|
||||||
curlx_uztoul(_tcslen(dup_passwd.tchar_ptr));
|
|
||||||
dup_passwd.tchar_ptr = NULL;
|
|
||||||
|
|
||||||
Curl_unicodefree(passwd.tchar_ptr);
|
|
||||||
|
|
||||||
/* setup ntlm identity's flags */
|
|
||||||
ntlm->identity.Flags = SECFLAG_WINNT_AUTH_IDENTITY;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
/* Use the current Windows user */
|
||||||
ntlm->p_identity = NULL;
|
ntlm->p_identity = NULL;
|
||||||
|
|
||||||
|
/* Acquire our credientials handle */
|
||||||
status = s_pSecFn->AcquireCredentialsHandle(NULL,
|
status = s_pSecFn->AcquireCredentialsHandle(NULL,
|
||||||
(TCHAR *) TEXT("NTLM"),
|
(TCHAR *) TEXT("NTLM"),
|
||||||
SECPKG_CRED_OUTBOUND, NULL,
|
SECPKG_CRED_OUTBOUND, NULL,
|
||||||
@@ -510,13 +446,15 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
|
|||||||
if(status != SEC_E_OK)
|
if(status != SEC_E_OK)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
desc.ulVersion = SECBUFFER_VERSION;
|
/* Setup the type-1 "output" security buffer */
|
||||||
desc.cBuffers = 1;
|
type_1_desc.ulVersion = SECBUFFER_VERSION;
|
||||||
desc.pBuffers = &buf;
|
type_1_desc.cBuffers = 1;
|
||||||
buf.cbBuffer = NTLM_BUFSIZE;
|
type_1_desc.pBuffers = &type_1_buf;
|
||||||
buf.BufferType = SECBUFFER_TOKEN;
|
type_1_buf.cbBuffer = NTLM_BUFSIZE;
|
||||||
buf.pvBuffer = ntlmbuf;
|
type_1_buf.BufferType = SECBUFFER_TOKEN;
|
||||||
|
type_1_buf.pvBuffer = ntlmbuf;
|
||||||
|
|
||||||
|
/* Generate our type-1 message */
|
||||||
status = s_pSecFn->InitializeSecurityContext(&ntlm->handle, NULL,
|
status = s_pSecFn->InitializeSecurityContext(&ntlm->handle, NULL,
|
||||||
(TCHAR *) TEXT(""),
|
(TCHAR *) TEXT(""),
|
||||||
ISC_REQ_CONFIDENTIALITY |
|
ISC_REQ_CONFIDENTIALITY |
|
||||||
@@ -524,19 +462,19 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
|
|||||||
ISC_REQ_CONNECTION,
|
ISC_REQ_CONNECTION,
|
||||||
0, SECURITY_NETWORK_DREP,
|
0, SECURITY_NETWORK_DREP,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
&ntlm->c_handle, &desc,
|
&ntlm->c_handle, &type_1_desc,
|
||||||
&attrs, &tsDummy);
|
&attrs, &tsDummy);
|
||||||
|
|
||||||
if(status == SEC_I_COMPLETE_AND_CONTINUE ||
|
if(status == SEC_I_COMPLETE_AND_CONTINUE ||
|
||||||
status == SEC_I_CONTINUE_NEEDED)
|
status == SEC_I_CONTINUE_NEEDED)
|
||||||
s_pSecFn->CompleteAuthToken(&ntlm->c_handle, &desc);
|
s_pSecFn->CompleteAuthToken(&ntlm->c_handle, &type_1_desc);
|
||||||
else if(status != SEC_E_OK) {
|
else if(status != SEC_E_OK) {
|
||||||
s_pSecFn->FreeCredentialsHandle(&ntlm->handle);
|
s_pSecFn->FreeCredentialsHandle(&ntlm->handle);
|
||||||
return CURLE_RECV_ERROR;
|
return CURLE_RECV_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ntlm->has_handles = 1;
|
ntlm->has_handles = 1;
|
||||||
size = buf.cbBuffer;
|
size = type_1_buf.cbBuffer;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -668,8 +606,8 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
|
|||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
#ifdef USE_WINDOWS_SSPI
|
#ifdef USE_WINDOWS_SSPI
|
||||||
SecBuffer type_2;
|
SecBuffer type_2_buf;
|
||||||
SecBuffer type_3;
|
SecBuffer type_3_buf;
|
||||||
SecBufferDesc type_2_desc;
|
SecBufferDesc type_2_desc;
|
||||||
SecBufferDesc type_3_desc;
|
SecBufferDesc type_3_desc;
|
||||||
SECURITY_STATUS status;
|
SECURITY_STATUS status;
|
||||||
@@ -680,18 +618,23 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
|
|||||||
(void)userp;
|
(void)userp;
|
||||||
(void)data;
|
(void)data;
|
||||||
|
|
||||||
type_2_desc.ulVersion = type_3_desc.ulVersion = SECBUFFER_VERSION;
|
/* Setup the type-2 "input" security buffer */
|
||||||
type_2_desc.cBuffers = type_3_desc.cBuffers = 1;
|
type_2_desc.ulVersion = SECBUFFER_VERSION;
|
||||||
type_2_desc.pBuffers = &type_2;
|
type_2_desc.cBuffers = 1;
|
||||||
type_3_desc.pBuffers = &type_3;
|
type_2_desc.pBuffers = &type_2_buf;
|
||||||
|
type_2_buf.BufferType = SECBUFFER_TOKEN;
|
||||||
|
type_2_buf.pvBuffer = ntlm->type_2;
|
||||||
|
type_2_buf.cbBuffer = ntlm->n_type_2;
|
||||||
|
|
||||||
type_2.BufferType = SECBUFFER_TOKEN;
|
/* Setup the type-3 "output" security buffer */
|
||||||
type_2.pvBuffer = ntlm->type_2;
|
type_3_desc.ulVersion = SECBUFFER_VERSION;
|
||||||
type_2.cbBuffer = ntlm->n_type_2;
|
type_3_desc.cBuffers = 1;
|
||||||
type_3.BufferType = SECBUFFER_TOKEN;
|
type_3_desc.pBuffers = &type_3_buf;
|
||||||
type_3.pvBuffer = ntlmbuf;
|
type_3_buf.BufferType = SECBUFFER_TOKEN;
|
||||||
type_3.cbBuffer = NTLM_BUFSIZE;
|
type_3_buf.pvBuffer = ntlmbuf;
|
||||||
|
type_3_buf.cbBuffer = NTLM_BUFSIZE;
|
||||||
|
|
||||||
|
/* Generate our type-3 message */
|
||||||
status = s_pSecFn->InitializeSecurityContext(&ntlm->handle,
|
status = s_pSecFn->InitializeSecurityContext(&ntlm->handle,
|
||||||
&ntlm->c_handle,
|
&ntlm->c_handle,
|
||||||
(TCHAR *) TEXT(""),
|
(TCHAR *) TEXT(""),
|
||||||
@@ -706,7 +649,7 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
|
|||||||
if(status != SEC_E_OK)
|
if(status != SEC_E_OK)
|
||||||
return CURLE_RECV_ERROR;
|
return CURLE_RECV_ERROR;
|
||||||
|
|
||||||
size = type_3.cbBuffer;
|
size = type_3_buf.cbBuffer;
|
||||||
|
|
||||||
Curl_ntlm_sspi_cleanup(ntlm);
|
Curl_ntlm_sspi_cleanup(ntlm);
|
||||||
|
|
||||||
|
@@ -170,14 +170,6 @@ void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm);
|
|||||||
#define NTLMFLAG_NEGOTIATE_56 (1<<31)
|
#define NTLMFLAG_NEGOTIATE_56 (1<<31)
|
||||||
/* Indicates that 56-bit encryption is supported. */
|
/* Indicates that 56-bit encryption is supported. */
|
||||||
|
|
||||||
#ifdef UNICODE
|
|
||||||
# define SECFLAG_WINNT_AUTH_IDENTITY \
|
|
||||||
(unsigned long)SEC_WINNT_AUTH_IDENTITY_UNICODE
|
|
||||||
#else
|
|
||||||
# define SECFLAG_WINNT_AUTH_IDENTITY \
|
|
||||||
(unsigned long)SEC_WINNT_AUTH_IDENTITY_ANSI
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* BUILDING_CURL_NTLM_MSGS_C */
|
#endif /* BUILDING_CURL_NTLM_MSGS_C */
|
||||||
|
|
||||||
#endif /* USE_NTLM */
|
#endif /* USE_NTLM */
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2012 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
* Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
|
* Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
@@ -240,7 +241,7 @@ static CURLcode rtmp_do(struct connectdata *conn, bool *done)
|
|||||||
return CURLE_FAILED_INIT;
|
return CURLE_FAILED_INIT;
|
||||||
|
|
||||||
if(conn->data->set.upload) {
|
if(conn->data->set.upload) {
|
||||||
Curl_pgrsSetUploadSize(conn->data, conn->data->set.infilesize);
|
Curl_pgrsSetUploadSize(conn->data, conn->data->state.infilesize);
|
||||||
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
113
lib/curl_sasl.c
113
lib/curl_sasl.c
@@ -40,6 +40,8 @@
|
|||||||
#include "curl_sasl.h"
|
#include "curl_sasl.h"
|
||||||
#include "warnless.h"
|
#include "warnless.h"
|
||||||
#include "curl_memory.h"
|
#include "curl_memory.h"
|
||||||
|
#include "strtok.h"
|
||||||
|
#include "rawstr.h"
|
||||||
|
|
||||||
#ifdef USE_NSS
|
#ifdef USE_NSS
|
||||||
#include "vtls/nssg.h" /* for Curl_nss_force_init() */
|
#include "vtls/nssg.h" /* for Curl_nss_force_init() */
|
||||||
@@ -51,7 +53,15 @@
|
|||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
#if !defined(CURL_DISABLE_CRYPTO_AUTH) && !defined(USE_WINDOWS_SSPI)
|
||||||
|
#define DIGEST_QOP_VALUE_AUTH (1 << 0)
|
||||||
|
#define DIGEST_QOP_VALUE_AUTH_INT (1 << 1)
|
||||||
|
#define DIGEST_QOP_VALUE_AUTH_CONF (1 << 2)
|
||||||
|
|
||||||
|
#define DIGEST_QOP_VALUE_STRING_AUTH "auth"
|
||||||
|
#define DIGEST_QOP_VALUE_STRING_AUTH_INT "auth-int"
|
||||||
|
#define DIGEST_QOP_VALUE_STRING_AUTH_CONF "auth-conf"
|
||||||
|
|
||||||
/* Retrieves the value for a corresponding key from the challenge string
|
/* Retrieves the value for a corresponding key from the challenge string
|
||||||
* returns TRUE if the key could be found, FALSE if it does not exists
|
* returns TRUE if the key could be found, FALSE if it does not exists
|
||||||
*/
|
*/
|
||||||
@@ -76,6 +86,38 @@ static bool sasl_digest_get_key_value(const char *chlg,
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CURLcode sasl_digest_get_qop_values(const char *options, int *value)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
char *token;
|
||||||
|
char *tok_buf;
|
||||||
|
|
||||||
|
/* Initialise the output */
|
||||||
|
*value = 0;
|
||||||
|
|
||||||
|
/* Tokenise the list of qop values. Use a temporary clone of the buffer since
|
||||||
|
strtok_r() ruins it. */
|
||||||
|
tmp = strdup(options);
|
||||||
|
if(!tmp)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
token = strtok_r(tmp, ",", &tok_buf);
|
||||||
|
while(token != NULL) {
|
||||||
|
if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH))
|
||||||
|
*value |= DIGEST_QOP_VALUE_AUTH;
|
||||||
|
else if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH_INT))
|
||||||
|
*value |= DIGEST_QOP_VALUE_AUTH_INT;
|
||||||
|
else if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH_CONF))
|
||||||
|
*value |= DIGEST_QOP_VALUE_AUTH_CONF;
|
||||||
|
|
||||||
|
token = strtok_r(NULL, ",", &tok_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
Curl_safefree(tmp);
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -263,10 +305,12 @@ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef USE_WINDOWS_SSPI
|
||||||
/*
|
/*
|
||||||
* Curl_sasl_decode_digest_md5_message()
|
* sasl_decode_digest_md5_message()
|
||||||
*
|
*
|
||||||
* This is used to decode an already encoded DIGEST-MD5 challenge message.
|
* This is used internally to decode an already encoded DIGEST-MD5 challenge
|
||||||
|
* message into the seperate attributes.
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
@@ -277,19 +321,23 @@ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data,
|
|||||||
* rlen [in] - The length of the realm buffer.
|
* rlen [in] - The length of the realm buffer.
|
||||||
* alg [in/out] - The buffer where the algorithm will be stored.
|
* alg [in/out] - The buffer where the algorithm will be stored.
|
||||||
* alen [in] - The length of the algorithm buffer.
|
* alen [in] - The length of the algorithm buffer.
|
||||||
|
* qop [in/out] - The buffer where the qop-options will be stored.
|
||||||
|
* qlen [in] - The length of the qop buffer.
|
||||||
*
|
*
|
||||||
* Returns CURLE_OK on success.
|
* Returns CURLE_OK on success.
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_sasl_decode_digest_md5_message(const char *chlg64,
|
static CURLcode sasl_decode_digest_md5_message(const char *chlg64,
|
||||||
char *nonce, size_t nlen,
|
char *nonce, size_t nlen,
|
||||||
char *realm, size_t rlen,
|
char *realm, size_t rlen,
|
||||||
char *alg, size_t alen)
|
char *alg, size_t alen,
|
||||||
|
char *qop, size_t qlen)
|
||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
unsigned char *chlg = NULL;
|
unsigned char *chlg = NULL;
|
||||||
size_t chlglen = 0;
|
size_t chlglen = 0;
|
||||||
size_t chlg64len = strlen(chlg64);
|
size_t chlg64len = strlen(chlg64);
|
||||||
|
|
||||||
|
/* Decode the base-64 encoded challenge message */
|
||||||
if(chlg64len && *chlg64 != '=') {
|
if(chlg64len && *chlg64 != '=') {
|
||||||
result = Curl_base64_decode(chlg64, &chlg, &chlglen);
|
result = Curl_base64_decode(chlg64, &chlg, &chlglen);
|
||||||
if(result)
|
if(result)
|
||||||
@@ -318,6 +366,12 @@ CURLcode Curl_sasl_decode_digest_md5_message(const char *chlg64,
|
|||||||
return CURLE_BAD_CONTENT_ENCODING;
|
return CURLE_BAD_CONTENT_ENCODING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Retrieve qop-options string from the challenge */
|
||||||
|
if(!sasl_digest_get_key_value((char *)chlg, "qop=\"", qop, qlen, '\"')) {
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
return CURLE_BAD_CONTENT_ENCODING;
|
||||||
|
}
|
||||||
|
|
||||||
Curl_safefree(chlg);
|
Curl_safefree(chlg);
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
@@ -332,8 +386,7 @@ CURLcode Curl_sasl_decode_digest_md5_message(const char *chlg64,
|
|||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
* data [in] - The session handle.
|
* data [in] - The session handle.
|
||||||
* nonce [in] - The nonce.
|
* chlg64 [in] - Pointer to the base64 encoded challenge message.
|
||||||
* realm [in] - The realm.
|
|
||||||
* userp [in] - The user name.
|
* userp [in] - The user name.
|
||||||
* passdwp [in] - The user's password.
|
* passdwp [in] - The user's password.
|
||||||
* service [in] - The service type such as www, smtp, pop or imap.
|
* service [in] - The service type such as www, smtp, pop or imap.
|
||||||
@@ -344,8 +397,7 @@ CURLcode Curl_sasl_decode_digest_md5_message(const char *chlg64,
|
|||||||
* Returns CURLE_OK on success.
|
* Returns CURLE_OK on success.
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
||||||
const char *nonce,
|
const char *chlg64,
|
||||||
const char *realm,
|
|
||||||
const char *userp,
|
const char *userp,
|
||||||
const char *passwdp,
|
const char *passwdp,
|
||||||
const char *service,
|
const char *service,
|
||||||
@@ -363,12 +415,39 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
|||||||
char HA2_hex[2 * MD5_DIGEST_LEN + 1];
|
char HA2_hex[2 * MD5_DIGEST_LEN + 1];
|
||||||
char resp_hash_hex[2 * MD5_DIGEST_LEN + 1];
|
char resp_hash_hex[2 * MD5_DIGEST_LEN + 1];
|
||||||
|
|
||||||
|
char nonce[64];
|
||||||
|
char realm[128];
|
||||||
|
char algorithm[64];
|
||||||
|
char qop_options[64];
|
||||||
|
int qop_values;
|
||||||
|
|
||||||
char nonceCount[] = "00000001";
|
char nonceCount[] = "00000001";
|
||||||
char cnonce[] = "12345678"; /* will be changed */
|
char cnonce[] = "12345678"; /* will be changed */
|
||||||
char method[] = "AUTHENTICATE";
|
char method[] = "AUTHENTICATE";
|
||||||
char qop[] = "auth";
|
char qop[] = DIGEST_QOP_VALUE_STRING_AUTH;
|
||||||
char uri[128];
|
char uri[128];
|
||||||
|
|
||||||
|
/* Decode the challange message */
|
||||||
|
result = sasl_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
|
||||||
|
realm, sizeof(realm),
|
||||||
|
algorithm, sizeof(algorithm),
|
||||||
|
qop_options, sizeof(qop_options));
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* We only support md5 sessions */
|
||||||
|
if(strcmp(algorithm, "md5-sess") != 0)
|
||||||
|
return CURLE_BAD_CONTENT_ENCODING;
|
||||||
|
|
||||||
|
/* Get the qop-values from the qop-options */
|
||||||
|
result = sasl_digest_get_qop_values(qop_options, &qop_values);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* We only support auth quality-of-protection */
|
||||||
|
if(!(qop_values & DIGEST_QOP_VALUE_AUTH))
|
||||||
|
return CURLE_BAD_CONTENT_ENCODING;
|
||||||
|
|
||||||
#ifndef DEBUGBUILD
|
#ifndef DEBUGBUILD
|
||||||
/* Generate 64 bits of random data */
|
/* Generate 64 bits of random data */
|
||||||
for(i = 0; i < 8; i++)
|
for(i = 0; i < 8; i++)
|
||||||
@@ -454,9 +533,11 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
|||||||
|
|
||||||
/* Generate the response */
|
/* Generate the response */
|
||||||
response = aprintf("username=\"%s\",realm=\"%s\",nonce=\"%s\","
|
response = aprintf("username=\"%s\",realm=\"%s\",nonce=\"%s\","
|
||||||
"cnonce=\"%s\",nc=\"%s\",digest-uri=\"%s\",response=%s",
|
"cnonce=\"%s\",nc=\"%s\",digest-uri=\"%s\",response=%s,"
|
||||||
|
"qop=%s",
|
||||||
userp, realm, nonce,
|
userp, realm, nonce,
|
||||||
cnonce, nonceCount, uri, resp_hash_hex);
|
cnonce, nonceCount, uri, resp_hash_hex,
|
||||||
|
qop);
|
||||||
if(!response)
|
if(!response)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -467,7 +548,9 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* USE_WINDOWS_SSPI */
|
||||||
|
|
||||||
|
#endif /* CURL_DISABLE_CRYPTO_AUTH */
|
||||||
|
|
||||||
#ifdef USE_NTLM
|
#ifdef USE_NTLM
|
||||||
/*
|
/*
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2012 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -22,7 +22,11 @@
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "pingpong.h"
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
struct SessionHandle;
|
||||||
|
struct connectdata;
|
||||||
|
struct ntlmdata;
|
||||||
|
|
||||||
/* Authentication mechanism values */
|
/* Authentication mechanism values */
|
||||||
#define SASL_AUTH_NONE 0
|
#define SASL_AUTH_NONE 0
|
||||||
@@ -77,17 +81,10 @@ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data,
|
|||||||
const char *passwdp,
|
const char *passwdp,
|
||||||
char **outptr, size_t *outlen);
|
char **outptr, size_t *outlen);
|
||||||
|
|
||||||
/* This is used to decode a base64 encoded DIGEST-MD5 challange message */
|
|
||||||
CURLcode Curl_sasl_decode_digest_md5_message(const char *chlg64,
|
|
||||||
char *nonce, size_t nlen,
|
|
||||||
char *realm, size_t rlen,
|
|
||||||
char *alg, size_t alen);
|
|
||||||
|
|
||||||
/* This is used to generate a base64 encoded DIGEST-MD5 response message */
|
/* This is used to generate a base64 encoded DIGEST-MD5 response message */
|
||||||
CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
||||||
const char *nonce,
|
const char *chlg64,
|
||||||
const char *realm,
|
const char *userp,
|
||||||
const char *user,
|
|
||||||
const char *passwdp,
|
const char *passwdp,
|
||||||
const char *service,
|
const char *service,
|
||||||
char **outptr, size_t *outlen);
|
char **outptr, size_t *outlen);
|
||||||
|
200
lib/curl_sasl_sspi.c
Normal file
200
lib/curl_sasl_sspi.c
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 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.
|
||||||
|
*
|
||||||
|
* RFC2831 DIGEST-MD5 authentication
|
||||||
|
* RFC4422 Simple Authentication and Security Layer (SASL)
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "curl_setup.h"
|
||||||
|
|
||||||
|
#if defined(USE_WINDOWS_SSPI) && !defined(CURL_DISABLE_CRYPTO_AUTH)
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#include "curl_sasl.h"
|
||||||
|
#include "urldata.h"
|
||||||
|
#include "curl_base64.h"
|
||||||
|
#include "warnless.h"
|
||||||
|
#include "curl_memory.h"
|
||||||
|
|
||||||
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
|
#include <curl/mprintf.h>
|
||||||
|
|
||||||
|
/* The last #include file should be: */
|
||||||
|
#include "memdebug.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Curl_sasl_create_digest_md5_message()
|
||||||
|
*
|
||||||
|
* This is used to generate an already encoded DIGEST-MD5 response message
|
||||||
|
* ready for sending to the recipient.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
*
|
||||||
|
* data [in] - The session handle.
|
||||||
|
* chlg64 [in] - Pointer to the base64 encoded challenge message.
|
||||||
|
* userp [in] - The user name.
|
||||||
|
* passdwp [in] - The user's password.
|
||||||
|
* service [in] - The service type such as www, smtp, pop or imap.
|
||||||
|
* outptr [in/out] - The address where a pointer to newly allocated memory
|
||||||
|
* holding the result will be stored upon completion.
|
||||||
|
* outlen [out] - The length of the output message.
|
||||||
|
*
|
||||||
|
* Returns CURLE_OK on success.
|
||||||
|
*/
|
||||||
|
CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
|
||||||
|
const char *chlg64,
|
||||||
|
const char *userp,
|
||||||
|
const char *passwdp,
|
||||||
|
const char *service,
|
||||||
|
char **outptr, size_t *outlen)
|
||||||
|
{
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
char *spn = NULL;
|
||||||
|
size_t chlglen = 0;
|
||||||
|
unsigned char *chlg = NULL;
|
||||||
|
unsigned char resp[1024];
|
||||||
|
CredHandle handle;
|
||||||
|
CtxtHandle ctx;
|
||||||
|
PSecPkgInfo SecurityPackage;
|
||||||
|
SEC_WINNT_AUTH_IDENTITY identity;
|
||||||
|
SecBuffer chlg_buf;
|
||||||
|
SecBuffer resp_buf;
|
||||||
|
SecBufferDesc chlg_desc;
|
||||||
|
SecBufferDesc resp_desc;
|
||||||
|
SECURITY_STATUS status;
|
||||||
|
unsigned long attrs;
|
||||||
|
TimeStamp tsDummy; /* For Windows 9x compatibility of SSPI calls */
|
||||||
|
|
||||||
|
/* Decode the base-64 encoded challenge message */
|
||||||
|
if(strlen(chlg64) && *chlg64 != '=') {
|
||||||
|
result = Curl_base64_decode(chlg64, &chlg, &chlglen);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure we have a valid challenge message */
|
||||||
|
if(!chlg)
|
||||||
|
return CURLE_BAD_CONTENT_ENCODING;
|
||||||
|
|
||||||
|
/* Ensure we have some login credientials as DigestSSP cannot use the current
|
||||||
|
Windows user like NTLMSSP can */
|
||||||
|
if(!userp || !*userp) {
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
return CURLE_LOGIN_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Query the security package for DigestSSP */
|
||||||
|
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT("WDigest"),
|
||||||
|
&SecurityPackage);
|
||||||
|
if(status != SEC_E_OK) {
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
return CURLE_NOT_BUILT_IN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate our SPN */
|
||||||
|
spn = aprintf("%s/%s", service, data->easy_conn->host);
|
||||||
|
if(!spn)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
/* Populate our identity structure */
|
||||||
|
result = Curl_create_sspi_identity(userp, passwdp, &identity);
|
||||||
|
if(result) {
|
||||||
|
Curl_safefree(spn);
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Acquire our credientials handle */
|
||||||
|
status = s_pSecFn->AcquireCredentialsHandle(NULL,
|
||||||
|
(TCHAR *) TEXT("WDigest"),
|
||||||
|
SECPKG_CRED_OUTBOUND, NULL,
|
||||||
|
&identity, NULL, NULL,
|
||||||
|
&handle, &tsDummy);
|
||||||
|
|
||||||
|
if(status != SEC_E_OK) {
|
||||||
|
Curl_sspi_free_identity(&identity);
|
||||||
|
Curl_safefree(spn);
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup the challenge "input" security buffer */
|
||||||
|
chlg_desc.ulVersion = SECBUFFER_VERSION;
|
||||||
|
chlg_desc.cBuffers = 1;
|
||||||
|
chlg_desc.pBuffers = &chlg_buf;
|
||||||
|
chlg_buf.BufferType = SECBUFFER_TOKEN;
|
||||||
|
chlg_buf.pvBuffer = chlg;
|
||||||
|
chlg_buf.cbBuffer = curlx_uztoul(chlglen);
|
||||||
|
|
||||||
|
/* Setup the response "output" security buffer */
|
||||||
|
resp_desc.ulVersion = SECBUFFER_VERSION;
|
||||||
|
resp_desc.cBuffers = 1;
|
||||||
|
resp_desc.pBuffers = &resp_buf;
|
||||||
|
resp_buf.BufferType = SECBUFFER_TOKEN;
|
||||||
|
resp_buf.pvBuffer = resp;
|
||||||
|
resp_buf.cbBuffer = sizeof(resp);
|
||||||
|
|
||||||
|
/* Generate our challenge-response message */
|
||||||
|
status = s_pSecFn->InitializeSecurityContext(&handle,
|
||||||
|
NULL,
|
||||||
|
(TCHAR *) spn,
|
||||||
|
0, 0, 0,
|
||||||
|
&chlg_desc,
|
||||||
|
0, &ctx,
|
||||||
|
&resp_desc,
|
||||||
|
&attrs, &tsDummy);
|
||||||
|
|
||||||
|
if(status == SEC_I_COMPLETE_AND_CONTINUE ||
|
||||||
|
status == SEC_I_CONTINUE_NEEDED)
|
||||||
|
s_pSecFn->CompleteAuthToken(&handle, &resp_desc);
|
||||||
|
else if(status != SEC_E_OK) {
|
||||||
|
s_pSecFn->FreeCredentialsHandle(&handle);
|
||||||
|
Curl_sspi_free_identity(&identity);
|
||||||
|
Curl_safefree(spn);
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
|
||||||
|
return CURLE_RECV_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Base64 encode the response */
|
||||||
|
result = Curl_base64_encode(data, (char *)resp, resp_buf.cbBuffer, outptr,
|
||||||
|
outlen);
|
||||||
|
|
||||||
|
/* Free our handles */
|
||||||
|
s_pSecFn->DeleteSecurityContext(&ctx);
|
||||||
|
s_pSecFn->FreeCredentialsHandle(&handle);
|
||||||
|
|
||||||
|
/* Free the identity structure */
|
||||||
|
Curl_sspi_free_identity(&identity);
|
||||||
|
|
||||||
|
/* Free the SPN */
|
||||||
|
Curl_safefree(spn);
|
||||||
|
|
||||||
|
/* Free the decoeded challenge message */
|
||||||
|
Curl_safefree(chlg);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* USE_WINDOWS_SSPI && !CURL_DISABLE_CRYPTO_AUTH */
|
104
lib/curl_sspi.c
104
lib/curl_sspi.c
@@ -32,6 +32,9 @@
|
|||||||
#include <curl/mprintf.h>
|
#include <curl/mprintf.h>
|
||||||
|
|
||||||
#include "curl_memory.h"
|
#include "curl_memory.h"
|
||||||
|
#include "curl_multibyte.h"
|
||||||
|
#include "warnless.h"
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
@@ -150,4 +153,105 @@ void Curl_sspi_global_cleanup(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Curl_create_sspi_identity()
|
||||||
|
*
|
||||||
|
* This is used to populate a SSPI identity structure based on the supplied
|
||||||
|
* username and password.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
*
|
||||||
|
* userp [in] - The user name in the format User or Domain\User.
|
||||||
|
* passdwp [in] - The user's password.
|
||||||
|
* identity [in/out] - The identity structure.
|
||||||
|
*
|
||||||
|
* Returns CURLE_OK on success.
|
||||||
|
*/
|
||||||
|
CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp,
|
||||||
|
SEC_WINNT_AUTH_IDENTITY *identity)
|
||||||
|
{
|
||||||
|
xcharp_u useranddomain;
|
||||||
|
xcharp_u user, dup_user;
|
||||||
|
xcharp_u domain, dup_domain;
|
||||||
|
xcharp_u passwd, dup_passwd;
|
||||||
|
size_t domlen = 0;
|
||||||
|
|
||||||
|
domain.const_tchar_ptr = TEXT("");
|
||||||
|
|
||||||
|
/* Initialize the identity */
|
||||||
|
memset(identity, 0, sizeof(*identity));
|
||||||
|
|
||||||
|
useranddomain.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)userp);
|
||||||
|
if(!useranddomain.tchar_ptr)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('\\'));
|
||||||
|
if(!user.const_tchar_ptr)
|
||||||
|
user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('/'));
|
||||||
|
|
||||||
|
if(user.tchar_ptr) {
|
||||||
|
domain.tchar_ptr = useranddomain.tchar_ptr;
|
||||||
|
domlen = user.tchar_ptr - useranddomain.tchar_ptr;
|
||||||
|
user.tchar_ptr++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
user.tchar_ptr = useranddomain.tchar_ptr;
|
||||||
|
domain.const_tchar_ptr = TEXT("");
|
||||||
|
domlen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup the identity's user and length */
|
||||||
|
dup_user.tchar_ptr = _tcsdup(user.tchar_ptr);
|
||||||
|
if(!dup_user.tchar_ptr) {
|
||||||
|
Curl_unicodefree(useranddomain.tchar_ptr);
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
identity->User = dup_user.tbyte_ptr;
|
||||||
|
identity->UserLength = curlx_uztoul(_tcslen(dup_user.tchar_ptr));
|
||||||
|
dup_user.tchar_ptr = NULL;
|
||||||
|
|
||||||
|
/* Setup the identity's domain and length */
|
||||||
|
dup_domain.tchar_ptr = malloc(sizeof(TCHAR) * (domlen + 1));
|
||||||
|
if(!dup_domain.tchar_ptr) {
|
||||||
|
Curl_unicodefree(useranddomain.tchar_ptr);
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
_tcsncpy(dup_domain.tchar_ptr, domain.tchar_ptr, domlen);
|
||||||
|
*(dup_domain.tchar_ptr + domlen) = TEXT('\0');
|
||||||
|
identity->Domain = dup_domain.tbyte_ptr;
|
||||||
|
identity->DomainLength = curlx_uztoul(domlen);
|
||||||
|
dup_domain.tchar_ptr = NULL;
|
||||||
|
|
||||||
|
Curl_unicodefree(useranddomain.tchar_ptr);
|
||||||
|
|
||||||
|
/* Setup ntlm identity's password and length */
|
||||||
|
passwd.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)passwdp);
|
||||||
|
if(!passwd.tchar_ptr)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
dup_passwd.tchar_ptr = _tcsdup(passwd.tchar_ptr);
|
||||||
|
if(!dup_passwd.tchar_ptr) {
|
||||||
|
Curl_unicodefree(passwd.tchar_ptr);
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
identity->Password = dup_passwd.tbyte_ptr;
|
||||||
|
identity->PasswordLength = curlx_uztoul(_tcslen(dup_passwd.tchar_ptr));
|
||||||
|
dup_passwd.tchar_ptr = NULL;
|
||||||
|
|
||||||
|
Curl_unicodefree(passwd.tchar_ptr);
|
||||||
|
|
||||||
|
/* Setup the identity's flags */
|
||||||
|
identity->Flags = SECFLAG_WINNT_AUTH_IDENTITY;
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Curl_sspi_free_identity(SEC_WINNT_AUTH_IDENTITY *identity)
|
||||||
|
{
|
||||||
|
if(identity) {
|
||||||
|
Curl_safefree(identity->User);
|
||||||
|
Curl_safefree(identity->Password);
|
||||||
|
Curl_safefree(identity->Domain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* USE_WINDOWS_SSPI */
|
#endif /* USE_WINDOWS_SSPI */
|
||||||
|
@@ -43,6 +43,13 @@
|
|||||||
CURLcode Curl_sspi_global_init(void);
|
CURLcode Curl_sspi_global_init(void);
|
||||||
void Curl_sspi_global_cleanup(void);
|
void Curl_sspi_global_cleanup(void);
|
||||||
|
|
||||||
|
/* This is used to generate an SSPI identity structure */
|
||||||
|
CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp,
|
||||||
|
SEC_WINNT_AUTH_IDENTITY *identity);
|
||||||
|
|
||||||
|
/* This is used to free an SSPI identity structure */
|
||||||
|
void Curl_sspi_free_identity(SEC_WINNT_AUTH_IDENTITY *identity);
|
||||||
|
|
||||||
/* Forward-declaration of global variables defined in curl_sspi.c */
|
/* Forward-declaration of global variables defined in curl_sspi.c */
|
||||||
|
|
||||||
extern HMODULE s_hSecDll;
|
extern HMODULE s_hSecDll;
|
||||||
@@ -289,5 +296,13 @@ extern PSecurityFunctionTable s_pSecFn;
|
|||||||
# define SEC_I_SIGNATURE_NEEDED ((HRESULT)0x0009035CL)
|
# define SEC_I_SIGNATURE_NEEDED ((HRESULT)0x0009035CL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef UNICODE
|
||||||
|
# define SECFLAG_WINNT_AUTH_IDENTITY \
|
||||||
|
(unsigned long)SEC_WINNT_AUTH_IDENTITY_UNICODE
|
||||||
|
#else
|
||||||
|
# define SECFLAG_WINNT_AUTH_IDENTITY \
|
||||||
|
(unsigned long)SEC_WINNT_AUTH_IDENTITY_ANSI
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* USE_WINDOWS_SSPI */
|
#endif /* USE_WINDOWS_SSPI */
|
||||||
#endif /* HEADER_CURL_SSPI_H */
|
#endif /* HEADER_CURL_SSPI_H */
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
*
|
*
|
||||||
* an allocated dedotdotified output string
|
* an allocated dedotdotified output string
|
||||||
*/
|
*/
|
||||||
char *Curl_dedotdotify(char *input)
|
char *Curl_dedotdotify(const char *input)
|
||||||
{
|
{
|
||||||
size_t inlen = strlen(input);
|
size_t inlen = strlen(input);
|
||||||
char *clone;
|
char *clone;
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -21,5 +21,5 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
char *Curl_dedotdotify(char *input);
|
char *Curl_dedotdotify(const char *input);
|
||||||
#endif
|
#endif
|
||||||
|
12
lib/easy.c
12
lib/easy.c
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -299,9 +299,13 @@ CURLcode curl_global_init_mem(long flags, curl_malloc_callback m,
|
|||||||
if(!m || !f || !r || !s || !c)
|
if(!m || !f || !r || !s || !c)
|
||||||
return CURLE_FAILED_INIT;
|
return CURLE_FAILED_INIT;
|
||||||
|
|
||||||
/* Already initialized, don't do it again */
|
if(initialized) {
|
||||||
if(initialized)
|
/* Already initialized, don't do it again, but bump the variable anyway to
|
||||||
|
work like curl_global_init() and require the same amount of cleanup
|
||||||
|
calls. */
|
||||||
|
initialized++;
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* Call the actual init function first */
|
/* Call the actual init function first */
|
||||||
code = curl_global_init(flags);
|
code = curl_global_init(flags);
|
||||||
@@ -756,7 +760,7 @@ static CURLcode easy_perform(struct SessionHandle *data, bool events)
|
|||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
|
||||||
if(data->multi) {
|
if(data->multi) {
|
||||||
failf(data, "easy handled already used in multi handle");
|
failf(data, "easy handle already used in multi handle");
|
||||||
return CURLE_FAILED_INIT;
|
return CURLE_FAILED_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -336,9 +336,9 @@ static CURLcode file_upload(struct connectdata *conn)
|
|||||||
return CURLE_WRITE_ERROR;
|
return CURLE_WRITE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(-1 != data->set.infilesize)
|
if(-1 != data->state.infilesize)
|
||||||
/* known size of data to "upload" */
|
/* known size of data to "upload" */
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
|
|
||||||
/* treat the negative resume offset value as the case of "-" */
|
/* treat the negative resume offset value as the case of "-" */
|
||||||
if(data->state.resume_from < 0) {
|
if(data->state.resume_from < 0) {
|
||||||
|
41
lib/ftp.c
41
lib/ftp.c
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -208,7 +208,7 @@ const struct Curl_handler Curl_handler_ftps = {
|
|||||||
ftp_disconnect, /* disconnect */
|
ftp_disconnect, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_FTPS, /* defport */
|
PORT_FTPS, /* defport */
|
||||||
CURLPROTO_FTP | CURLPROTO_FTPS, /* protocol */
|
CURLPROTO_FTPS, /* protocol */
|
||||||
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
|
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
|
||||||
PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY /* flags */
|
PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY /* flags */
|
||||||
};
|
};
|
||||||
@@ -507,7 +507,7 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
|
|||||||
/* When we know we're uploading a specified file, we can get the file
|
/* When we know we're uploading a specified file, we can get the file
|
||||||
size prior to the actual upload. */
|
size prior to the actual upload. */
|
||||||
|
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
|
|
||||||
/* set the SO_SNDBUF for the secondary socket for those who need it */
|
/* set the SO_SNDBUF for the secondary socket for those who need it */
|
||||||
Curl_sndbufset(conn->sock[SECONDARYSOCKET]);
|
Curl_sndbufset(conn->sock[SECONDARYSOCKET]);
|
||||||
@@ -877,13 +877,30 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if(FTP_STOP == ftpc->state) {
|
if(FTP_STOP == ftpc->state) {
|
||||||
|
int bits = GETSOCK_READSOCK(0);
|
||||||
|
|
||||||
/* if stopped and still in this state, then we're also waiting for a
|
/* if stopped and still in this state, then we're also waiting for a
|
||||||
connect on the secondary connection */
|
connect on the secondary connection */
|
||||||
socks[0] = conn->sock[FIRSTSOCKET];
|
socks[0] = conn->sock[FIRSTSOCKET];
|
||||||
socks[1] = conn->sock[SECONDARYSOCKET];
|
|
||||||
|
|
||||||
return GETSOCK_READSOCK(FIRSTSOCKET) |
|
if(!conn->data->set.ftp_use_port) {
|
||||||
GETSOCK_WRITESOCK(SECONDARYSOCKET);
|
int s;
|
||||||
|
int i;
|
||||||
|
/* PORT is used to tell the server to connect to us, and during that we
|
||||||
|
don't do happy eyeballs, but we do if we connect to the server */
|
||||||
|
for(s=1, i=0; i<2; i++) {
|
||||||
|
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
|
||||||
|
socks[s] = conn->tempsock[i];
|
||||||
|
bits |= GETSOCK_WRITESOCK(s++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
socks[1] = conn->sock[SECONDARYSOCKET];
|
||||||
|
bits |= GETSOCK_WRITESOCK(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bits;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
|
return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
|
||||||
@@ -1666,10 +1683,10 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* now, decrease the size of the read */
|
/* now, decrease the size of the read */
|
||||||
if(data->set.infilesize>0) {
|
if(data->state.infilesize>0) {
|
||||||
data->set.infilesize -= data->state.resume_from;
|
data->state.infilesize -= data->state.resume_from;
|
||||||
|
|
||||||
if(data->set.infilesize <= 0) {
|
if(data->state.infilesize <= 0) {
|
||||||
infof(data, "File already completely uploaded\n");
|
infof(data, "File already completely uploaded\n");
|
||||||
|
|
||||||
/* no data to transfer */
|
/* no data to transfer */
|
||||||
@@ -3365,13 +3382,13 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
|
|||||||
use checking further */
|
use checking further */
|
||||||
;
|
;
|
||||||
else if(data->set.upload) {
|
else if(data->set.upload) {
|
||||||
if((-1 != data->set.infilesize) &&
|
if((-1 != data->state.infilesize) &&
|
||||||
(data->set.infilesize != *ftp->bytecountp) &&
|
(data->state.infilesize != *ftp->bytecountp) &&
|
||||||
!data->set.crlf &&
|
!data->set.crlf &&
|
||||||
(ftp->transfer == FTPTRANSFER_BODY)) {
|
(ftp->transfer == FTPTRANSFER_BODY)) {
|
||||||
failf(data, "Uploaded unaligned file size (%" CURL_FORMAT_CURL_OFF_T
|
failf(data, "Uploaded unaligned file size (%" CURL_FORMAT_CURL_OFF_T
|
||||||
" out of %" CURL_FORMAT_CURL_OFF_T " bytes)",
|
" out of %" CURL_FORMAT_CURL_OFF_T " bytes)",
|
||||||
*ftp->bytecountp, data->set.infilesize);
|
*ftp->bytecountp, data->state.infilesize);
|
||||||
result = CURLE_PARTIAL_FILE;
|
result = CURLE_PARTIAL_FILE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -325,7 +325,6 @@ static CURLcode getinfo_slist(struct SessionHandle *data, CURLINFO info,
|
|||||||
to return from 'struct ssl_connect_data'; thus, for now we keep the
|
to return from 'struct ssl_connect_data'; thus, for now we keep the
|
||||||
backend as CURLSSLBACKEND_NONE in those cases, which should be
|
backend as CURLSSLBACKEND_NONE in those cases, which should be
|
||||||
interpreted as "not supported" */
|
interpreted as "not supported" */
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -26,6 +26,10 @@
|
|||||||
defined(USE_GSKIT)
|
defined(USE_GSKIT)
|
||||||
/* these backends use functions from this file */
|
/* these backends use functions from this file */
|
||||||
|
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "hostcheck.h"
|
#include "hostcheck.h"
|
||||||
#include "rawstr.h"
|
#include "rawstr.h"
|
||||||
#include "inet_pton.h"
|
#include "inet_pton.h"
|
||||||
|
280
lib/http.c
280
lib/http.c
@@ -121,7 +121,7 @@ const struct Curl_handler Curl_handler_http = {
|
|||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_HTTP, /* defport */
|
PORT_HTTP, /* defport */
|
||||||
CURLPROTO_HTTP, /* protocol */
|
CURLPROTO_HTTP, /* protocol */
|
||||||
PROTOPT_NONE /* flags */
|
PROTOPT_CREDSPERREQUEST /* flags */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef USE_SSL
|
#ifdef USE_SSL
|
||||||
@@ -144,7 +144,7 @@ const struct Curl_handler Curl_handler_https = {
|
|||||||
ZERO_NULL, /* disconnect */
|
ZERO_NULL, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_HTTPS, /* defport */
|
PORT_HTTPS, /* defport */
|
||||||
CURLPROTO_HTTP | CURLPROTO_HTTPS, /* protocol */
|
CURLPROTO_HTTPS, /* protocol */
|
||||||
PROTOPT_SSL | PROTOPT_CREDSPERREQUEST /* flags */
|
PROTOPT_SSL | PROTOPT_CREDSPERREQUEST /* flags */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@@ -169,12 +169,40 @@ CURLcode Curl_http_setup_conn(struct connectdata *conn)
|
|||||||
*
|
*
|
||||||
* Returns a pointer to the first matching header or NULL if none matched.
|
* Returns a pointer to the first matching header or NULL if none matched.
|
||||||
*/
|
*/
|
||||||
char *Curl_checkheaders(struct SessionHandle *data, const char *thisheader)
|
char *Curl_checkheaders(const struct connectdata *conn,
|
||||||
|
const char *thisheader)
|
||||||
{
|
{
|
||||||
struct curl_slist *head;
|
struct curl_slist *head;
|
||||||
size_t thislen = strlen(thisheader);
|
size_t thislen = strlen(thisheader);
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
for(head = data->set.headers; head; head=head->next) {
|
for(head = data->set.headers;head; head=head->next) {
|
||||||
|
if(Curl_raw_nequal(head->data, thisheader, thislen))
|
||||||
|
return head->data;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* checkProxyHeaders() checks the linked list of custom proxy headers
|
||||||
|
* if proxy headers are not available, then it will lookup into http header
|
||||||
|
* link list
|
||||||
|
*
|
||||||
|
* It takes a connectdata struct as input instead of the SessionHandle simply
|
||||||
|
* to know if this is a proxy request or not, as it then might check a
|
||||||
|
* different header list.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
char *Curl_checkProxyheaders(const struct connectdata *conn,
|
||||||
|
const char *thisheader)
|
||||||
|
{
|
||||||
|
struct curl_slist *head;
|
||||||
|
size_t thislen = strlen(thisheader);
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
|
for(head = (conn->bits.proxy && data->set.sep_headers)?
|
||||||
|
data->set.proxyheaders:data->set.headers;
|
||||||
|
head; head=head->next) {
|
||||||
if(Curl_raw_nequal(head->data, thisheader, thislen))
|
if(Curl_raw_nequal(head->data, thisheader, thislen))
|
||||||
return head->data;
|
return head->data;
|
||||||
}
|
}
|
||||||
@@ -377,8 +405,8 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
|
|||||||
expectsend = (curl_off_t)strlen(data->set.postfields);
|
expectsend = (curl_off_t)strlen(data->set.postfields);
|
||||||
break;
|
break;
|
||||||
case HTTPREQ_PUT:
|
case HTTPREQ_PUT:
|
||||||
if(data->set.infilesize != -1)
|
if(data->state.infilesize != -1)
|
||||||
expectsend = data->set.infilesize;
|
expectsend = data->state.infilesize;
|
||||||
break;
|
break;
|
||||||
case HTTPREQ_POST_FORM:
|
case HTTPREQ_POST_FORM:
|
||||||
expectsend = http->postsize;
|
expectsend = http->postsize;
|
||||||
@@ -584,9 +612,9 @@ output_auth_headers(struct connectdata *conn,
|
|||||||
if(authstatus->picked == CURLAUTH_BASIC) {
|
if(authstatus->picked == CURLAUTH_BASIC) {
|
||||||
/* Basic */
|
/* Basic */
|
||||||
if((proxy && conn->bits.proxy_user_passwd &&
|
if((proxy && conn->bits.proxy_user_passwd &&
|
||||||
!Curl_checkheaders(data, "Proxy-authorization:")) ||
|
!Curl_checkProxyheaders(conn, "Proxy-authorization:")) ||
|
||||||
(!proxy && conn->bits.user_passwd &&
|
(!proxy && conn->bits.user_passwd &&
|
||||||
!Curl_checkheaders(data, "Authorization:"))) {
|
!Curl_checkheaders(conn, "Authorization:"))) {
|
||||||
auth="Basic";
|
auth="Basic";
|
||||||
result = http_output_basic(conn, proxy);
|
result = http_output_basic(conn, proxy);
|
||||||
if(result)
|
if(result)
|
||||||
@@ -752,7 +780,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
|
|||||||
infof(data, "Authentication problem. Ignoring this.\n");
|
infof(data, "Authentication problem. Ignoring this.\n");
|
||||||
data->state.authproblem = TRUE;
|
data->state.authproblem = TRUE;
|
||||||
}
|
}
|
||||||
else {
|
else if(data->state.negotiate.state == GSS_AUTHNONE) {
|
||||||
neg = Curl_input_negotiate(conn, proxy, auth);
|
neg = Curl_input_negotiate(conn, proxy, auth);
|
||||||
if(neg == 0) {
|
if(neg == 0) {
|
||||||
DEBUGASSERT(!data->req.newurl);
|
DEBUGASSERT(!data->req.newurl);
|
||||||
@@ -1361,7 +1389,7 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_SSLEAY) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
|
#if defined(USE_SSLEAY) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
|
||||||
defined(USE_DARWINSSL) || defined(USE_POLARSSL)
|
defined(USE_DARWINSSL) || defined(USE_POLARSSL) || defined(USE_NSS)
|
||||||
/* This function is for OpenSSL, GnuTLS, darwinssl, schannel and polarssl only.
|
/* This function is for OpenSSL, GnuTLS, darwinssl, schannel and polarssl only.
|
||||||
It should be made to query the generic SSL layer instead. */
|
It should be made to query the generic SSL layer instead. */
|
||||||
static int https_getsock(struct connectdata *conn,
|
static int https_getsock(struct connectdata *conn,
|
||||||
@@ -1501,7 +1529,7 @@ static CURLcode expect100(struct SessionHandle *data,
|
|||||||
/* if not doing HTTP 1.0 or disabled explicitly, we add a Expect:
|
/* if not doing HTTP 1.0 or disabled explicitly, we add a Expect:
|
||||||
100-continue to the headers which actually speeds up post operations
|
100-continue to the headers which actually speeds up post operations
|
||||||
(as there is one packet coming back from the web server) */
|
(as there is one packet coming back from the web server) */
|
||||||
ptr = Curl_checkheaders(data, "Expect:");
|
ptr = Curl_checkheaders(conn, "Expect:");
|
||||||
if(ptr) {
|
if(ptr) {
|
||||||
data->state.expect100header =
|
data->state.expect100header =
|
||||||
Curl_compareheader(ptr, "Expect:", "100-continue");
|
Curl_compareheader(ptr, "Expect:", "100-continue");
|
||||||
@@ -1516,77 +1544,120 @@ static CURLcode expect100(struct SessionHandle *data,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum proxy_use {
|
||||||
|
HEADER_SERVER, /* direct to server */
|
||||||
|
HEADER_PROXY, /* regular request to proxy */
|
||||||
|
HEADER_CONNECT /* sending CONNECT to a proxy */
|
||||||
|
};
|
||||||
|
|
||||||
CURLcode Curl_add_custom_headers(struct connectdata *conn,
|
CURLcode Curl_add_custom_headers(struct connectdata *conn,
|
||||||
Curl_send_buffer *req_buffer)
|
bool is_connect,
|
||||||
|
Curl_send_buffer *req_buffer)
|
||||||
{
|
{
|
||||||
char *ptr;
|
char *ptr;
|
||||||
struct curl_slist *headers=conn->data->set.headers;
|
struct curl_slist *h[2];
|
||||||
|
struct curl_slist *headers;
|
||||||
|
int numlists=1; /* by default */
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
int i;
|
||||||
|
|
||||||
while(headers) {
|
enum proxy_use proxy;
|
||||||
ptr = strchr(headers->data, ':');
|
|
||||||
if(ptr) {
|
|
||||||
/* we require a colon for this to be a true header */
|
|
||||||
|
|
||||||
ptr++; /* pass the colon */
|
if(is_connect)
|
||||||
while(*ptr && ISSPACE(*ptr))
|
proxy = HEADER_CONNECT;
|
||||||
ptr++;
|
else
|
||||||
|
proxy = conn->bits.httpproxy && !conn->bits.tunnel_proxy?
|
||||||
|
HEADER_PROXY:HEADER_SERVER;
|
||||||
|
|
||||||
if(*ptr) {
|
switch(proxy) {
|
||||||
/* only send this if the contents was non-blank */
|
case HEADER_SERVER:
|
||||||
|
h[0] = data->set.headers;
|
||||||
if(conn->allocptr.host &&
|
break;
|
||||||
/* a Host: header was sent already, don't pass on any custom Host:
|
case HEADER_PROXY:
|
||||||
header as that will produce *two* in the same request! */
|
h[0] = data->set.headers;
|
||||||
checkprefix("Host:", headers->data))
|
if(data->set.sep_headers) {
|
||||||
;
|
h[1] = data->set.proxyheaders;
|
||||||
else if(conn->data->set.httpreq == HTTPREQ_POST_FORM &&
|
numlists++;
|
||||||
/* this header (extended by formdata.c) is sent later */
|
|
||||||
checkprefix("Content-Type:", headers->data))
|
|
||||||
;
|
|
||||||
else if(conn->bits.authneg &&
|
|
||||||
/* while doing auth neg, don't allow the custom length since
|
|
||||||
we will force length zero then */
|
|
||||||
checkprefix("Content-Length", headers->data))
|
|
||||||
;
|
|
||||||
else if(conn->allocptr.te &&
|
|
||||||
/* when asking for Transfer-Encoding, don't pass on a custom
|
|
||||||
Connection: */
|
|
||||||
checkprefix("Connection", headers->data))
|
|
||||||
;
|
|
||||||
else {
|
|
||||||
CURLcode result = Curl_add_bufferf(req_buffer, "%s\r\n",
|
|
||||||
headers->data);
|
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
break;
|
||||||
ptr = strchr(headers->data, ';');
|
case HEADER_CONNECT:
|
||||||
if(ptr) {
|
if(data->set.sep_headers)
|
||||||
|
h[0] = data->set.proxyheaders;
|
||||||
|
else
|
||||||
|
h[0] = data->set.headers;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ptr++; /* pass the semicolon */
|
/* loop through one or two lists */
|
||||||
|
for(i=0; i < numlists; i++) {
|
||||||
|
headers = h[i];
|
||||||
|
|
||||||
|
while(headers) {
|
||||||
|
ptr = strchr(headers->data, ':');
|
||||||
|
if(ptr) {
|
||||||
|
/* we require a colon for this to be a true header */
|
||||||
|
|
||||||
|
ptr++; /* pass the colon */
|
||||||
while(*ptr && ISSPACE(*ptr))
|
while(*ptr && ISSPACE(*ptr))
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if(*ptr) {
|
if(*ptr) {
|
||||||
/* this may be used for something else in the future */
|
/* only send this if the contents was non-blank */
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(*(--ptr) == ';') {
|
|
||||||
CURLcode result;
|
|
||||||
|
|
||||||
/* send no-value custom header if terminated by semicolon */
|
if(conn->allocptr.host &&
|
||||||
*ptr = ':';
|
/* a Host: header was sent already, don't pass on any custom Host:
|
||||||
result = Curl_add_bufferf(req_buffer, "%s\r\n",
|
header as that will produce *two* in the same request! */
|
||||||
headers->data);
|
checkprefix("Host:", headers->data))
|
||||||
|
;
|
||||||
|
else if(data->set.httpreq == HTTPREQ_POST_FORM &&
|
||||||
|
/* this header (extended by formdata.c) is sent later */
|
||||||
|
checkprefix("Content-Type:", headers->data))
|
||||||
|
;
|
||||||
|
else if(conn->bits.authneg &&
|
||||||
|
/* while doing auth neg, don't allow the custom length since
|
||||||
|
we will force length zero then */
|
||||||
|
checkprefix("Content-Length", headers->data))
|
||||||
|
;
|
||||||
|
else if(conn->allocptr.te &&
|
||||||
|
/* when asking for Transfer-Encoding, don't pass on a custom
|
||||||
|
Connection: */
|
||||||
|
checkprefix("Connection", headers->data))
|
||||||
|
;
|
||||||
|
else {
|
||||||
|
CURLcode result = Curl_add_bufferf(req_buffer, "%s\r\n",
|
||||||
|
headers->data);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
ptr = strchr(headers->data, ';');
|
||||||
|
if(ptr) {
|
||||||
|
|
||||||
|
ptr++; /* pass the semicolon */
|
||||||
|
while(*ptr && ISSPACE(*ptr))
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
if(*ptr) {
|
||||||
|
/* this may be used for something else in the future */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(*(--ptr) == ';') {
|
||||||
|
CURLcode result;
|
||||||
|
|
||||||
|
/* send no-value custom header if terminated by semicolon */
|
||||||
|
*ptr = ':';
|
||||||
|
result = Curl_add_bufferf(req_buffer, "%s\r\n",
|
||||||
|
headers->data);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers = headers->next;
|
||||||
}
|
}
|
||||||
headers = headers->next;
|
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
@@ -1673,10 +1744,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
the rest of the request in the PERFORM phase. */
|
the rest of the request in the PERFORM phase. */
|
||||||
*done = TRUE;
|
*done = TRUE;
|
||||||
|
|
||||||
switch (conn->negnpn) {
|
if(conn->httpversion < 20) { /* unless the connection is re-used and already
|
||||||
case NPN_HTTP2_DRAFT09:
|
http2 */
|
||||||
infof(data, "http, we have to use HTTP-draft-09/2\n");
|
switch (conn->negnpn) {
|
||||||
|
case NPN_HTTP2:
|
||||||
Curl_http2_init(conn);
|
Curl_http2_init(conn);
|
||||||
|
Curl_http2_setup(conn);
|
||||||
Curl_http2_switched(conn);
|
Curl_http2_switched(conn);
|
||||||
break;
|
break;
|
||||||
case NPN_HTTP1_1:
|
case NPN_HTTP1_1:
|
||||||
@@ -1685,7 +1758,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
default:
|
default:
|
||||||
/* and as fallback */
|
/* and as fallback */
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
/* prepare for a http2 request */
|
||||||
|
Curl_http2_setup(conn);
|
||||||
|
|
||||||
http = data->req.protop;
|
http = data->req.protop;
|
||||||
|
|
||||||
@@ -1701,7 +1778,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
http->writebytecount = http->readbytecount = 0;
|
http->writebytecount = http->readbytecount = 0;
|
||||||
|
|
||||||
if((conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_FTP)) &&
|
if((conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_FTP)) &&
|
||||||
data->set.upload) {
|
data->set.upload) {
|
||||||
httpreq = HTTPREQ_PUT;
|
httpreq = HTTPREQ_PUT;
|
||||||
}
|
}
|
||||||
@@ -1737,7 +1814,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
it might have been used in the proxy connect, but if we have got a header
|
it might have been used in the proxy connect, but if we have got a header
|
||||||
with the user-agent string specified, we erase the previously made string
|
with the user-agent string specified, we erase the previously made string
|
||||||
here. */
|
here. */
|
||||||
if(Curl_checkheaders(data, "User-Agent:") && conn->allocptr.uagent) {
|
if(Curl_checkheaders(conn, "User-Agent:") && conn->allocptr.uagent) {
|
||||||
free(conn->allocptr.uagent);
|
free(conn->allocptr.uagent);
|
||||||
conn->allocptr.uagent=NULL;
|
conn->allocptr.uagent=NULL;
|
||||||
}
|
}
|
||||||
@@ -1758,7 +1835,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
conn->bits.authneg = FALSE;
|
conn->bits.authneg = FALSE;
|
||||||
|
|
||||||
Curl_safefree(conn->allocptr.ref);
|
Curl_safefree(conn->allocptr.ref);
|
||||||
if(data->change.referer && !Curl_checkheaders(data, "Referer:")) {
|
if(data->change.referer && !Curl_checkheaders(conn, "Referer:")) {
|
||||||
conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
|
conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
|
||||||
if(!conn->allocptr.ref)
|
if(!conn->allocptr.ref)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@@ -1766,10 +1843,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
else
|
else
|
||||||
conn->allocptr.ref = NULL;
|
conn->allocptr.ref = NULL;
|
||||||
|
|
||||||
if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(data, "Cookie:"))
|
if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(conn, "Cookie:"))
|
||||||
addcookies = data->set.str[STRING_COOKIE];
|
addcookies = data->set.str[STRING_COOKIE];
|
||||||
|
|
||||||
if(!Curl_checkheaders(data, "Accept-Encoding:") &&
|
if(!Curl_checkheaders(conn, "Accept-Encoding:") &&
|
||||||
data->set.str[STRING_ENCODING]) {
|
data->set.str[STRING_ENCODING]) {
|
||||||
Curl_safefree(conn->allocptr.accept_encoding);
|
Curl_safefree(conn->allocptr.accept_encoding);
|
||||||
conn->allocptr.accept_encoding =
|
conn->allocptr.accept_encoding =
|
||||||
@@ -1781,13 +1858,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
/* we only consider transfer-encoding magic if libz support is built-in */
|
/* we only consider transfer-encoding magic if libz support is built-in */
|
||||||
|
|
||||||
if(!Curl_checkheaders(data, "TE:") && data->set.http_transfer_encoding) {
|
if(!Curl_checkheaders(conn, "TE:") &&
|
||||||
|
data->set.http_transfer_encoding) {
|
||||||
/* When we are to insert a TE: header in the request, we must also insert
|
/* When we are to insert a TE: header in the request, we must also insert
|
||||||
TE in a Connection: header, so we need to merge the custom provided
|
TE in a Connection: header, so we need to merge the custom provided
|
||||||
Connection: header and prevent the original to get sent. Note that if
|
Connection: header and prevent the original to get sent. Note that if
|
||||||
the user has inserted his/hers own TE: header we don't do this magic
|
the user has inserted his/hers own TE: header we don't do this magic
|
||||||
but then assume that the user will handle it all! */
|
but then assume that the user will handle it all! */
|
||||||
char *cptr = Curl_checkheaders(data, "Connection:");
|
char *cptr = Curl_checkheaders(conn, "Connection:");
|
||||||
#define TE_HEADER "TE: gzip\r\n"
|
#define TE_HEADER "TE: gzip\r\n"
|
||||||
|
|
||||||
Curl_safefree(conn->allocptr.te);
|
Curl_safefree(conn->allocptr.te);
|
||||||
@@ -1805,16 +1883,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
/* In HTTP2 forbids Transfer-Encoding: chunked */
|
/* In HTTP2 forbids Transfer-Encoding: chunked */
|
||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
else {
|
else {
|
||||||
ptr = Curl_checkheaders(data, "Transfer-Encoding:");
|
ptr = Curl_checkheaders(conn, "Transfer-Encoding:");
|
||||||
if(ptr) {
|
if(ptr) {
|
||||||
/* Some kind of TE is requested, check if 'chunked' is chosen */
|
/* Some kind of TE is requested, check if 'chunked' is chosen */
|
||||||
data->req.upload_chunky =
|
data->req.upload_chunky =
|
||||||
Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
|
Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if((conn->handler->protocol&CURLPROTO_HTTP) &&
|
if((conn->handler->protocol&PROTO_FAMILY_HTTP) &&
|
||||||
data->set.upload &&
|
data->set.upload &&
|
||||||
(data->set.infilesize == -1)) {
|
(data->state.infilesize == -1)) {
|
||||||
if(conn->bits.authneg)
|
if(conn->bits.authneg)
|
||||||
/* don't enable chunked during auth neg */
|
/* don't enable chunked during auth neg */
|
||||||
;
|
;
|
||||||
@@ -1839,7 +1917,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
|
|
||||||
Curl_safefree(conn->allocptr.host);
|
Curl_safefree(conn->allocptr.host);
|
||||||
|
|
||||||
ptr = Curl_checkheaders(data, "Host:");
|
ptr = Curl_checkheaders(conn, "Host:");
|
||||||
if(ptr && (!data->state.this_is_a_follow ||
|
if(ptr && (!data->state.this_is_a_follow ||
|
||||||
Curl_raw_equal(data->state.first_host, conn->host.name))) {
|
Curl_raw_equal(data->state.first_host, conn->host.name))) {
|
||||||
#if !defined(CURL_DISABLE_COOKIES)
|
#if !defined(CURL_DISABLE_COOKIES)
|
||||||
@@ -1984,13 +2062,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
/* we must build the whole post sequence first, so that we have a size of
|
/* we must build the whole post sequence first, so that we have a size of
|
||||||
the whole transfer before we start to send it */
|
the whole transfer before we start to send it */
|
||||||
result = Curl_getformdata(data, &http->sendit, data->set.httppost,
|
result = Curl_getformdata(data, &http->sendit, data->set.httppost,
|
||||||
Curl_checkheaders(data, "Content-Type:"),
|
Curl_checkheaders(conn, "Content-Type:"),
|
||||||
&http->postsize);
|
&http->postsize);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
http->p_accept = Curl_checkheaders(data, "Accept:")?NULL:"Accept: */*\r\n";
|
http->p_accept = Curl_checkheaders(conn, "Accept:")?NULL:"Accept: */*\r\n";
|
||||||
|
|
||||||
if(( (HTTPREQ_POST == httpreq) ||
|
if(( (HTTPREQ_POST == httpreq) ||
|
||||||
(HTTPREQ_POST_FORM == httpreq) ||
|
(HTTPREQ_POST_FORM == httpreq) ||
|
||||||
@@ -2052,10 +2130,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* now, decrease the size of the read */
|
/* now, decrease the size of the read */
|
||||||
if(data->set.infilesize>0) {
|
if(data->state.infilesize>0) {
|
||||||
data->set.infilesize -= data->state.resume_from;
|
data->state.infilesize -= data->state.resume_from;
|
||||||
|
|
||||||
if(data->set.infilesize <= 0) {
|
if(data->state.infilesize <= 0) {
|
||||||
failf(data, "File already completely uploaded");
|
failf(data, "File already completely uploaded");
|
||||||
return CURLE_PARTIAL_FILE;
|
return CURLE_PARTIAL_FILE;
|
||||||
}
|
}
|
||||||
@@ -2070,7 +2148,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
* ones if any such are specified.
|
* ones if any such are specified.
|
||||||
*/
|
*/
|
||||||
if(((httpreq == HTTPREQ_GET) || (httpreq == HTTPREQ_HEAD)) &&
|
if(((httpreq == HTTPREQ_GET) || (httpreq == HTTPREQ_HEAD)) &&
|
||||||
!Curl_checkheaders(data, "Range:")) {
|
!Curl_checkheaders(conn, "Range:")) {
|
||||||
/* if a line like this was already allocated, free the previous one */
|
/* if a line like this was already allocated, free the previous one */
|
||||||
if(conn->allocptr.rangeline)
|
if(conn->allocptr.rangeline)
|
||||||
free(conn->allocptr.rangeline);
|
free(conn->allocptr.rangeline);
|
||||||
@@ -2078,7 +2156,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
data->state.range);
|
data->state.range);
|
||||||
}
|
}
|
||||||
else if((httpreq != HTTPREQ_GET) &&
|
else if((httpreq != HTTPREQ_GET) &&
|
||||||
!Curl_checkheaders(data, "Content-Range:")) {
|
!Curl_checkheaders(conn, "Content-Range:")) {
|
||||||
|
|
||||||
/* if a line like this was already allocated, free the previous one */
|
/* if a line like this was already allocated, free the previous one */
|
||||||
if(conn->allocptr.rangeline)
|
if(conn->allocptr.rangeline)
|
||||||
@@ -2091,13 +2169,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
conn->allocptr.rangeline =
|
conn->allocptr.rangeline =
|
||||||
aprintf("Content-Range: bytes 0-%" CURL_FORMAT_CURL_OFF_T
|
aprintf("Content-Range: bytes 0-%" CURL_FORMAT_CURL_OFF_T
|
||||||
"/%" CURL_FORMAT_CURL_OFF_T "\r\n",
|
"/%" CURL_FORMAT_CURL_OFF_T "\r\n",
|
||||||
data->set.infilesize - 1, data->set.infilesize);
|
data->state.infilesize - 1, data->state.infilesize);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(data->state.resume_from) {
|
else if(data->state.resume_from) {
|
||||||
/* This is because "resume" was selected */
|
/* This is because "resume" was selected */
|
||||||
curl_off_t total_expected_size=
|
curl_off_t total_expected_size=
|
||||||
data->state.resume_from + data->set.infilesize;
|
data->state.resume_from + data->state.infilesize;
|
||||||
conn->allocptr.rangeline =
|
conn->allocptr.rangeline =
|
||||||
aprintf("Content-Range: bytes %s%" CURL_FORMAT_CURL_OFF_T
|
aprintf("Content-Range: bytes %s%" CURL_FORMAT_CURL_OFF_T
|
||||||
"/%" CURL_FORMAT_CURL_OFF_T "\r\n",
|
"/%" CURL_FORMAT_CURL_OFF_T "\r\n",
|
||||||
@@ -2109,7 +2187,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
append total size */
|
append total size */
|
||||||
conn->allocptr.rangeline =
|
conn->allocptr.rangeline =
|
||||||
aprintf("Content-Range: bytes %s/%" CURL_FORMAT_CURL_OFF_T "\r\n",
|
aprintf("Content-Range: bytes %s/%" CURL_FORMAT_CURL_OFF_T "\r\n",
|
||||||
data->state.range, data->set.infilesize);
|
data->state.range, data->state.infilesize);
|
||||||
}
|
}
|
||||||
if(!conn->allocptr.rangeline)
|
if(!conn->allocptr.rangeline)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@@ -2180,7 +2258,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
conn->allocptr.ref:"" /* Referer: <data> */,
|
conn->allocptr.ref:"" /* Referer: <data> */,
|
||||||
(conn->bits.httpproxy &&
|
(conn->bits.httpproxy &&
|
||||||
!conn->bits.tunnel_proxy &&
|
!conn->bits.tunnel_proxy &&
|
||||||
!Curl_checkheaders(data, "Proxy-Connection:"))?
|
!Curl_checkProxyheaders(conn, "Proxy-Connection:"))?
|
||||||
"Proxy-Connection: Keep-Alive\r\n":"",
|
"Proxy-Connection: Keep-Alive\r\n":"",
|
||||||
te
|
te
|
||||||
);
|
);
|
||||||
@@ -2265,7 +2343,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = Curl_add_custom_headers(conn, req_buffer);
|
result = Curl_add_custom_headers(conn, FALSE, req_buffer);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -2315,7 +2393,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
http->sending = HTTPSEND_BODY;
|
http->sending = HTTPSEND_BODY;
|
||||||
|
|
||||||
if(!data->req.upload_chunky &&
|
if(!data->req.upload_chunky &&
|
||||||
!Curl_checkheaders(data, "Content-Length:")) {
|
!Curl_checkheaders(conn, "Content-Length:")) {
|
||||||
/* only add Content-Length if not uploading chunked */
|
/* only add Content-Length if not uploading chunked */
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
|
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
|
||||||
@@ -2384,10 +2462,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
if(conn->bits.authneg)
|
if(conn->bits.authneg)
|
||||||
postsize = 0;
|
postsize = 0;
|
||||||
else
|
else
|
||||||
postsize = data->set.infilesize;
|
postsize = data->state.infilesize;
|
||||||
|
|
||||||
if((postsize != -1) && !data->req.upload_chunky &&
|
if((postsize != -1) && !data->req.upload_chunky &&
|
||||||
!Curl_checkheaders(data, "Content-Length:")) {
|
!Curl_checkheaders(conn, "Content-Length:")) {
|
||||||
/* only add Content-Length if not uploading chunked */
|
/* only add Content-Length if not uploading chunked */
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
|
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
|
||||||
@@ -2396,9 +2474,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = expect100(data, conn, req_buffer);
|
if(postsize != 0) {
|
||||||
if(result)
|
result = expect100(data, conn, req_buffer);
|
||||||
return result;
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
result = Curl_add_buffer(req_buffer, "\r\n", 2); /* end of headers */
|
result = Curl_add_buffer(req_buffer, "\r\n", 2); /* end of headers */
|
||||||
if(result)
|
if(result)
|
||||||
@@ -2437,7 +2517,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
we don't upload data chunked, as RFC2616 forbids us to set both
|
we don't upload data chunked, as RFC2616 forbids us to set both
|
||||||
kinds of headers (Transfer-Encoding: chunked and Content-Length) */
|
kinds of headers (Transfer-Encoding: chunked and Content-Length) */
|
||||||
if((postsize != -1) && !data->req.upload_chunky &&
|
if((postsize != -1) && !data->req.upload_chunky &&
|
||||||
!Curl_checkheaders(data, "Content-Length:")) {
|
!Curl_checkheaders(conn, "Content-Length:")) {
|
||||||
/* we allow replacing this header if not during auth negotiation,
|
/* we allow replacing this header if not during auth negotiation,
|
||||||
although it isn't very wise to actually set your own */
|
although it isn't very wise to actually set your own */
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
@@ -2447,7 +2527,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Curl_checkheaders(data, "Content-Type:")) {
|
if(!Curl_checkheaders(conn, "Content-Type:")) {
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
"Content-Type: application/"
|
"Content-Type: application/"
|
||||||
"x-www-form-urlencoded\r\n");
|
"x-www-form-urlencoded\r\n");
|
||||||
@@ -2459,7 +2539,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
the somewhat bigger ones we allow the app to disable it. Just make
|
the somewhat bigger ones we allow the app to disable it. Just make
|
||||||
sure that the expect100header is always set to the preferred value
|
sure that the expect100header is always set to the preferred value
|
||||||
here. */
|
here. */
|
||||||
ptr = Curl_checkheaders(data, "Expect:");
|
ptr = Curl_checkheaders(conn, "Expect:");
|
||||||
if(ptr) {
|
if(ptr) {
|
||||||
data->state.expect100header =
|
data->state.expect100header =
|
||||||
Curl_compareheader(ptr, "Expect:", "100-continue");
|
Curl_compareheader(ptr, "Expect:", "100-continue");
|
||||||
@@ -2926,7 +3006,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data,
|
|||||||
k->header = FALSE; /* no more header to parse! */
|
k->header = FALSE; /* no more header to parse! */
|
||||||
|
|
||||||
if((k->size == -1) && !k->chunk && !conn->bits.close &&
|
if((k->size == -1) && !k->chunk && !conn->bits.close &&
|
||||||
(conn->httpversion >= 11) &&
|
(conn->httpversion == 11) &&
|
||||||
!(conn->handler->protocol & CURLPROTO_RTSP) &&
|
!(conn->handler->protocol & CURLPROTO_RTSP) &&
|
||||||
data->set.httpreq != HTTPREQ_HEAD) {
|
data->set.httpreq != HTTPREQ_HEAD) {
|
||||||
/* On HTTP 1.1, when connection is not to get closed, but no
|
/* On HTTP 1.1, when connection is not to get closed, but no
|
||||||
@@ -3117,7 +3197,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data,
|
|||||||
#define HEADER1 k->p /* no conversion needed, just use k->p */
|
#define HEADER1 k->p /* no conversion needed, just use k->p */
|
||||||
#endif /* CURL_DOES_CONVERSIONS */
|
#endif /* CURL_DOES_CONVERSIONS */
|
||||||
|
|
||||||
if(conn->handler->protocol & CURLPROTO_HTTP) {
|
if(conn->handler->protocol & PROTO_FAMILY_HTTP) {
|
||||||
nc = sscanf(HEADER1,
|
nc = sscanf(HEADER1,
|
||||||
" HTTP/%d.%d %3d",
|
" HTTP/%d.%d %3d",
|
||||||
&httpversion_major,
|
&httpversion_major,
|
||||||
|
@@ -39,9 +39,13 @@ extern const struct Curl_handler Curl_handler_https;
|
|||||||
bool Curl_compareheader(const char *headerline, /* line to check */
|
bool Curl_compareheader(const char *headerline, /* line to check */
|
||||||
const char *header, /* header keyword _with_ colon */
|
const char *header, /* header keyword _with_ colon */
|
||||||
const char *content); /* content string to find */
|
const char *content); /* content string to find */
|
||||||
char *Curl_checkheaders(struct SessionHandle *data, const char *thisheader);
|
|
||||||
|
char *Curl_checkheaders(const struct connectdata *conn,
|
||||||
|
const char *thisheader);
|
||||||
char *Curl_copy_header_value(const char *header);
|
char *Curl_copy_header_value(const char *header);
|
||||||
|
|
||||||
|
char *Curl_checkProxyheaders(const struct connectdata *conn,
|
||||||
|
const char *thisheader);
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/*
|
/*
|
||||||
* The add_buffer series of functions are used to build one large memory chunk
|
* The add_buffer series of functions are used to build one large memory chunk
|
||||||
@@ -67,7 +71,8 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in,
|
|||||||
CURLcode Curl_add_timecondition(struct SessionHandle *data,
|
CURLcode Curl_add_timecondition(struct SessionHandle *data,
|
||||||
Curl_send_buffer *buf);
|
Curl_send_buffer *buf);
|
||||||
CURLcode Curl_add_custom_headers(struct connectdata *conn,
|
CURLcode Curl_add_custom_headers(struct connectdata *conn,
|
||||||
Curl_send_buffer *req_buffer);
|
bool is_connect,
|
||||||
|
Curl_send_buffer *req_buffer);
|
||||||
|
|
||||||
/* protocol-specific functions set up to be called by the main engine */
|
/* protocol-specific functions set up to be called by the main engine */
|
||||||
CURLcode Curl_http(struct connectdata *conn, bool *done);
|
CURLcode Curl_http(struct connectdata *conn, bool *done);
|
||||||
|
83
lib/http2.c
83
lib/http2.c
@@ -103,8 +103,8 @@ static CURLcode http2_disconnect(struct connectdata *conn,
|
|||||||
const struct Curl_handler Curl_handler_http2 = {
|
const struct Curl_handler Curl_handler_http2 = {
|
||||||
"HTTP2", /* scheme */
|
"HTTP2", /* scheme */
|
||||||
ZERO_NULL, /* setup_connection */
|
ZERO_NULL, /* setup_connection */
|
||||||
ZERO_NULL, /* do_it */
|
Curl_http, /* do_it */
|
||||||
ZERO_NULL , /* done */
|
ZERO_NULL, /* done */
|
||||||
ZERO_NULL, /* do_more */
|
ZERO_NULL, /* do_more */
|
||||||
ZERO_NULL, /* connect_it */
|
ZERO_NULL, /* connect_it */
|
||||||
ZERO_NULL, /* connecting */
|
ZERO_NULL, /* connecting */
|
||||||
@@ -123,8 +123,8 @@ const struct Curl_handler Curl_handler_http2 = {
|
|||||||
const struct Curl_handler Curl_handler_http2_ssl = {
|
const struct Curl_handler Curl_handler_http2_ssl = {
|
||||||
"HTTP2", /* scheme */
|
"HTTP2", /* scheme */
|
||||||
ZERO_NULL, /* setup_connection */
|
ZERO_NULL, /* setup_connection */
|
||||||
ZERO_NULL, /* do_it */
|
Curl_http, /* do_it */
|
||||||
ZERO_NULL , /* done */
|
ZERO_NULL, /* done */
|
||||||
ZERO_NULL, /* do_more */
|
ZERO_NULL, /* do_more */
|
||||||
ZERO_NULL, /* connect_it */
|
ZERO_NULL, /* connect_it */
|
||||||
ZERO_NULL, /* connecting */
|
ZERO_NULL, /* connecting */
|
||||||
@@ -136,7 +136,7 @@ const struct Curl_handler Curl_handler_http2_ssl = {
|
|||||||
http2_disconnect, /* disconnect */
|
http2_disconnect, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_HTTP, /* defport */
|
PORT_HTTP, /* defport */
|
||||||
CURLPROTO_HTTP | CURLPROTO_HTTPS, /* protocol */
|
CURLPROTO_HTTPS, /* protocol */
|
||||||
PROTOPT_SSL /* flags */
|
PROTOPT_SSL /* flags */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -270,15 +270,9 @@ static int before_frame_send(nghttp2_session *session,
|
|||||||
void *userp)
|
void *userp)
|
||||||
{
|
{
|
||||||
struct connectdata *conn = (struct connectdata *)userp;
|
struct connectdata *conn = (struct connectdata *)userp;
|
||||||
struct http_conn *c = &conn->proto.httpc;
|
|
||||||
(void)session;
|
(void)session;
|
||||||
(void)frame;
|
(void)frame;
|
||||||
infof(conn->data, "before_frame_send() was called\n");
|
infof(conn->data, "before_frame_send() was called\n");
|
||||||
if(frame->hd.type == NGHTTP2_HEADERS &&
|
|
||||||
frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
|
|
||||||
/* Get stream ID of our request */
|
|
||||||
c->stream_id = frame->hd.stream_id;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int on_frame_send(nghttp2_session *session,
|
static int on_frame_send(nghttp2_session *session,
|
||||||
@@ -349,14 +343,16 @@ static const char STATUS[] = ":status";
|
|||||||
|
|
||||||
/* frame->hd.type is either NGHTTP2_HEADERS or NGHTTP2_PUSH_PROMISE */
|
/* frame->hd.type is either NGHTTP2_HEADERS or NGHTTP2_PUSH_PROMISE */
|
||||||
static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
|
static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
|
||||||
const uint8_t *name, size_t namelen,
|
const uint8_t *name, size_t namelen,
|
||||||
const uint8_t *value, size_t valuelen,
|
const uint8_t *value, size_t valuelen,
|
||||||
void *userp)
|
uint8_t flags,
|
||||||
|
void *userp)
|
||||||
{
|
{
|
||||||
struct connectdata *conn = (struct connectdata *)userp;
|
struct connectdata *conn = (struct connectdata *)userp;
|
||||||
struct http_conn *c = &conn->proto.httpc;
|
struct http_conn *c = &conn->proto.httpc;
|
||||||
(void)session;
|
(void)session;
|
||||||
(void)frame;
|
(void)frame;
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
if(frame->hd.stream_id != c->stream_id) {
|
if(frame->hd.stream_id != c->stream_id) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -404,7 +400,7 @@ static const nghttp2_session_callbacks callbacks = {
|
|||||||
static ssize_t data_source_read_callback(nghttp2_session *session,
|
static ssize_t data_source_read_callback(nghttp2_session *session,
|
||||||
int32_t stream_id,
|
int32_t stream_id,
|
||||||
uint8_t *buf, size_t length,
|
uint8_t *buf, size_t length,
|
||||||
int *eof,
|
uint32_t *data_flags,
|
||||||
nghttp2_data_source *source,
|
nghttp2_data_source *source,
|
||||||
void *userp)
|
void *userp)
|
||||||
{
|
{
|
||||||
@@ -413,7 +409,6 @@ static ssize_t data_source_read_callback(nghttp2_session *session,
|
|||||||
size_t nread;
|
size_t nread;
|
||||||
(void)session;
|
(void)session;
|
||||||
(void)stream_id;
|
(void)stream_id;
|
||||||
(void)eof;
|
|
||||||
(void)source;
|
(void)source;
|
||||||
|
|
||||||
nread = c->upload_len < length ? c->upload_len : length;
|
nread = c->upload_len < length ? c->upload_len : length;
|
||||||
@@ -425,7 +420,7 @@ static ssize_t data_source_read_callback(nghttp2_session *session,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(c->upload_left == 0)
|
if(c->upload_left == 0)
|
||||||
*eof = 1;
|
*data_flags = 1;
|
||||||
else if(nread == 0)
|
else if(nread == 0)
|
||||||
return NGHTTP2_ERR_DEFERRED;
|
return NGHTTP2_ERR_DEFERRED;
|
||||||
|
|
||||||
@@ -512,7 +507,7 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
|||||||
"Connection: Upgrade, HTTP2-Settings\r\n"
|
"Connection: Upgrade, HTTP2-Settings\r\n"
|
||||||
"Upgrade: %s\r\n"
|
"Upgrade: %s\r\n"
|
||||||
"HTTP2-Settings: %s\r\n",
|
"HTTP2-Settings: %s\r\n",
|
||||||
NGHTTP2_PROTO_VERSION_ID, base64);
|
NGHTTP2_CLEARTEXT_PROTO_VERSION_ID, base64);
|
||||||
Curl_safefree(base64);
|
Curl_safefree(base64);
|
||||||
|
|
||||||
k->upgr101 = UPGR101_REQUESTED;
|
k->upgr101 = UPGR101_REQUESTED;
|
||||||
@@ -620,12 +615,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAKE_NV(k, v) \
|
|
||||||
{ (uint8_t*)k, (uint8_t*)v, sizeof(k) - 1, sizeof(v) - 1 }
|
|
||||||
|
|
||||||
#define MAKE_NV2(k, v, vlen) \
|
|
||||||
{ (uint8_t*)k, (uint8_t*)v, sizeof(k) - 1, vlen }
|
|
||||||
|
|
||||||
/* return number of received (decrypted) bytes */
|
/* return number of received (decrypted) bytes */
|
||||||
static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
||||||
const void *mem, size_t len, CURLcode *err)
|
const void *mem, size_t len, CURLcode *err)
|
||||||
@@ -643,6 +632,8 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
char *hdbuf = (char*)mem;
|
char *hdbuf = (char*)mem;
|
||||||
char *end;
|
char *end;
|
||||||
nghttp2_data_provider data_prd;
|
nghttp2_data_provider data_prd;
|
||||||
|
int32_t stream_id;
|
||||||
|
|
||||||
(void)sockindex;
|
(void)sockindex;
|
||||||
|
|
||||||
infof(conn->data, "http2_send len=%zu\n", len);
|
infof(conn->data, "http2_send len=%zu\n", len);
|
||||||
@@ -685,6 +676,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
nva[0].namelen = (uint16_t)strlen((char *)nva[0].name);
|
nva[0].namelen = (uint16_t)strlen((char *)nva[0].name);
|
||||||
nva[0].value = (unsigned char *)hdbuf;
|
nva[0].value = (unsigned char *)hdbuf;
|
||||||
nva[0].valuelen = (uint16_t)(end - hdbuf);
|
nva[0].valuelen = (uint16_t)(end - hdbuf);
|
||||||
|
nva[0].flags = NGHTTP2_NV_FLAG_NONE;
|
||||||
|
|
||||||
hdbuf = end + 1;
|
hdbuf = end + 1;
|
||||||
|
|
||||||
@@ -693,6 +685,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
nva[1].namelen = (uint16_t)strlen((char *)nva[1].name);
|
nva[1].namelen = (uint16_t)strlen((char *)nva[1].name);
|
||||||
nva[1].value = (unsigned char *)hdbuf;
|
nva[1].value = (unsigned char *)hdbuf;
|
||||||
nva[1].valuelen = (uint16_t)(end - hdbuf);
|
nva[1].valuelen = (uint16_t)(end - hdbuf);
|
||||||
|
nva[1].flags = NGHTTP2_NV_FLAG_NONE;
|
||||||
|
|
||||||
nva[2].name = (unsigned char *)":scheme";
|
nva[2].name = (unsigned char *)":scheme";
|
||||||
nva[2].namelen = (uint16_t)strlen((char *)nva[2].name);
|
nva[2].namelen = (uint16_t)strlen((char *)nva[2].name);
|
||||||
@@ -701,6 +694,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
else
|
else
|
||||||
nva[2].value = (unsigned char *)"http";
|
nva[2].value = (unsigned char *)"http";
|
||||||
nva[2].valuelen = (uint16_t)strlen((char *)nva[2].value);
|
nva[2].valuelen = (uint16_t)strlen((char *)nva[2].value);
|
||||||
|
nva[2].flags = NGHTTP2_NV_FLAG_NONE;
|
||||||
|
|
||||||
hdbuf = strchr(hdbuf, 0x0a);
|
hdbuf = strchr(hdbuf, 0x0a);
|
||||||
++hdbuf;
|
++hdbuf;
|
||||||
@@ -722,6 +716,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
assert(end);
|
assert(end);
|
||||||
nva[i].value = (unsigned char *)hdbuf;
|
nva[i].value = (unsigned char *)hdbuf;
|
||||||
nva[i].valuelen = (uint16_t)(end - hdbuf);
|
nva[i].valuelen = (uint16_t)(end - hdbuf);
|
||||||
|
nva[i].flags = NGHTTP2_NV_FLAG_NONE;
|
||||||
|
|
||||||
hdbuf = end + 2;
|
hdbuf = end + 2;
|
||||||
/* Inspect Content-Length header field and retrieve the request
|
/* Inspect Content-Length header field and retrieve the request
|
||||||
@@ -744,19 +739,23 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
case HTTPREQ_PUT:
|
case HTTPREQ_PUT:
|
||||||
data_prd.read_callback = data_source_read_callback;
|
data_prd.read_callback = data_source_read_callback;
|
||||||
data_prd.source.ptr = NULL;
|
data_prd.source.ptr = NULL;
|
||||||
rv = nghttp2_submit_request(httpc->h2, 0, nva, nheader, &data_prd, NULL);
|
stream_id = nghttp2_submit_request(httpc->h2, NULL, nva, nheader,
|
||||||
|
&data_prd, NULL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rv = nghttp2_submit_request(httpc->h2, 0, nva, nheader, NULL, NULL);
|
stream_id = nghttp2_submit_request(httpc->h2, NULL, nva, nheader,
|
||||||
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_safefree(nva);
|
Curl_safefree(nva);
|
||||||
|
|
||||||
if(rv != 0) {
|
if(stream_id < 0) {
|
||||||
*err = CURLE_SEND_ERROR;
|
*err = CURLE_SEND_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
httpc->stream_id = stream_id;
|
||||||
|
|
||||||
rv = nghttp2_session_send(httpc->h2);
|
rv = nghttp2_session_send(httpc->h2);
|
||||||
|
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
@@ -779,24 +778,15 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Curl_http2_switched(struct connectdata *conn)
|
void Curl_http2_setup(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
int rv;
|
|
||||||
CURLcode rc;
|
|
||||||
struct http_conn *httpc = &conn->proto.httpc;
|
struct http_conn *httpc = &conn->proto.httpc;
|
||||||
/* we are switched! */
|
|
||||||
/* Don't know this is needed here at this moment. Original
|
|
||||||
handler->flags is still useful. */
|
|
||||||
if(conn->handler->flags & PROTOPT_SSL)
|
if(conn->handler->flags & PROTOPT_SSL)
|
||||||
conn->handler = &Curl_handler_http2_ssl;
|
conn->handler = &Curl_handler_http2_ssl;
|
||||||
else
|
else
|
||||||
conn->handler = &Curl_handler_http2;
|
conn->handler = &Curl_handler_http2;
|
||||||
|
|
||||||
httpc->recv_underlying = (recving)conn->recv[FIRSTSOCKET];
|
infof(conn->data, "Using HTTP2\n");
|
||||||
httpc->send_underlying = (sending)conn->send[FIRSTSOCKET];
|
|
||||||
conn->recv[FIRSTSOCKET] = http2_recv;
|
|
||||||
conn->send[FIRSTSOCKET] = http2_send;
|
|
||||||
infof(conn->data, "We have switched to HTTP2\n");
|
|
||||||
httpc->bodystarted = FALSE;
|
httpc->bodystarted = FALSE;
|
||||||
httpc->closed = FALSE;
|
httpc->closed = FALSE;
|
||||||
httpc->header_recvbuf = Curl_add_buffer_init();
|
httpc->header_recvbuf = Curl_add_buffer_init();
|
||||||
@@ -806,17 +796,30 @@ int Curl_http2_switched(struct connectdata *conn)
|
|||||||
httpc->upload_left = 0;
|
httpc->upload_left = 0;
|
||||||
httpc->upload_mem = NULL;
|
httpc->upload_mem = NULL;
|
||||||
httpc->upload_len = 0;
|
httpc->upload_len = 0;
|
||||||
|
httpc->stream_id = -1;
|
||||||
|
|
||||||
conn->httpversion = 20;
|
conn->httpversion = 20;
|
||||||
|
|
||||||
/* Put place holder for status line */
|
/* Put place holder for status line */
|
||||||
Curl_add_buffer(httpc->header_recvbuf, "HTTP/2.0 200\r\n", 14);
|
Curl_add_buffer(httpc->header_recvbuf, "HTTP/2.0 200\r\n", 14);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Curl_http2_switched(struct connectdata *conn)
|
||||||
|
{
|
||||||
/* TODO: May get CURLE_AGAIN */
|
/* TODO: May get CURLE_AGAIN */
|
||||||
|
CURLcode rc;
|
||||||
|
struct http_conn *httpc = &conn->proto.httpc;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
httpc->recv_underlying = (recving)conn->recv[FIRSTSOCKET];
|
||||||
|
httpc->send_underlying = (sending)conn->send[FIRSTSOCKET];
|
||||||
|
conn->recv[FIRSTSOCKET] = http2_recv;
|
||||||
|
conn->send[FIRSTSOCKET] = http2_send;
|
||||||
|
|
||||||
rv = (int) ((Curl_send*)httpc->send_underlying)
|
rv = (int) ((Curl_send*)httpc->send_underlying)
|
||||||
(conn, FIRSTSOCKET,
|
(conn, FIRSTSOCKET,
|
||||||
NGHTTP2_CLIENT_CONNECTION_HEADER,
|
NGHTTP2_CLIENT_CONNECTION_PREFACE,
|
||||||
NGHTTP2_CLIENT_CONNECTION_HEADER_LEN,
|
NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN,
|
||||||
&rc);
|
&rc);
|
||||||
assert(rv == 24);
|
assert(rv == 24);
|
||||||
if(conn->data->req.upgr101 == UPGR101_RECEIVED) {
|
if(conn->data->req.upgr101 == UPGR101_RECEIVED) {
|
||||||
|
@@ -36,12 +36,14 @@ CURLcode Curl_http2_init(struct connectdata *conn);
|
|||||||
CURLcode Curl_http2_send_request(struct connectdata *conn);
|
CURLcode Curl_http2_send_request(struct connectdata *conn);
|
||||||
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
||||||
struct connectdata *conn);
|
struct connectdata *conn);
|
||||||
|
void Curl_http2_setup(struct connectdata *conn);
|
||||||
int Curl_http2_switched(struct connectdata *conn);
|
int Curl_http2_switched(struct connectdata *conn);
|
||||||
#else /* USE_NGHTTP2 */
|
#else /* USE_NGHTTP2 */
|
||||||
#define Curl_http2_init(x)
|
#define Curl_http2_init(x)
|
||||||
#define Curl_http2_send_request(x)
|
#define Curl_http2_send_request(x)
|
||||||
#define Curl_http2_request_upgrade(x,y) CURLE_OK
|
#define Curl_http2_request_upgrade(x,y) CURLE_OK
|
||||||
#define Curl_http2_switched(x)
|
#define Curl_http2_switched(x)
|
||||||
|
#define Curl_http2_setup(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* HEADER_CURL_HTTP2_H */
|
#endif /* HEADER_CURL_HTTP2_H */
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#ifdef USE_WINDOWS_SSPI
|
#ifdef USE_WINDOWS_SSPI
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#if !defined(CURL_DISABLE_HTTP) && defined(USE_HTTP_NEGOTIATE)
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
@@ -300,6 +300,6 @@ void Curl_cleanup_negotiate(struct SessionHandle *data)
|
|||||||
cleanup(&data->state.proxyneg);
|
cleanup(&data->state.proxyneg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* !CURL_DISABLE_HTTP && USE_HTTP_NEGOTIATE */
|
||||||
|
|
||||||
#endif
|
#endif /* USE_WINDOWS_SSPI */
|
||||||
#endif
|
|
||||||
|
@@ -165,7 +165,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Curl_checkheaders(data, "Host:")) {
|
if(!Curl_checkProxyheaders(conn, "Host:")) {
|
||||||
host = aprintf("Host: %s\r\n", hostheader);
|
host = aprintf("Host: %s\r\n", hostheader);
|
||||||
if(!host) {
|
if(!host) {
|
||||||
free(hostheader);
|
free(hostheader);
|
||||||
@@ -173,10 +173,10 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!Curl_checkheaders(data, "Proxy-Connection:"))
|
if(!Curl_checkProxyheaders(conn, "Proxy-Connection:"))
|
||||||
proxyconn = "Proxy-Connection: Keep-Alive\r\n";
|
proxyconn = "Proxy-Connection: Keep-Alive\r\n";
|
||||||
|
|
||||||
if(!Curl_checkheaders(data, "User-Agent:") &&
|
if(!Curl_checkProxyheaders(conn, "User-Agent:") &&
|
||||||
data->set.str[STRING_USERAGENT])
|
data->set.str[STRING_USERAGENT])
|
||||||
useragent = conn->allocptr.uagent;
|
useragent = conn->allocptr.uagent;
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
|||||||
free(hostheader);
|
free(hostheader);
|
||||||
|
|
||||||
if(CURLE_OK == result)
|
if(CURLE_OK == result)
|
||||||
result = Curl_add_custom_headers(conn, req_buffer);
|
result = Curl_add_custom_headers(conn, TRUE, req_buffer);
|
||||||
|
|
||||||
if(CURLE_OK == result)
|
if(CURLE_OK == result)
|
||||||
/* CRLF terminate the request */
|
/* CRLF terminate the request */
|
||||||
|
168
lib/imap.c
168
lib/imap.c
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -131,8 +131,7 @@ const struct Curl_handler Curl_handler_imap = {
|
|||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_IMAP, /* defport */
|
PORT_IMAP, /* defport */
|
||||||
CURLPROTO_IMAP, /* protocol */
|
CURLPROTO_IMAP, /* protocol */
|
||||||
PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD
|
PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD /* flags */
|
||||||
| PROTOPT_NOURLQUERY /* flags */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef USE_SSL
|
#ifdef USE_SSL
|
||||||
@@ -156,9 +155,9 @@ const struct Curl_handler Curl_handler_imaps = {
|
|||||||
imap_disconnect, /* disconnect */
|
imap_disconnect, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_IMAPS, /* defport */
|
PORT_IMAPS, /* defport */
|
||||||
CURLPROTO_IMAP | CURLPROTO_IMAPS, /* protocol */
|
CURLPROTO_IMAPS, /* protocol */
|
||||||
PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NEEDSPWD
|
PROTOPT_CLOSEACTION | PROTOPT_SSL |
|
||||||
| PROTOPT_NOURLQUERY /* flags */
|
PROTOPT_NEEDSPWD /* flags */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -258,7 +257,7 @@ static bool imap_matchresp(const char *line, size_t len, const char *cmd)
|
|||||||
/* Does the command name match and is it followed by a space character or at
|
/* Does the command name match and is it followed by a space character or at
|
||||||
the end of line? */
|
the end of line? */
|
||||||
if(line + cmd_len <= end && Curl_raw_nequal(line, cmd, cmd_len) &&
|
if(line + cmd_len <= end && Curl_raw_nequal(line, cmd, cmd_len) &&
|
||||||
(line[cmd_len] == ' ' || line + cmd_len == end))
|
(line[cmd_len] == ' ' || line + cmd_len + 2 == end))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -332,6 +331,11 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IMAP_SEARCH:
|
||||||
|
if(!imap_matchresp(line, len, "SEARCH"))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
/* Ignore other untagged responses */
|
/* Ignore other untagged responses */
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -439,6 +443,7 @@ static void state(struct connectdata *conn, imapstate newstate)
|
|||||||
"FETCH_FINAL",
|
"FETCH_FINAL",
|
||||||
"APPEND",
|
"APPEND",
|
||||||
"APPEND_FINAL",
|
"APPEND_FINAL",
|
||||||
|
"SEARCH",
|
||||||
"LOGOUT",
|
"LOGOUT",
|
||||||
/* LAST */
|
/* LAST */
|
||||||
};
|
};
|
||||||
@@ -735,9 +740,15 @@ static CURLcode imap_perform_fetch(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send the FETCH command */
|
/* Send the FETCH command */
|
||||||
result = imap_sendf(conn, "FETCH %s BODY[%s]",
|
if(imap->partial)
|
||||||
imap->uid,
|
result = imap_sendf(conn, "FETCH %s BODY[%s]<%s>",
|
||||||
imap->section ? imap->section : "");
|
imap->uid,
|
||||||
|
imap->section ? imap->section : "",
|
||||||
|
imap->partial);
|
||||||
|
else
|
||||||
|
result = imap_sendf(conn, "FETCH %s BODY[%s]",
|
||||||
|
imap->uid,
|
||||||
|
imap->section ? imap->section : "");
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
state(conn, IMAP_FETCH);
|
state(conn, IMAP_FETCH);
|
||||||
@@ -764,7 +775,7 @@ static CURLcode imap_perform_append(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check we know the size of the upload */
|
/* Check we know the size of the upload */
|
||||||
if(conn->data->set.infilesize < 0) {
|
if(conn->data->state.infilesize < 0) {
|
||||||
failf(conn->data, "Cannot APPEND with unknown input file size\n");
|
failf(conn->data, "Cannot APPEND with unknown input file size\n");
|
||||||
return CURLE_UPLOAD_FAILED;
|
return CURLE_UPLOAD_FAILED;
|
||||||
}
|
}
|
||||||
@@ -776,7 +787,7 @@ static CURLcode imap_perform_append(struct connectdata *conn)
|
|||||||
|
|
||||||
/* Send the APPEND command */
|
/* Send the APPEND command */
|
||||||
result = imap_sendf(conn, "APPEND %s (\\Seen) {%" CURL_FORMAT_CURL_OFF_T "}",
|
result = imap_sendf(conn, "APPEND %s (\\Seen) {%" CURL_FORMAT_CURL_OFF_T "}",
|
||||||
mailbox, conn->data->set.infilesize);
|
mailbox, conn->data->state.infilesize);
|
||||||
|
|
||||||
Curl_safefree(mailbox);
|
Curl_safefree(mailbox);
|
||||||
|
|
||||||
@@ -786,6 +797,32 @@ static CURLcode imap_perform_append(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
*
|
||||||
|
* imap_perform_search()
|
||||||
|
*
|
||||||
|
* Sends a SEARCH command.
|
||||||
|
*/
|
||||||
|
static CURLcode imap_perform_search(struct connectdata *conn)
|
||||||
|
{
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
struct IMAP *imap = conn->data->req.protop;
|
||||||
|
|
||||||
|
/* Check we have a query string */
|
||||||
|
if(!imap->query) {
|
||||||
|
failf(conn->data, "Cannot SEARCH without a query string.");
|
||||||
|
return CURLE_URL_MALFORMAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send the SEARCH command */
|
||||||
|
result = imap_sendf(conn, "SEARCH %s", imap->query);
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
state(conn, IMAP_SEARCH);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*
|
*
|
||||||
* imap_perform_logout()
|
* imap_perform_logout()
|
||||||
@@ -1110,10 +1147,6 @@ static CURLcode imap_state_auth_digest_resp(struct connectdata *conn,
|
|||||||
char *rplyb64 = NULL;
|
char *rplyb64 = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
char nonce[64];
|
|
||||||
char realm[128];
|
|
||||||
char algorithm[64];
|
|
||||||
|
|
||||||
(void)instate; /* no use for this yet */
|
(void)instate; /* no use for this yet */
|
||||||
|
|
||||||
if(imapcode != '+') {
|
if(imapcode != '+') {
|
||||||
@@ -1124,30 +1157,26 @@ static CURLcode imap_state_auth_digest_resp(struct connectdata *conn,
|
|||||||
/* Get the challenge message */
|
/* Get the challenge message */
|
||||||
imap_get_message(data->state.buffer, &chlg64);
|
imap_get_message(data->state.buffer, &chlg64);
|
||||||
|
|
||||||
/* Decode the challange message */
|
/* Create the response message */
|
||||||
result = Curl_sasl_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
|
result = Curl_sasl_create_digest_md5_message(data, chlg64,
|
||||||
realm, sizeof(realm),
|
conn->user, conn->passwd,
|
||||||
algorithm, sizeof(algorithm));
|
"imap", &rplyb64, &len);
|
||||||
if(result || strcmp(algorithm, "md5-sess") != 0) {
|
if(result) {
|
||||||
/* Send the cancellation */
|
if(result == CURLE_BAD_CONTENT_ENCODING) {
|
||||||
result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", "*");
|
/* Send the cancellation */
|
||||||
|
result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", "*");
|
||||||
if(!result)
|
|
||||||
state(conn, IMAP_AUTHENTICATE_CANCEL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Create the response message */
|
|
||||||
result = Curl_sasl_create_digest_md5_message(data, nonce, realm,
|
|
||||||
conn->user, conn->passwd,
|
|
||||||
"imap", &rplyb64, &len);
|
|
||||||
if(!result && rplyb64) {
|
|
||||||
/* Send the response */
|
|
||||||
result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", rplyb64);
|
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
state(conn, IMAP_AUTHENTICATE_DIGESTMD5_RESP);
|
state(conn, IMAP_AUTHENTICATE_CANCEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* Send the response */
|
||||||
|
result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", rplyb64);
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
state(conn, IMAP_AUTHENTICATE_DIGESTMD5_RESP);
|
||||||
|
}
|
||||||
|
|
||||||
Curl_safefree(rplyb64);
|
Curl_safefree(rplyb64);
|
||||||
|
|
||||||
@@ -1448,6 +1477,8 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode,
|
|||||||
|
|
||||||
if(imap->custom)
|
if(imap->custom)
|
||||||
result = imap_perform_list(conn);
|
result = imap_perform_list(conn);
|
||||||
|
else if(imap->query)
|
||||||
|
result = imap_perform_search(conn);
|
||||||
else
|
else
|
||||||
result = imap_perform_fetch(conn);
|
result = imap_perform_fetch(conn);
|
||||||
}
|
}
|
||||||
@@ -1587,7 +1618,7 @@ static CURLcode imap_state_append_resp(struct connectdata *conn, int imapcode,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Set the progress upload size */
|
/* Set the progress upload size */
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
|
|
||||||
/* IMAP upload */
|
/* IMAP upload */
|
||||||
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
||||||
@@ -1617,6 +1648,31 @@ static CURLcode imap_state_append_final_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For SEARCH responses */
|
||||||
|
static CURLcode imap_state_search_resp(struct connectdata *conn, int imapcode,
|
||||||
|
imapstate instate)
|
||||||
|
{
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
char *line = conn->data->state.buffer;
|
||||||
|
size_t len = strlen(line);
|
||||||
|
|
||||||
|
(void)instate; /* No use for this yet */
|
||||||
|
|
||||||
|
if(imapcode == '*') {
|
||||||
|
/* Temporarily add the LF character back and send as body to the client */
|
||||||
|
line[len] = '\n';
|
||||||
|
result = Curl_client_write(conn, CLIENTWRITE_BODY, line, len + 1);
|
||||||
|
line[len] = '\0';
|
||||||
|
}
|
||||||
|
else if(imapcode != 'O')
|
||||||
|
result = CURLE_QUOTE_ERROR; /* TODO: Fix error code */
|
||||||
|
else
|
||||||
|
/* End of DO phase */
|
||||||
|
state(conn, IMAP_STOP);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static CURLcode imap_statemach_act(struct connectdata *conn)
|
static CURLcode imap_statemach_act(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
@@ -1739,6 +1795,10 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
|
|||||||
result = imap_state_append_final_resp(conn, imapcode, imapc->state);
|
result = imap_state_append_final_resp(conn, imapcode, imapc->state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IMAP_SEARCH:
|
||||||
|
result = imap_state_search_resp(conn, imapcode, imapc->state);
|
||||||
|
break;
|
||||||
|
|
||||||
case IMAP_LOGOUT:
|
case IMAP_LOGOUT:
|
||||||
/* fallthrough, just stop! */
|
/* fallthrough, just stop! */
|
||||||
default:
|
default:
|
||||||
@@ -1909,6 +1969,8 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
|
|||||||
Curl_safefree(imap->uidvalidity);
|
Curl_safefree(imap->uidvalidity);
|
||||||
Curl_safefree(imap->uid);
|
Curl_safefree(imap->uid);
|
||||||
Curl_safefree(imap->section);
|
Curl_safefree(imap->section);
|
||||||
|
Curl_safefree(imap->partial);
|
||||||
|
Curl_safefree(imap->query);
|
||||||
Curl_safefree(imap->custom);
|
Curl_safefree(imap->custom);
|
||||||
Curl_safefree(imap->custom_params);
|
Curl_safefree(imap->custom_params);
|
||||||
|
|
||||||
@@ -1962,7 +2024,11 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected,
|
|||||||
else if(!imap->custom && selected && imap->uid)
|
else if(!imap->custom && selected && imap->uid)
|
||||||
/* FETCH from the same mailbox */
|
/* FETCH from the same mailbox */
|
||||||
result = imap_perform_fetch(conn);
|
result = imap_perform_fetch(conn);
|
||||||
else if(imap->mailbox && !selected && (imap->custom || imap->uid))
|
else if(!imap->custom && selected && imap->query)
|
||||||
|
/* SEARCH the current mailbox */
|
||||||
|
result = imap_perform_search(conn);
|
||||||
|
else if(imap->mailbox && !selected &&
|
||||||
|
(imap->custom || imap->uid || imap->query))
|
||||||
/* SELECT the mailbox */
|
/* SELECT the mailbox */
|
||||||
result = imap_perform_select(conn);
|
result = imap_perform_select(conn);
|
||||||
else
|
else
|
||||||
@@ -2447,8 +2513,8 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
|
|||||||
|
|
||||||
DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value));
|
DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value));
|
||||||
|
|
||||||
/* Process the known hierarchical parameters (UIDVALIDITY, UID and SECTION)
|
/* Process the known hierarchical parameters (UIDVALIDITY, UID, SECTION and
|
||||||
stripping of the trailing slash character if it is present.
|
PARTIAL) stripping of the trailing slash character if it is present.
|
||||||
|
|
||||||
Note: Unknown parameters trigger a URL_MALFORMAT error. */
|
Note: Unknown parameters trigger a URL_MALFORMAT error. */
|
||||||
if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) {
|
if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) {
|
||||||
@@ -2472,6 +2538,13 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
|
|||||||
imap->section = value;
|
imap->section = value;
|
||||||
value = NULL;
|
value = NULL;
|
||||||
}
|
}
|
||||||
|
else if(Curl_raw_equal(name, "PARTIAL") && !imap->partial) {
|
||||||
|
if(valuelen > 0 && value[valuelen - 1] == '/')
|
||||||
|
value[valuelen - 1] = '\0';
|
||||||
|
|
||||||
|
imap->partial = value;
|
||||||
|
value = NULL;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
Curl_safefree(name);
|
Curl_safefree(name);
|
||||||
Curl_safefree(value);
|
Curl_safefree(value);
|
||||||
@@ -2483,6 +2556,21 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
|
|||||||
Curl_safefree(value);
|
Curl_safefree(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Does the URL contain a query parameter? Only valid when we have a mailbox
|
||||||
|
and no UID as per RFC-5092 */
|
||||||
|
if(imap->mailbox && !imap->uid && *ptr == '?') {
|
||||||
|
/* Find the length of the query parameter */
|
||||||
|
begin = ++ptr;
|
||||||
|
while(imap_is_bchar(*ptr))
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
/* Decode the query parameter */
|
||||||
|
result = Curl_urldecode(data, begin, ptr - begin, &imap->query, NULL,
|
||||||
|
TRUE);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Any extra stuff at the end of the URL is an error */
|
/* Any extra stuff at the end of the URL is an error */
|
||||||
if(*ptr)
|
if(*ptr)
|
||||||
return CURLE_URL_MALFORMAT;
|
return CURLE_URL_MALFORMAT;
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2009 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -53,6 +53,7 @@ typedef enum {
|
|||||||
IMAP_FETCH_FINAL,
|
IMAP_FETCH_FINAL,
|
||||||
IMAP_APPEND,
|
IMAP_APPEND,
|
||||||
IMAP_APPEND_FINAL,
|
IMAP_APPEND_FINAL,
|
||||||
|
IMAP_SEARCH,
|
||||||
IMAP_LOGOUT,
|
IMAP_LOGOUT,
|
||||||
IMAP_LAST /* never used */
|
IMAP_LAST /* never used */
|
||||||
} imapstate;
|
} imapstate;
|
||||||
@@ -67,6 +68,8 @@ struct IMAP {
|
|||||||
char *uidvalidity; /* UIDVALIDITY to check in select */
|
char *uidvalidity; /* UIDVALIDITY to check in select */
|
||||||
char *uid; /* Message UID to fetch */
|
char *uid; /* Message UID to fetch */
|
||||||
char *section; /* Message SECTION to fetch */
|
char *section; /* Message SECTION to fetch */
|
||||||
|
char *partial; /* Message PARTIAL to fetch */
|
||||||
|
char *query; /* Query to search for */
|
||||||
char *custom; /* Custom request */
|
char *custom; /* Custom request */
|
||||||
char *custom_params; /* Parameters for the custom request */
|
char *custom_params; /* Parameters for the custom request */
|
||||||
};
|
};
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -159,7 +159,7 @@ const struct Curl_handler Curl_handler_ldaps = {
|
|||||||
ZERO_NULL, /* disconnect */
|
ZERO_NULL, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_LDAPS, /* defport */
|
PORT_LDAPS, /* defport */
|
||||||
CURLPROTO_LDAP | CURLPROTO_LDAPS, /* protocol */
|
CURLPROTO_LDAPS, /* protocol */
|
||||||
PROTOPT_SSL /* flags */
|
PROTOPT_SSL /* flags */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -147,7 +147,7 @@ static void MD5_Update(MD5_CTX *ctx,
|
|||||||
|
|
||||||
static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
|
static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
|
||||||
{
|
{
|
||||||
unsigned long length;
|
unsigned long length = 0;
|
||||||
CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
|
CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
|
||||||
if(length == 16)
|
if(length == 16)
|
||||||
CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0);
|
CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0);
|
||||||
|
@@ -34,7 +34,9 @@ use Getopt::Std;
|
|||||||
use MIME::Base64;
|
use MIME::Base64;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
use strict;
|
use strict;
|
||||||
use vars qw($opt_b $opt_d $opt_f $opt_h $opt_i $opt_l $opt_n $opt_q $opt_t $opt_u $opt_v $opt_w);
|
use vars qw($opt_b $opt_d $opt_f $opt_h $opt_i $opt_l $opt_n $opt_p $opt_q $opt_s $opt_t $opt_u $opt_v $opt_w);
|
||||||
|
use List::Util;
|
||||||
|
use Text::Wrap;
|
||||||
|
|
||||||
my %urls = (
|
my %urls = (
|
||||||
'nss' =>
|
'nss' =>
|
||||||
@@ -56,13 +58,53 @@ $opt_d = 'release';
|
|||||||
# If the OpenSSL commandline is not in search path you can configure it here!
|
# If the OpenSSL commandline is not in search path you can configure it here!
|
||||||
my $openssl = 'openssl';
|
my $openssl = 'openssl';
|
||||||
|
|
||||||
my $version = '1.20';
|
my $version = '1.21';
|
||||||
|
|
||||||
$opt_w = 76; # default base64 encoded lines length
|
$opt_w = 76; # default base64 encoded lines length
|
||||||
|
|
||||||
|
# default cert types to include in the output (default is to include CAs which may issue SSL server certs)
|
||||||
|
my $default_mozilla_trust_purposes = "SERVER_AUTH";
|
||||||
|
my $default_mozilla_trust_levels = "TRUSTED_DELEGATOR";
|
||||||
|
$opt_p = $default_mozilla_trust_purposes . ":" . $default_mozilla_trust_levels;
|
||||||
|
|
||||||
|
my @valid_mozilla_trust_purposes = (
|
||||||
|
"DIGITAL_SIGNATURE",
|
||||||
|
"NON_REPUDIATION",
|
||||||
|
"KEY_ENCIPHERMENT",
|
||||||
|
"DATA_ENCIPHERMENT",
|
||||||
|
"KEY_AGREEMENT",
|
||||||
|
"KEY_CERT_SIGN",
|
||||||
|
"CRL_SIGN",
|
||||||
|
"SERVER_AUTH",
|
||||||
|
"CLIENT_AUTH",
|
||||||
|
"CODE_SIGNING",
|
||||||
|
"EMAIL_PROTECTION",
|
||||||
|
"IPSEC_END_SYSTEM",
|
||||||
|
"IPSEC_TUNNEL",
|
||||||
|
"IPSEC_USER",
|
||||||
|
"TIME_STAMPING",
|
||||||
|
"STEP_UP_APPROVED"
|
||||||
|
);
|
||||||
|
|
||||||
|
my @valid_mozilla_trust_levels = (
|
||||||
|
"TRUSTED_DELEGATOR", # CAs
|
||||||
|
"NOT_TRUSTED", # Don't trust these certs.
|
||||||
|
"MUST_VERIFY_TRUST", # This explicitly tells us that it ISN'T a CA but is otherwise ok. In other words, this should tell the app to ignore any other sources that claim this is a CA.
|
||||||
|
"TRUSTED" # This cert is trusted, but only for itself and not for delegates (i.e. it is not a CA).
|
||||||
|
);
|
||||||
|
|
||||||
|
my $default_signature_algorithms = $opt_s = "MD5";
|
||||||
|
|
||||||
|
my @valid_signature_algorithms = (
|
||||||
|
"MD5",
|
||||||
|
"SHA1",
|
||||||
|
"SHA256",
|
||||||
|
"SHA512"
|
||||||
|
);
|
||||||
|
|
||||||
$0 =~ s@.*(/|\\)@@;
|
$0 =~ s@.*(/|\\)@@;
|
||||||
$Getopt::Std::STANDARD_HELP_VERSION = 1;
|
$Getopt::Std::STANDARD_HELP_VERSION = 1;
|
||||||
getopts('bd:fhilnqtuvw:');
|
getopts('bd:fhilnp:qs:tuvw:');
|
||||||
|
|
||||||
if(!defined($opt_d)) {
|
if(!defined($opt_d)) {
|
||||||
# to make plain "-d" use not cause warnings, and actually still work
|
# to make plain "-d" use not cause warnings, and actually still work
|
||||||
@@ -102,7 +144,7 @@ sub WARNING_MESSAGE() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub HELP_MESSAGE() {
|
sub HELP_MESSAGE() {
|
||||||
print "Usage:\t${0} [-b] [-d<certdata>] [-f] [-i] [-l] [-n] [-q] [-t] [-u] [-v] [-w<l>] [<outputfile>]\n";
|
print "Usage:\t${0} [-b] [-d<certdata>] [-f] [-i] [-l] [-n] [-p<purposes:levels>] [-q] [-s<algorithms>] [-t] [-u] [-v] [-w<l>] [<outputfile>]\n";
|
||||||
print "\t-b\tbackup an existing version of ca-bundle.crt\n";
|
print "\t-b\tbackup an existing version of ca-bundle.crt\n";
|
||||||
print "\t-d\tspecify Mozilla tree to pull certdata.txt or custom URL\n";
|
print "\t-d\tspecify Mozilla tree to pull certdata.txt or custom URL\n";
|
||||||
print "\t\t Valid names are:\n";
|
print "\t\t Valid names are:\n";
|
||||||
@@ -111,7 +153,15 @@ sub HELP_MESSAGE() {
|
|||||||
print "\t-i\tprint version info about used modules\n";
|
print "\t-i\tprint version info about used modules\n";
|
||||||
print "\t-l\tprint license info about certdata.txt\n";
|
print "\t-l\tprint license info about certdata.txt\n";
|
||||||
print "\t-n\tno download of certdata.txt (to use existing)\n";
|
print "\t-n\tno download of certdata.txt (to use existing)\n";
|
||||||
|
print wrap("\t","\t\t", "-p\tlist 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. (default: $default_mozilla_trust_purposes:$default_mozilla_trust_levels)"), "\n";
|
||||||
|
print "\t\t Valid purposes are:\n";
|
||||||
|
print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_purposes ) ), "\n";
|
||||||
|
print "\t\t Valid levels are:\n";
|
||||||
|
print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_levels ) ), "\n";
|
||||||
print "\t-q\tbe really quiet (no progress output at all)\n";
|
print "\t-q\tbe really quiet (no progress output at all)\n";
|
||||||
|
print wrap("\t","\t\t", "-s\tcomma separated list of certificate signatures/hashes to output in plain text mode. (default: $default_signature_algorithms)\n");
|
||||||
|
print "\t\t Valid signature algorithms are:\n";
|
||||||
|
print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_signature_algorithms ) ), "\n";
|
||||||
print "\t-t\tinclude plain text listing of certificates\n";
|
print "\t-t\tinclude plain text listing of certificates\n";
|
||||||
print "\t-u\tunlink (remove) certdata.txt after processing\n";
|
print "\t-u\tunlink (remove) certdata.txt after processing\n";
|
||||||
print "\t-v\tbe verbose and print out processed CAs\n";
|
print "\t-v\tbe verbose and print out processed CAs\n";
|
||||||
@@ -126,6 +176,61 @@ sub VERSION_MESSAGE() {
|
|||||||
WARNING_MESSAGE() unless ($opt_q || $url =~ m/^(ht|f)tps:/i );
|
WARNING_MESSAGE() unless ($opt_q || $url =~ m/^(ht|f)tps:/i );
|
||||||
HELP_MESSAGE() if ($opt_h);
|
HELP_MESSAGE() if ($opt_h);
|
||||||
|
|
||||||
|
sub IS_IN_LIST($@) {
|
||||||
|
my $target = shift;
|
||||||
|
|
||||||
|
return defined(List::Util::first { $target eq $_ } @_);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parses $param_string as a case insensitive comma separated list with optional whitespace
|
||||||
|
# validates that only allowed parameters are supplied
|
||||||
|
sub PARSE_CSV_PARAM($$@) {
|
||||||
|
my $description = shift;
|
||||||
|
my $param_string = shift;
|
||||||
|
my @valid_values = @_;
|
||||||
|
|
||||||
|
my @values = map {
|
||||||
|
s/^\s+//; # strip leading spaces
|
||||||
|
s/\s+$//; # strip trailing spaces
|
||||||
|
uc $_ # return the modified string as upper case
|
||||||
|
} split( ',', $param_string );
|
||||||
|
|
||||||
|
# Find all values which are not in the list of valid values or "ALL"
|
||||||
|
my @invalid = grep { !IS_IN_LIST($_,"ALL",@valid_values) } @values;
|
||||||
|
|
||||||
|
if ( scalar(@invalid) > 0 ) {
|
||||||
|
# Tell the user which parameters were invalid and print the standard help message which will exit
|
||||||
|
print "Error: Invalid ", $description, scalar(@invalid) == 1 ? ": " : "s: ", join( ", ", map { "\"$_\"" } @invalid ), "\n";
|
||||||
|
HELP_MESSAGE();
|
||||||
|
}
|
||||||
|
|
||||||
|
@values = @valid_values if ( IS_IN_LIST("ALL",@values) );
|
||||||
|
|
||||||
|
return @values;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $opt_p !~ m/:/ ) {
|
||||||
|
print "Error: Mozilla trust identifier list must include both purposes and levels\n";
|
||||||
|
HELP_MESSAGE();
|
||||||
|
}
|
||||||
|
|
||||||
|
(my $included_mozilla_trust_purposes_string, my $included_mozilla_trust_levels_string) = split( ':', $opt_p );
|
||||||
|
my @included_mozilla_trust_purposes = PARSE_CSV_PARAM( "trust purpose", $included_mozilla_trust_purposes_string, @valid_mozilla_trust_purposes );
|
||||||
|
my @included_mozilla_trust_levels = PARSE_CSV_PARAM( "trust level", $included_mozilla_trust_levels_string, @valid_mozilla_trust_levels );
|
||||||
|
|
||||||
|
my @included_signature_algorithms = PARSE_CSV_PARAM( "signature algorithm", $opt_s, @valid_signature_algorithms );
|
||||||
|
|
||||||
|
sub SHOULD_OUTPUT_CERT(%) {
|
||||||
|
my %trust_purposes_by_level = @_;
|
||||||
|
|
||||||
|
foreach my $level (@included_mozilla_trust_levels) {
|
||||||
|
# for each level we want to output, see if any of our desired purposes are included
|
||||||
|
return 1 if ( defined( List::Util::first { IS_IN_LIST( $_, @included_mozilla_trust_purposes ) } @{$trust_purposes_by_level{$level}} ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
my $crt = $ARGV[0] || 'ca-bundle.crt';
|
my $crt = $ARGV[0] || 'ca-bundle.crt';
|
||||||
(my $txt = $url) =~ s@(.*/|\?.*)@@g;
|
(my $txt = $url) =~ s@(.*/|\?.*)@@g;
|
||||||
|
|
||||||
@@ -209,7 +314,7 @@ while (<TXT>) {
|
|||||||
if ($start_of_cert && /^CKA_LABEL UTF8 \"(.*)\"/) {
|
if ($start_of_cert && /^CKA_LABEL UTF8 \"(.*)\"/) {
|
||||||
$caname = $1;
|
$caname = $1;
|
||||||
}
|
}
|
||||||
my $untrusted = 1;
|
my %trust_purposes_by_level;
|
||||||
if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) {
|
if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) {
|
||||||
my $data;
|
my $data;
|
||||||
while (<TXT>) {
|
while (<TXT>) {
|
||||||
@@ -226,14 +331,21 @@ while (<TXT>) {
|
|||||||
last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/);
|
last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/);
|
||||||
chomp;
|
chomp;
|
||||||
}
|
}
|
||||||
# now scan the trust part for untrusted certs
|
# now scan the trust part to determine how we should trust this cert
|
||||||
while (<TXT>) {
|
while (<TXT>) {
|
||||||
last if (/^#/);
|
last if (/^#/);
|
||||||
if (/^CKA_TRUST_SERVER_AUTH\s+CK_TRUST\s+CKT_NSS_TRUSTED_DELEGATOR$/) {
|
if (/^CKA_TRUST_([A-Z_]+)\s+CK_TRUST\s+CKT_NSS_([A-Z_]+)\s*$/) {
|
||||||
$untrusted = 0;
|
if ( !IS_IN_LIST($1,@valid_mozilla_trust_purposes) ) {
|
||||||
|
print STDERR "Warning: Unrecognized trust purpose for cert: $caname. Trust purpose: $1. Trust Level: $2\n" if (!$opt_q);
|
||||||
|
} elsif ( !IS_IN_LIST($2,@valid_mozilla_trust_levels) ) {
|
||||||
|
print STDERR "Warning: Unrecognized trust level for cert: $caname. Trust purpose: $1. Trust Level: $2\n" if (!$opt_q);
|
||||||
|
} else {
|
||||||
|
push @{$trust_purposes_by_level{$2}}, $1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($untrusted) {
|
|
||||||
|
if ( !SHOULD_OUTPUT_CERT(%trust_purposes_by_level) ) {
|
||||||
$skipnum ++;
|
$skipnum ++;
|
||||||
} else {
|
} else {
|
||||||
my $encoded = MIME::Base64::encode_base64($data, '');
|
my $encoded = MIME::Base64::encode_base64($data, '');
|
||||||
@@ -242,11 +354,34 @@ while (<TXT>) {
|
|||||||
. $encoded
|
. $encoded
|
||||||
. "-----END CERTIFICATE-----\n";
|
. "-----END CERTIFICATE-----\n";
|
||||||
print CRT "\n$caname\n";
|
print CRT "\n$caname\n";
|
||||||
print CRT ("=" x length($caname) . "\n");
|
|
||||||
|
my $maxStringLength = length($caname);
|
||||||
|
if ($opt_t) {
|
||||||
|
foreach my $key (keys %trust_purposes_by_level) {
|
||||||
|
my $string = $key . ": " . join(", ", @{$trust_purposes_by_level{$key}});
|
||||||
|
$maxStringLength = List::Util::max( length($string), $maxStringLength );
|
||||||
|
print CRT $string . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print CRT ("=" x $maxStringLength . "\n");
|
||||||
if (!$opt_t) {
|
if (!$opt_t) {
|
||||||
print CRT $pem;
|
print CRT $pem;
|
||||||
} else {
|
} else {
|
||||||
my $pipe = "|$openssl x509 -md5 -fingerprint -text -inform PEM";
|
my $pipe = "";
|
||||||
|
foreach my $hash (@included_signature_algorithms) {
|
||||||
|
$pipe = "|$openssl x509 -" . $hash . " -fingerprint -noout -inform PEM";
|
||||||
|
if (!$stdout) {
|
||||||
|
$pipe .= " >> $crt.~";
|
||||||
|
close(CRT) or die "Couldn't close $crt.~: $!";
|
||||||
|
}
|
||||||
|
open(TMP, $pipe) or die "Couldn't open openssl pipe: $!";
|
||||||
|
print TMP $pem;
|
||||||
|
close(TMP) or die "Couldn't close openssl pipe: $!";
|
||||||
|
if (!$stdout) {
|
||||||
|
open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pipe = "|$openssl x509 -text -inform PEM";
|
||||||
if (!$stdout) {
|
if (!$stdout) {
|
||||||
$pipe .= " >> $crt.~";
|
$pipe .= " >> $crt.~";
|
||||||
close(CRT) or die "Couldn't close $crt.~: $!";
|
close(CRT) or die "Couldn't close $crt.~: $!";
|
||||||
@@ -279,7 +414,7 @@ unless( $stdout ) {
|
|||||||
rename "$crt.~", $crt or die "Failed to rename $crt.~ to $crt: $!\n";
|
rename "$crt.~", $crt or die "Failed to rename $crt.~ to $crt: $!\n";
|
||||||
}
|
}
|
||||||
unlink $txt if ($opt_u);
|
unlink $txt if ($opt_u);
|
||||||
print STDERR "Done ($certnum CA certs processed, $skipnum untrusted skipped).\n" if (!$opt_q);
|
print STDERR "Done ($certnum CA certs processed, $skipnum skipped).\n" if (!$opt_q);
|
||||||
|
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -804,11 +804,11 @@ static int dprintf_formatf(
|
|||||||
len = 0;
|
len = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(prec != -1)
|
||||||
|
len = (size_t)prec;
|
||||||
else
|
else
|
||||||
len = strlen(str);
|
len = strlen(str);
|
||||||
|
|
||||||
if(prec != -1 && (size_t) prec < len)
|
|
||||||
len = (size_t)prec;
|
|
||||||
width -= (long)len;
|
width -= (long)len;
|
||||||
|
|
||||||
if(p->flags & FLAGS_ALT)
|
if(p->flags & FLAGS_ALT)
|
||||||
@@ -818,7 +818,7 @@ static int dprintf_formatf(
|
|||||||
while(width-- > 0)
|
while(width-- > 0)
|
||||||
OUTCHAR(' ');
|
OUTCHAR(' ');
|
||||||
|
|
||||||
while(len-- > 0)
|
while((len-- > 0) && *str)
|
||||||
OUTCHAR(*str++);
|
OUTCHAR(*str++);
|
||||||
if(p->flags&FLAGS_LEFT)
|
if(p->flags&FLAGS_LEFT)
|
||||||
while(width-- > 0)
|
while(width-- > 0)
|
||||||
|
10
lib/multi.c
10
lib/multi.c
@@ -404,6 +404,8 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
|||||||
/* Point to the multi's connection cache */
|
/* Point to the multi's connection cache */
|
||||||
data->state.conn_cache = multi->conn_cache;
|
data->state.conn_cache = multi->conn_cache;
|
||||||
|
|
||||||
|
data->state.infilesize = data->set.filesize;
|
||||||
|
|
||||||
/* This adds the new entry at the 'end' of the doubly-linked circular
|
/* This adds the new entry at the 'end' of the doubly-linked circular
|
||||||
list of SessionHandle structs to try and maintain a FIFO queue so
|
list of SessionHandle structs to try and maintain a FIFO queue so
|
||||||
the pipelined requests are in order. */
|
the pipelined requests are in order. */
|
||||||
@@ -828,7 +830,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
|
|||||||
curlfds = nfds; /* number of internal file descriptors */
|
curlfds = nfds; /* number of internal file descriptors */
|
||||||
nfds += extra_nfds; /* add the externally provided ones */
|
nfds += extra_nfds; /* add the externally provided ones */
|
||||||
|
|
||||||
if(nfds) {
|
if(nfds || extra_nfds) {
|
||||||
ufds = malloc(nfds * sizeof(struct pollfd));
|
ufds = malloc(nfds * sizeof(struct pollfd));
|
||||||
if(!ufds)
|
if(!ufds)
|
||||||
return CURLM_OUT_OF_MEMORY;
|
return CURLM_OUT_OF_MEMORY;
|
||||||
@@ -1024,7 +1026,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
if(CURLE_OK == data->result) {
|
if(CURLE_OK == data->result) {
|
||||||
/* after init, go CONNECT */
|
/* after init, go CONNECT */
|
||||||
multistate(data, CURLM_STATE_CONNECT);
|
multistate(data, CURLM_STATE_CONNECT);
|
||||||
Curl_pgrsTime(data, TIMER_STARTSINGLE);
|
Curl_pgrsTime(data, TIMER_STARTOP);
|
||||||
result = CURLM_CALL_MULTI_PERFORM;
|
result = CURLM_CALL_MULTI_PERFORM;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1036,6 +1038,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
|
|
||||||
case CURLM_STATE_CONNECT:
|
case CURLM_STATE_CONNECT:
|
||||||
/* Connect. We want to get a connection identifier filled in. */
|
/* Connect. We want to get a connection identifier filled in. */
|
||||||
|
Curl_pgrsTime(data, TIMER_STARTSINGLE);
|
||||||
data->result = Curl_connect(data, &data->easy_conn,
|
data->result = Curl_connect(data, &data->easy_conn,
|
||||||
&async, &protocol_connect);
|
&async, &protocol_connect);
|
||||||
if(CURLE_NO_CONNECTION_AVAILABLE == data->result) {
|
if(CURLE_NO_CONNECTION_AVAILABLE == data->result) {
|
||||||
@@ -1804,10 +1807,13 @@ static void close_all_connections(struct Curl_multi *multi)
|
|||||||
|
|
||||||
conn = Curl_conncache_find_first_connection(multi->conn_cache);
|
conn = Curl_conncache_find_first_connection(multi->conn_cache);
|
||||||
while(conn) {
|
while(conn) {
|
||||||
|
SIGPIPE_VARIABLE(pipe_st);
|
||||||
conn->data = multi->closure_handle;
|
conn->data = multi->closure_handle;
|
||||||
|
|
||||||
|
sigpipe_ignore(conn->data, &pipe_st);
|
||||||
/* This will remove the connection from the cache */
|
/* This will remove the connection from the cache */
|
||||||
(void)Curl_disconnect(conn, FALSE);
|
(void)Curl_disconnect(conn, FALSE);
|
||||||
|
sigpipe_restore(&pipe_st);
|
||||||
|
|
||||||
conn = Curl_conncache_find_first_connection(multi->conn_cache);
|
conn = Curl_conncache_find_first_connection(multi->conn_cache);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -61,7 +61,7 @@ int Curl_parsenetrc(const char *host,
|
|||||||
{
|
{
|
||||||
FILE *file;
|
FILE *file;
|
||||||
int retcode=1;
|
int retcode=1;
|
||||||
int specific_login = (**loginp != 0);
|
int specific_login = (*loginp && **loginp != 0);
|
||||||
bool netrc_alloc = FALSE;
|
bool netrc_alloc = FALSE;
|
||||||
enum host_lookup_state state=NOTHING;
|
enum host_lookup_state state=NOTHING;
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ int Curl_parsenetrc(const char *host,
|
|||||||
tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
|
tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
|
||||||
while(!done && tok) {
|
while(!done && tok) {
|
||||||
|
|
||||||
if(**loginp && **passwordp) {
|
if((*loginp && **loginp) && (*passwordp && **passwordp)) {
|
||||||
done=TRUE;
|
done=TRUE;
|
||||||
break;
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -353,9 +353,11 @@ static int parsedate(const char *date, time_t *output)
|
|||||||
/* a name coming up */
|
/* a name coming up */
|
||||||
char buf[32]="";
|
char buf[32]="";
|
||||||
size_t len;
|
size_t len;
|
||||||
sscanf(date, "%31[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]",
|
if(sscanf(date, "%31[ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
buf);
|
"abcdefghijklmnopqrstuvwxyz]", buf))
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
|
else
|
||||||
|
len = 0;
|
||||||
|
|
||||||
if(wdaynum == -1) {
|
if(wdaynum == -1) {
|
||||||
wdaynum = checkday(buf, len);
|
wdaynum = checkday(buf, len);
|
||||||
|
44
lib/pop3.c
44
lib/pop3.c
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -156,7 +156,7 @@ const struct Curl_handler Curl_handler_pop3s = {
|
|||||||
pop3_disconnect, /* disconnect */
|
pop3_disconnect, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_POP3S, /* defport */
|
PORT_POP3S, /* defport */
|
||||||
CURLPROTO_POP3 | CURLPROTO_POP3S, /* protocol */
|
CURLPROTO_POP3S, /* protocol */
|
||||||
PROTOPT_CLOSEACTION | PROTOPT_SSL
|
PROTOPT_CLOSEACTION | PROTOPT_SSL
|
||||||
| PROTOPT_NOURLQUERY /* flags */
|
| PROTOPT_NOURLQUERY /* flags */
|
||||||
};
|
};
|
||||||
@@ -978,10 +978,6 @@ static CURLcode pop3_state_auth_digest_resp(struct connectdata *conn,
|
|||||||
char *rplyb64 = NULL;
|
char *rplyb64 = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
char nonce[64];
|
|
||||||
char realm[128];
|
|
||||||
char algorithm[64];
|
|
||||||
|
|
||||||
(void)instate; /* no use for this yet */
|
(void)instate; /* no use for this yet */
|
||||||
|
|
||||||
if(pop3code != '+') {
|
if(pop3code != '+') {
|
||||||
@@ -992,30 +988,26 @@ static CURLcode pop3_state_auth_digest_resp(struct connectdata *conn,
|
|||||||
/* Get the challenge message */
|
/* Get the challenge message */
|
||||||
pop3_get_message(data->state.buffer, &chlg64);
|
pop3_get_message(data->state.buffer, &chlg64);
|
||||||
|
|
||||||
/* Decode the challange message */
|
/* Create the response message */
|
||||||
result = Curl_sasl_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
|
result = Curl_sasl_create_digest_md5_message(data, chlg64,
|
||||||
realm, sizeof(realm),
|
conn->user, conn->passwd,
|
||||||
algorithm, sizeof(algorithm));
|
"pop", &rplyb64, &len);
|
||||||
if(result || strcmp(algorithm, "md5-sess") != 0) {
|
if(result) {
|
||||||
/* Send the cancellation */
|
if(result == CURLE_BAD_CONTENT_ENCODING) {
|
||||||
result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "*");
|
/* Send the cancellation */
|
||||||
|
result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "*");
|
||||||
if(!result)
|
|
||||||
state(conn, POP3_AUTH_CANCEL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Create the response message */
|
|
||||||
result = Curl_sasl_create_digest_md5_message(data, nonce, realm,
|
|
||||||
conn->user, conn->passwd,
|
|
||||||
"pop", &rplyb64, &len);
|
|
||||||
if(!result && rplyb64) {
|
|
||||||
/* Send the response */
|
|
||||||
result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", rplyb64);
|
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
state(conn, POP3_AUTH_DIGESTMD5_RESP);
|
state(conn, POP3_AUTH_CANCEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* Send the response */
|
||||||
|
result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", rplyb64);
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
state(conn, POP3_AUTH_DIGESTMD5_RESP);
|
||||||
|
}
|
||||||
|
|
||||||
Curl_safefree(rplyb64);
|
Curl_safefree(rplyb64);
|
||||||
|
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -172,8 +172,12 @@ void Curl_pgrsTime(struct SessionHandle *data, timerid timer)
|
|||||||
case TIMER_NONE:
|
case TIMER_NONE:
|
||||||
/* mistake filter */
|
/* mistake filter */
|
||||||
break;
|
break;
|
||||||
|
case TIMER_STARTOP:
|
||||||
|
/* This is set at the start of a transfer */
|
||||||
|
data->progress.t_startop = now;
|
||||||
|
break;
|
||||||
case TIMER_STARTSINGLE:
|
case TIMER_STARTSINGLE:
|
||||||
/* This is set at the start of a single fetch */
|
/* This is set at the start of each single fetch */
|
||||||
data->progress.t_startsingle = now;
|
data->progress.t_startsingle = now;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -7,7 +7,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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -27,13 +27,14 @@
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TIMER_NONE,
|
TIMER_NONE,
|
||||||
|
TIMER_STARTOP,
|
||||||
|
TIMER_STARTSINGLE,
|
||||||
TIMER_NAMELOOKUP,
|
TIMER_NAMELOOKUP,
|
||||||
TIMER_CONNECT,
|
TIMER_CONNECT,
|
||||||
TIMER_APPCONNECT,
|
TIMER_APPCONNECT,
|
||||||
TIMER_PRETRANSFER,
|
TIMER_PRETRANSFER,
|
||||||
TIMER_STARTTRANSFER,
|
TIMER_STARTTRANSFER,
|
||||||
TIMER_POSTRANSFER,
|
TIMER_POSTRANSFER,
|
||||||
TIMER_STARTSINGLE,
|
|
||||||
TIMER_STARTACCEPT,
|
TIMER_STARTACCEPT,
|
||||||
TIMER_REDIRECT,
|
TIMER_REDIRECT,
|
||||||
TIMER_LAST /* must be last */
|
TIMER_LAST /* must be last */
|
||||||
|
28
lib/rtsp.c
28
lib/rtsp.c
@@ -341,7 +341,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Transport Header for SETUP requests */
|
/* Transport Header for SETUP requests */
|
||||||
p_transport = Curl_checkheaders(data, "Transport:");
|
p_transport = Curl_checkheaders(conn, "Transport:");
|
||||||
if(rtspreq == RTSPREQ_SETUP && !p_transport) {
|
if(rtspreq == RTSPREQ_SETUP && !p_transport) {
|
||||||
/* New Transport: setting? */
|
/* New Transport: setting? */
|
||||||
if(data->set.str[STRING_RTSP_TRANSPORT]) {
|
if(data->set.str[STRING_RTSP_TRANSPORT]) {
|
||||||
@@ -365,11 +365,11 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
/* Accept Headers for DESCRIBE requests */
|
/* Accept Headers for DESCRIBE requests */
|
||||||
if(rtspreq == RTSPREQ_DESCRIBE) {
|
if(rtspreq == RTSPREQ_DESCRIBE) {
|
||||||
/* Accept Header */
|
/* Accept Header */
|
||||||
p_accept = Curl_checkheaders(data, "Accept:")?
|
p_accept = Curl_checkheaders(conn, "Accept:")?
|
||||||
NULL:"Accept: application/sdp\r\n";
|
NULL:"Accept: application/sdp\r\n";
|
||||||
|
|
||||||
/* Accept-Encoding header */
|
/* Accept-Encoding header */
|
||||||
if(!Curl_checkheaders(data, "Accept-Encoding:") &&
|
if(!Curl_checkheaders(conn, "Accept-Encoding:") &&
|
||||||
data->set.str[STRING_ENCODING]) {
|
data->set.str[STRING_ENCODING]) {
|
||||||
Curl_safefree(conn->allocptr.accept_encoding);
|
Curl_safefree(conn->allocptr.accept_encoding);
|
||||||
conn->allocptr.accept_encoding =
|
conn->allocptr.accept_encoding =
|
||||||
@@ -386,18 +386,18 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
it might have been used in the proxy connect, but if we have got a header
|
it might have been used in the proxy connect, but if we have got a header
|
||||||
with the user-agent string specified, we erase the previously made string
|
with the user-agent string specified, we erase the previously made string
|
||||||
here. */
|
here. */
|
||||||
if(Curl_checkheaders(data, "User-Agent:") && conn->allocptr.uagent) {
|
if(Curl_checkheaders(conn, "User-Agent:") && conn->allocptr.uagent) {
|
||||||
Curl_safefree(conn->allocptr.uagent);
|
Curl_safefree(conn->allocptr.uagent);
|
||||||
conn->allocptr.uagent = NULL;
|
conn->allocptr.uagent = NULL;
|
||||||
}
|
}
|
||||||
else if(!Curl_checkheaders(data, "User-Agent:") &&
|
else if(!Curl_checkheaders(conn, "User-Agent:") &&
|
||||||
data->set.str[STRING_USERAGENT]) {
|
data->set.str[STRING_USERAGENT]) {
|
||||||
p_uagent = conn->allocptr.uagent;
|
p_uagent = conn->allocptr.uagent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Referrer */
|
/* Referrer */
|
||||||
Curl_safefree(conn->allocptr.ref);
|
Curl_safefree(conn->allocptr.ref);
|
||||||
if(data->change.referer && !Curl_checkheaders(data, "Referer:"))
|
if(data->change.referer && !Curl_checkheaders(conn, "Referer:"))
|
||||||
conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
|
conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
|
||||||
else
|
else
|
||||||
conn->allocptr.ref = NULL;
|
conn->allocptr.ref = NULL;
|
||||||
@@ -414,7 +414,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
(rtspreq & (RTSPREQ_PLAY | RTSPREQ_PAUSE | RTSPREQ_RECORD))) {
|
(rtspreq & (RTSPREQ_PLAY | RTSPREQ_PAUSE | RTSPREQ_RECORD))) {
|
||||||
|
|
||||||
/* Check to see if there is a range set in the custom headers */
|
/* Check to see if there is a range set in the custom headers */
|
||||||
if(!Curl_checkheaders(data, "Range:") && data->state.range) {
|
if(!Curl_checkheaders(conn, "Range:") && data->state.range) {
|
||||||
Curl_safefree(conn->allocptr.rangeline);
|
Curl_safefree(conn->allocptr.rangeline);
|
||||||
conn->allocptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
|
conn->allocptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
|
||||||
p_range = conn->allocptr.rangeline;
|
p_range = conn->allocptr.rangeline;
|
||||||
@@ -424,11 +424,11 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
/*
|
/*
|
||||||
* Sanity check the custom headers
|
* Sanity check the custom headers
|
||||||
*/
|
*/
|
||||||
if(Curl_checkheaders(data, "CSeq:")) {
|
if(Curl_checkheaders(conn, "CSeq:")) {
|
||||||
failf(data, "CSeq cannot be set as a custom header.");
|
failf(data, "CSeq cannot be set as a custom header.");
|
||||||
return CURLE_RTSP_CSEQ_ERROR;
|
return CURLE_RTSP_CSEQ_ERROR;
|
||||||
}
|
}
|
||||||
if(Curl_checkheaders(data, "Session:")) {
|
if(Curl_checkheaders(conn, "Session:")) {
|
||||||
failf(data, "Session ID cannot be set as a custom header.");
|
failf(data, "Session ID cannot be set as a custom header.");
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
}
|
}
|
||||||
@@ -484,7 +484,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = Curl_add_custom_headers(conn, req_buffer);
|
result = Curl_add_custom_headers(conn, FALSE, req_buffer);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -493,7 +493,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
rtspreq == RTSPREQ_GET_PARAMETER) {
|
rtspreq == RTSPREQ_GET_PARAMETER) {
|
||||||
|
|
||||||
if(data->set.upload) {
|
if(data->set.upload) {
|
||||||
putsize = data->set.infilesize;
|
putsize = data->state.infilesize;
|
||||||
data->set.httpreq = HTTPREQ_PUT;
|
data->set.httpreq = HTTPREQ_PUT;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -507,7 +507,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
if(putsize > 0 || postsize > 0) {
|
if(putsize > 0 || postsize > 0) {
|
||||||
/* As stated in the http comments, it is probably not wise to
|
/* As stated in the http comments, it is probably not wise to
|
||||||
* actually set a custom Content-Length in the headers */
|
* actually set a custom Content-Length in the headers */
|
||||||
if(!Curl_checkheaders(data, "Content-Length:")) {
|
if(!Curl_checkheaders(conn, "Content-Length:")) {
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
"Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n",
|
"Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n",
|
||||||
(data->set.upload ? putsize : postsize));
|
(data->set.upload ? putsize : postsize));
|
||||||
@@ -517,7 +517,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
|
|
||||||
if(rtspreq == RTSPREQ_SET_PARAMETER ||
|
if(rtspreq == RTSPREQ_SET_PARAMETER ||
|
||||||
rtspreq == RTSPREQ_GET_PARAMETER) {
|
rtspreq == RTSPREQ_GET_PARAMETER) {
|
||||||
if(!Curl_checkheaders(data, "Content-Type:")) {
|
if(!Curl_checkheaders(conn, "Content-Type:")) {
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
"Content-Type: text/parameters\r\n");
|
"Content-Type: text/parameters\r\n");
|
||||||
if(result)
|
if(result)
|
||||||
@@ -526,7 +526,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(rtspreq == RTSPREQ_ANNOUNCE) {
|
if(rtspreq == RTSPREQ_ANNOUNCE) {
|
||||||
if(!Curl_checkheaders(data, "Content-Type:")) {
|
if(!Curl_checkheaders(conn, "Content-Type:")) {
|
||||||
result = Curl_add_bufferf(req_buffer,
|
result = Curl_add_bufferf(req_buffer,
|
||||||
"Content-Type: application/sdp\r\n");
|
"Content-Type: application/sdp\r\n");
|
||||||
if(result)
|
if(result)
|
||||||
|
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -422,7 +422,7 @@ CURLcode Curl_client_write(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(type & CLIENTWRITE_BODY) {
|
if(type & CLIENTWRITE_BODY) {
|
||||||
if((conn->handler->protocol&CURLPROTO_FTP) &&
|
if((conn->handler->protocol&PROTO_FAMILY_FTP) &&
|
||||||
conn->proto.ftpc.transfertype == 'A') {
|
conn->proto.ftpc.transfertype == 'A') {
|
||||||
/* convert from the network encoding */
|
/* convert from the network encoding */
|
||||||
CURLcode rc = Curl_convert_from_network(data, ptr, len);
|
CURLcode rc = Curl_convert_from_network(data, ptr, len);
|
||||||
|
76
lib/smtp.c
76
lib/smtp.c
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -155,7 +155,7 @@ const struct Curl_handler Curl_handler_smtps = {
|
|||||||
smtp_disconnect, /* disconnect */
|
smtp_disconnect, /* disconnect */
|
||||||
ZERO_NULL, /* readwrite */
|
ZERO_NULL, /* readwrite */
|
||||||
PORT_SMTPS, /* defport */
|
PORT_SMTPS, /* defport */
|
||||||
CURLPROTO_SMTP | CURLPROTO_SMTPS, /* protocol */
|
CURLPROTO_SMTPS, /* protocol */
|
||||||
PROTOPT_CLOSEACTION | PROTOPT_SSL
|
PROTOPT_CLOSEACTION | PROTOPT_SSL
|
||||||
| PROTOPT_NOURLQUERY /* flags */
|
| PROTOPT_NOURLQUERY /* flags */
|
||||||
};
|
};
|
||||||
@@ -349,10 +349,11 @@ static CURLcode smtp_perform_ehlo(struct connectdata *conn)
|
|||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
||||||
|
|
||||||
smtpc->authmechs = 0; /* No known authentication mechanisms yet */
|
smtpc->authmechs = 0; /* No known authentication mechanisms yet */
|
||||||
smtpc->authused = 0; /* Clear the authentication mechanism used
|
smtpc->authused = 0; /* Clear the authentication mechanism used
|
||||||
for esmtp connections */
|
for esmtp connections */
|
||||||
smtpc->tls_supported = FALSE; /* Clear the TLS capability */
|
smtpc->tls_supported = FALSE; /* Clear the TLS capability */
|
||||||
|
smtpc->auth_supported = FALSE; /* Clear the AUTH capability */
|
||||||
|
|
||||||
/* Send the EHLO command */
|
/* Send the EHLO command */
|
||||||
result = Curl_pp_sendf(&smtpc->pp, "EHLO %s", smtpc->domain);
|
result = Curl_pp_sendf(&smtpc->pp, "EHLO %s", smtpc->domain);
|
||||||
@@ -475,15 +476,16 @@ static CURLcode smtp_perform_auth(struct connectdata *conn,
|
|||||||
static CURLcode smtp_perform_authentication(struct connectdata *conn)
|
static CURLcode smtp_perform_authentication(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
|
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
||||||
const char *mech = NULL;
|
const char *mech = NULL;
|
||||||
char *initresp = NULL;
|
char *initresp = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
smtpstate state1 = SMTP_STOP;
|
smtpstate state1 = SMTP_STOP;
|
||||||
smtpstate state2 = SMTP_STOP;
|
smtpstate state2 = SMTP_STOP;
|
||||||
|
|
||||||
/* Check we have a username and password to authenticate with and end the
|
/* Check we have a username and password to authenticate with, and the
|
||||||
connect phase if we don't */
|
server supports authentiation, and end the connect phase if not */
|
||||||
if(!conn->bits.user_passwd) {
|
if(!conn->bits.user_passwd || !smtpc->auth_supported) {
|
||||||
state(conn, SMTP_STOP);
|
state(conn, SMTP_STOP);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -581,8 +583,8 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate the optional SIZE parameter */
|
/* Calculate the optional SIZE parameter */
|
||||||
if(conn->proto.smtpc.size_supported && conn->data->set.infilesize > 0) {
|
if(conn->proto.smtpc.size_supported && conn->data->state.infilesize > 0) {
|
||||||
size = aprintf("%" CURL_FORMAT_CURL_OFF_T, data->set.infilesize);
|
size = aprintf("%" CURL_FORMAT_CURL_OFF_T, data->state.infilesize);
|
||||||
|
|
||||||
if(!size) {
|
if(!size) {
|
||||||
Curl_safefree(from);
|
Curl_safefree(from);
|
||||||
@@ -719,8 +721,7 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
|
|||||||
(void)instate; /* no use for this yet */
|
(void)instate; /* no use for this yet */
|
||||||
|
|
||||||
if(smtpcode/100 != 2 && smtpcode != 1) {
|
if(smtpcode/100 != 2 && smtpcode != 1) {
|
||||||
if((data->set.use_ssl <= CURLUSESSL_TRY || conn->ssl[FIRSTSOCKET].use) &&
|
if(data->set.use_ssl <= CURLUSESSL_TRY || conn->ssl[FIRSTSOCKET].use)
|
||||||
!conn->bits.user_passwd)
|
|
||||||
result = smtp_perform_helo(conn);
|
result = smtp_perform_helo(conn);
|
||||||
else {
|
else {
|
||||||
failf(data, "Remote access denied: %d", smtpcode);
|
failf(data, "Remote access denied: %d", smtpcode);
|
||||||
@@ -739,8 +740,11 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
|
|||||||
else if(len >= 4 && !memcmp(line, "SIZE", 4))
|
else if(len >= 4 && !memcmp(line, "SIZE", 4))
|
||||||
smtpc->size_supported = TRUE;
|
smtpc->size_supported = TRUE;
|
||||||
|
|
||||||
/* Do we have the authentication mechanism list? */
|
/* Does the server support authentication? */
|
||||||
else if(len >= 5 && !memcmp(line, "AUTH ", 5)) {
|
else if(len >= 5 && !memcmp(line, "AUTH ", 5)) {
|
||||||
|
smtpc->auth_supported = TRUE;
|
||||||
|
|
||||||
|
/* Advance past the AUTH keyword */
|
||||||
line += 5;
|
line += 5;
|
||||||
len -= 5;
|
len -= 5;
|
||||||
|
|
||||||
@@ -992,10 +996,6 @@ static CURLcode smtp_state_auth_digest_resp(struct connectdata *conn,
|
|||||||
char *rplyb64 = NULL;
|
char *rplyb64 = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
char nonce[64];
|
|
||||||
char realm[128];
|
|
||||||
char algorithm[64];
|
|
||||||
|
|
||||||
(void)instate; /* no use for this yet */
|
(void)instate; /* no use for this yet */
|
||||||
|
|
||||||
if(smtpcode != 334) {
|
if(smtpcode != 334) {
|
||||||
@@ -1006,30 +1006,26 @@ static CURLcode smtp_state_auth_digest_resp(struct connectdata *conn,
|
|||||||
/* Get the challenge message */
|
/* Get the challenge message */
|
||||||
smtp_get_message(data->state.buffer, &chlg64);
|
smtp_get_message(data->state.buffer, &chlg64);
|
||||||
|
|
||||||
/* Decode the challange message */
|
/* Create the response message */
|
||||||
result = Curl_sasl_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
|
result = Curl_sasl_create_digest_md5_message(data, chlg64,
|
||||||
realm, sizeof(realm),
|
conn->user, conn->passwd,
|
||||||
algorithm, sizeof(algorithm));
|
"smtp", &rplyb64, &len);
|
||||||
if(result || strcmp(algorithm, "md5-sess") != 0) {
|
if(result) {
|
||||||
/* Send the cancellation */
|
if(result == CURLE_BAD_CONTENT_ENCODING) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*");
|
/* Send the cancellation */
|
||||||
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*");
|
||||||
if(!result)
|
|
||||||
state(conn, SMTP_AUTH_CANCEL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Create the response message */
|
|
||||||
result = Curl_sasl_create_digest_md5_message(data, nonce, realm,
|
|
||||||
conn->user, conn->passwd,
|
|
||||||
"smtp", &rplyb64, &len);
|
|
||||||
if(!result && rplyb64) {
|
|
||||||
/* Send the response */
|
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64);
|
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
state(conn, SMTP_AUTH_DIGESTMD5_RESP);
|
state(conn, SMTP_AUTH_CANCEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* Send the response */
|
||||||
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64);
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
state(conn, SMTP_AUTH_DIGESTMD5_RESP);
|
||||||
|
}
|
||||||
|
|
||||||
Curl_safefree(rplyb64);
|
Curl_safefree(rplyb64);
|
||||||
|
|
||||||
@@ -1360,7 +1356,7 @@ static CURLcode smtp_state_data_resp(struct connectdata *conn, int smtpcode,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Set the progress upload size */
|
/* Set the progress upload size */
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
|
|
||||||
/* SMTP upload */
|
/* SMTP upload */
|
||||||
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
||||||
@@ -1663,7 +1659,7 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
|
|||||||
is "no mail data". RFC-5321, sect. 4.1.1.4. */
|
is "no mail data". RFC-5321, sect. 4.1.1.4. */
|
||||||
eob = SMTP_EOB;
|
eob = SMTP_EOB;
|
||||||
len = SMTP_EOB_LEN;
|
len = SMTP_EOB_LEN;
|
||||||
if(smtp->trailing_crlf || !conn->data->set.infilesize) {
|
if(smtp->trailing_crlf || !conn->data->state.infilesize) {
|
||||||
eob += 2;
|
eob += 2;
|
||||||
len -= 2;
|
len -= 2;
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2009 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -82,6 +82,7 @@ struct smtp_conn {
|
|||||||
bool tls_supported; /* StartTLS capability supported by server */
|
bool tls_supported; /* StartTLS capability supported by server */
|
||||||
bool size_supported; /* If server supports SIZE extension according to
|
bool size_supported; /* If server supports SIZE extension according to
|
||||||
RFC 1870 */
|
RFC 1870 */
|
||||||
|
bool auth_supported; /* AUTH capability supported by server */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct Curl_handler Curl_handler_smtp;
|
extern const struct Curl_handler Curl_handler_smtp;
|
||||||
|
@@ -194,7 +194,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
Curl_safefree(service_name);
|
Curl_safefree(service_name);
|
||||||
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
if(sspi_recv_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
||||||
failf(data, "Failed to initialise security context.");
|
failf(data, "Failed to initialise security context.");
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
@@ -209,8 +210,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
if((code != CURLE_OK) || (4 != written)) {
|
if((code != CURLE_OK) || (4 != written)) {
|
||||||
failf(data, "Failed to send SSPI authentication request.");
|
failf(data, "Failed to send SSPI authentication request.");
|
||||||
Curl_safefree(service_name);
|
Curl_safefree(service_name);
|
||||||
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
if(sspi_send_token.pvBuffer)
|
||||||
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
||||||
|
if(sspi_recv_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
||||||
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
@@ -221,8 +224,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
if((code != CURLE_OK) || (sspi_send_token.cbBuffer != (size_t)written)) {
|
if((code != CURLE_OK) || (sspi_send_token.cbBuffer != (size_t)written)) {
|
||||||
failf(data, "Failed to send SSPI authentication token.");
|
failf(data, "Failed to send SSPI authentication token.");
|
||||||
Curl_safefree(service_name);
|
Curl_safefree(service_name);
|
||||||
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
if(sspi_send_token.pvBuffer)
|
||||||
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
||||||
|
if(sspi_recv_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
||||||
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
@@ -230,12 +235,18 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
if(sspi_send_token.pvBuffer) {
|
||||||
sspi_send_token.pvBuffer = NULL;
|
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
||||||
|
sspi_send_token.pvBuffer = NULL;
|
||||||
|
}
|
||||||
sspi_send_token.cbBuffer = 0;
|
sspi_send_token.cbBuffer = 0;
|
||||||
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
|
||||||
sspi_recv_token.pvBuffer = NULL;
|
if(sspi_recv_token.pvBuffer) {
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
||||||
|
sspi_recv_token.pvBuffer = NULL;
|
||||||
|
}
|
||||||
sspi_recv_token.cbBuffer = 0;
|
sspi_recv_token.cbBuffer = 0;
|
||||||
|
|
||||||
if(status != SEC_I_CONTINUE_NEEDED)
|
if(status != SEC_I_CONTINUE_NEEDED)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -295,7 +306,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
if(result != CURLE_OK || actualread != us_length) {
|
if(result != CURLE_OK || actualread != us_length) {
|
||||||
failf(data, "Failed to receive SSPI authentication token.");
|
failf(data, "Failed to receive SSPI authentication token.");
|
||||||
Curl_safefree(service_name);
|
Curl_safefree(service_name);
|
||||||
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
if(sspi_recv_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
|
||||||
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
s_pSecFn->FreeCredentialsHandle(&cred_handle);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
@@ -459,7 +471,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written);
|
code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written);
|
||||||
if((code != CURLE_OK) || (4 != written)) {
|
if((code != CURLE_OK) || (4 != written)) {
|
||||||
failf(data, "Failed to send SSPI encryption request.");
|
failf(data, "Failed to send SSPI encryption request.");
|
||||||
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
if(sspi_send_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
@@ -478,11 +491,13 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
sspi_send_token.cbBuffer, &written);
|
sspi_send_token.cbBuffer, &written);
|
||||||
if((code != CURLE_OK) || (sspi_send_token.cbBuffer != (size_t)written)) {
|
if((code != CURLE_OK) || (sspi_send_token.cbBuffer != (size_t)written)) {
|
||||||
failf(data, "Failed to send SSPI encryption type.");
|
failf(data, "Failed to send SSPI encryption type.");
|
||||||
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
if(sspi_send_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
if(sspi_send_token.pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread);
|
result = Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread);
|
||||||
@@ -541,8 +556,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
&qop);
|
&qop);
|
||||||
|
|
||||||
if(check_sspi_err(conn, status, "DecryptMessage")) {
|
if(check_sspi_err(conn, status, "DecryptMessage")) {
|
||||||
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
|
if(sspi_w_token[0].pvBuffer)
|
||||||
s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer);
|
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
|
||||||
|
if(sspi_w_token[1].pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
failf(data, "Failed to query security context attributes.");
|
failf(data, "Failed to query security context attributes.");
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
@@ -551,8 +568,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
|
|||||||
if(sspi_w_token[1].cbBuffer != 1) {
|
if(sspi_w_token[1].cbBuffer != 1) {
|
||||||
failf(data, "Invalid SSPI encryption response length (%lu).",
|
failf(data, "Invalid SSPI encryption response length (%lu).",
|
||||||
(unsigned long)sspi_w_token[1].cbBuffer);
|
(unsigned long)sspi_w_token[1].cbBuffer);
|
||||||
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
|
if(sspi_w_token[0].pvBuffer)
|
||||||
s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer);
|
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
|
||||||
|
if(sspi_w_token[1].pvBuffer)
|
||||||
|
s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer);
|
||||||
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
s_pSecFn->DeleteSecurityContext(&sspi_context);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1997 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1997 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -101,7 +101,7 @@ struct Curl_tree *Curl_splayinsert(struct timeval i,
|
|||||||
struct Curl_tree *t,
|
struct Curl_tree *t,
|
||||||
struct Curl_tree *node)
|
struct Curl_tree *node)
|
||||||
{
|
{
|
||||||
static struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */
|
static const struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */
|
||||||
|
|
||||||
if(node == NULL)
|
if(node == NULL)
|
||||||
return t;
|
return t;
|
||||||
@@ -223,7 +223,7 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
|
|||||||
struct Curl_tree *removenode,
|
struct Curl_tree *removenode,
|
||||||
struct Curl_tree **newroot)
|
struct Curl_tree **newroot)
|
||||||
{
|
{
|
||||||
static struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */
|
static const struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */
|
||||||
struct Curl_tree *x;
|
struct Curl_tree *x;
|
||||||
|
|
||||||
if(!t || !removenode)
|
if(!t || !removenode)
|
||||||
|
18
lib/ssh.c
18
lib/ssh.c
@@ -1717,17 +1717,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* now, decrease the size of the read */
|
/* now, decrease the size of the read */
|
||||||
if(data->set.infilesize > 0) {
|
if(data->state.infilesize > 0) {
|
||||||
data->set.infilesize -= data->state.resume_from;
|
data->state.infilesize -= data->state.resume_from;
|
||||||
data->req.size = data->set.infilesize;
|
data->req.size = data->state.infilesize;
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
|
SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
|
||||||
}
|
}
|
||||||
if(data->set.infilesize > 0) {
|
if(data->state.infilesize > 0) {
|
||||||
data->req.size = data->set.infilesize;
|
data->req.size = data->state.infilesize;
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
}
|
}
|
||||||
/* upload data */
|
/* upload data */
|
||||||
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
|
||||||
@@ -2256,7 +2256,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(data->set.upload) {
|
if(data->set.upload) {
|
||||||
if(data->set.infilesize < 0) {
|
if(data->state.infilesize < 0) {
|
||||||
failf(data, "SCP requires a known file size for upload");
|
failf(data, "SCP requires a known file size for upload");
|
||||||
sshc->actualcode = CURLE_UPLOAD_FAILED;
|
sshc->actualcode = CURLE_UPLOAD_FAILED;
|
||||||
state(conn, SSH_SCP_CHANNEL_FREE);
|
state(conn, SSH_SCP_CHANNEL_FREE);
|
||||||
@@ -2278,7 +2278,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|||||||
*/
|
*/
|
||||||
sshc->ssh_channel =
|
sshc->ssh_channel =
|
||||||
SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
|
SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
|
||||||
data->set.infilesize);
|
data->state.infilesize);
|
||||||
if(!sshc->ssh_channel) {
|
if(!sshc->ssh_channel) {
|
||||||
if(libssh2_session_last_errno(sshc->ssh_session) ==
|
if(libssh2_session_last_errno(sshc->ssh_session) ==
|
||||||
LIBSSH2_ERROR_EAGAIN) {
|
LIBSSH2_ERROR_EAGAIN) {
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2004 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -679,7 +679,7 @@ const char *Curl_strerror(struct connectdata *conn, int err)
|
|||||||
#elif defined(HAVE_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R)
|
#elif defined(HAVE_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R)
|
||||||
/*
|
/*
|
||||||
* The vxworks-style strerror_r() does use the buffer we pass to the function.
|
* The vxworks-style strerror_r() does use the buffer we pass to the function.
|
||||||
* The buffer size should be at least MAXERRSTR_SIZE (150) defined in rtsold.h
|
* The buffer size should be at least NAME_MAX (256)
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
22
lib/telnet.c
22
lib/telnet.c
@@ -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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -822,8 +822,8 @@ static CURLcode check_telnet_options(struct connectdata *conn)
|
|||||||
{
|
{
|
||||||
struct curl_slist *head;
|
struct curl_slist *head;
|
||||||
struct curl_slist *beg;
|
struct curl_slist *beg;
|
||||||
char option_keyword[128];
|
char option_keyword[128] = "";
|
||||||
char option_arg[256];
|
char option_arg[256] = "";
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct TELNET *tn = (struct TELNET *)conn->data->req.protop;
|
struct TELNET *tn = (struct TELNET *)conn->data->req.protop;
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
@@ -932,8 +932,8 @@ static void suboption(struct connectdata *conn)
|
|||||||
size_t len;
|
size_t len;
|
||||||
size_t tmplen;
|
size_t tmplen;
|
||||||
int err;
|
int err;
|
||||||
char varname[128];
|
char varname[128] = "";
|
||||||
char varval[128];
|
char varval[128] = "";
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct TELNET *tn = (struct TELNET *)data->req.protop;
|
struct TELNET *tn = (struct TELNET *)data->req.protop;
|
||||||
|
|
||||||
@@ -973,11 +973,12 @@ static void suboption(struct connectdata *conn)
|
|||||||
tmplen = (strlen(v->data) + 1);
|
tmplen = (strlen(v->data) + 1);
|
||||||
/* Add the variable only if it fits */
|
/* Add the variable only if it fits */
|
||||||
if(len + tmplen < (int)sizeof(temp)-6) {
|
if(len + tmplen < (int)sizeof(temp)-6) {
|
||||||
sscanf(v->data, "%127[^,],%127s", varname, varval);
|
if(sscanf(v->data, "%127[^,],%127s", varname, varval)) {
|
||||||
snprintf((char *)&temp[len], sizeof(temp) - len,
|
snprintf((char *)&temp[len], sizeof(temp) - len,
|
||||||
"%c%s%c%s", CURL_NEW_ENV_VAR, varname,
|
"%c%s%c%s", CURL_NEW_ENV_VAR, varname,
|
||||||
CURL_NEW_ENV_VALUE, varval);
|
CURL_NEW_ENV_VALUE, varval);
|
||||||
len += tmplen;
|
len += tmplen;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
snprintf((char *)&temp[len], sizeof(temp) - len,
|
snprintf((char *)&temp[len], sizeof(temp) - len,
|
||||||
@@ -1491,6 +1492,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||||||
|
|
||||||
case WAIT_OBJECT_0:
|
case WAIT_OBJECT_0:
|
||||||
|
|
||||||
|
events.lNetworkEvents = 0;
|
||||||
if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) {
|
if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) {
|
||||||
if((err = SOCKERRNO) != EINPROGRESS) {
|
if((err = SOCKERRNO) != EINPROGRESS) {
|
||||||
infof(data,"WSAEnumNetworkEvents failed (%d)", err);
|
infof(data,"WSAEnumNetworkEvents failed (%d)", err);
|
||||||
|
11
lib/tftp.c
11
lib/tftp.c
@@ -477,8 +477,8 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
|
|||||||
setpacketevent(&state->spacket, TFTP_EVENT_WRQ);
|
setpacketevent(&state->spacket, TFTP_EVENT_WRQ);
|
||||||
state->conn->data->req.upload_fromhere =
|
state->conn->data->req.upload_fromhere =
|
||||||
(char *)state->spacket.data+4;
|
(char *)state->spacket.data+4;
|
||||||
if(data->set.infilesize != -1)
|
if(data->state.infilesize != -1)
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, data->state.infilesize);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* If we are downloading, send an RRQ */
|
/* If we are downloading, send an RRQ */
|
||||||
@@ -498,9 +498,9 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
|
|||||||
sbytes = 4 + strlen(filename) + strlen(mode);
|
sbytes = 4 + strlen(filename) + strlen(mode);
|
||||||
|
|
||||||
/* add tsize option */
|
/* add tsize option */
|
||||||
if(data->set.upload && (data->set.infilesize != -1))
|
if(data->set.upload && (data->state.infilesize != -1))
|
||||||
snprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T,
|
snprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T,
|
||||||
data->set.infilesize);
|
data->state.infilesize);
|
||||||
else
|
else
|
||||||
strcpy(buf, "0"); /* the destination is large enough */
|
strcpy(buf, "0"); /* the destination is large enough */
|
||||||
|
|
||||||
@@ -1320,7 +1320,10 @@ static CURLcode tftp_do(struct connectdata *conn, bool *done)
|
|||||||
if(code)
|
if(code)
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
state = (tftp_state_data_t *)conn->proto.tftpc;
|
state = (tftp_state_data_t *)conn->proto.tftpc;
|
||||||
|
if(!state)
|
||||||
|
return CURLE_BAD_CALLING_ORDER;
|
||||||
|
|
||||||
code = tftp_perform(conn, done);
|
code = tftp_perform(conn, done);
|
||||||
|
|
||||||
|
@@ -99,7 +99,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
|
|||||||
#ifdef CURL_DOES_CONVERSIONS
|
#ifdef CURL_DOES_CONVERSIONS
|
||||||
bool sending_http_headers = FALSE;
|
bool sending_http_headers = FALSE;
|
||||||
|
|
||||||
if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) {
|
if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) {
|
||||||
const struct HTTP *http = data->req.protop;
|
const struct HTTP *http = data->req.protop;
|
||||||
|
|
||||||
if(http->sending == HTTPSEND_REQUEST)
|
if(http->sending == HTTPSEND_REQUEST)
|
||||||
@@ -319,7 +319,7 @@ static int data_pending(const struct connectdata *conn)
|
|||||||
TRUE. The thing is if we read everything, then http2_recv won't
|
TRUE. The thing is if we read everything, then http2_recv won't
|
||||||
be called and we cannot signal the HTTP/2 stream has closed. As
|
be called and we cannot signal the HTTP/2 stream has closed. As
|
||||||
a workaround, we return nonzero here to call http2_recv. */
|
a workaround, we return nonzero here to call http2_recv. */
|
||||||
((conn->handler->protocol&CURLPROTO_HTTP) && conn->httpversion == 20 &&
|
((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20 &&
|
||||||
conn->proto.httpc.closed);
|
conn->proto.httpc.closed);
|
||||||
#else
|
#else
|
||||||
Curl_ssl_data_pending(conn, FIRSTSOCKET);
|
Curl_ssl_data_pending(conn, FIRSTSOCKET);
|
||||||
@@ -527,7 +527,7 @@ static CURLcode readwrite_data(struct SessionHandle *data,
|
|||||||
if(0 == k->bodywrites && !is_empty_data) {
|
if(0 == k->bodywrites && !is_empty_data) {
|
||||||
/* These checks are only made the first time we are about to
|
/* These checks are only made the first time we are about to
|
||||||
write a piece of the body */
|
write a piece of the body */
|
||||||
if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) {
|
if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) {
|
||||||
/* HTTP-only checks */
|
/* HTTP-only checks */
|
||||||
|
|
||||||
if(data->req.newurl) {
|
if(data->req.newurl) {
|
||||||
@@ -723,7 +723,7 @@ static CURLcode readwrite_data(struct SessionHandle *data,
|
|||||||
if(!k->ignorebody) {
|
if(!k->ignorebody) {
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_POP3
|
#ifndef CURL_DISABLE_POP3
|
||||||
if(conn->handler->protocol&CURLPROTO_POP3)
|
if(conn->handler->protocol&PROTO_FAMILY_POP3)
|
||||||
result = Curl_pop3_write(conn, k->str, nread);
|
result = Curl_pop3_write(conn, k->str, nread);
|
||||||
else
|
else
|
||||||
#endif /* CURL_DISABLE_POP3 */
|
#endif /* CURL_DISABLE_POP3 */
|
||||||
@@ -854,7 +854,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) {
|
if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) {
|
||||||
if(http->sending == HTTPSEND_REQUEST)
|
if(http->sending == HTTPSEND_REQUEST)
|
||||||
/* We're sending the HTTP request headers, not the data.
|
/* We're sending the HTTP request headers, not the data.
|
||||||
Remember that so we don't change the line endings. */
|
Remember that so we don't change the line endings. */
|
||||||
@@ -892,7 +892,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||||||
data->req.upload_present = nread;
|
data->req.upload_present = nread;
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_SMTP
|
#ifndef CURL_DISABLE_SMTP
|
||||||
if(conn->handler->protocol & CURLPROTO_SMTP) {
|
if(conn->handler->protocol & PROTO_FAMILY_SMTP) {
|
||||||
result = Curl_smtp_escape_eob(conn, nread);
|
result = Curl_smtp_escape_eob(conn, nread);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
@@ -926,7 +926,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||||||
if(!data->set.crlf) {
|
if(!data->set.crlf) {
|
||||||
/* we're here only because FTP is in ASCII mode...
|
/* we're here only because FTP is in ASCII mode...
|
||||||
bump infilesize for the LF we just added */
|
bump infilesize for the LF we just added */
|
||||||
data->set.infilesize++;
|
data->state.infilesize++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -967,7 +967,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||||||
|
|
||||||
k->writebytecount += bytes_written;
|
k->writebytecount += bytes_written;
|
||||||
|
|
||||||
if(k->writebytecount == data->set.infilesize) {
|
if(k->writebytecount == data->state.infilesize) {
|
||||||
/* we have sent all data we were supposed to */
|
/* we have sent all data we were supposed to */
|
||||||
k->upload_done = TRUE;
|
k->upload_done = TRUE;
|
||||||
infof(data, "We are completely uploaded and fine\n");
|
infof(data, "We are completely uploaded and fine\n");
|
||||||
@@ -1873,7 +1873,7 @@ CURLcode Curl_retry_request(struct connectdata *conn,
|
|||||||
/* if we're talking upload, we can't do the checks below, unless the protocol
|
/* if we're talking upload, we can't do the checks below, unless the protocol
|
||||||
is HTTP as when uploading over HTTP we will still get a response */
|
is HTTP as when uploading over HTTP we will still get a response */
|
||||||
if(data->set.upload &&
|
if(data->set.upload &&
|
||||||
!(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)))
|
!(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)))
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
if(/* workaround for broken TLS servers */ data->state.ssl_connect_retry ||
|
if(/* workaround for broken TLS servers */ data->state.ssl_connect_retry ||
|
||||||
@@ -1899,7 +1899,7 @@ CURLcode Curl_retry_request(struct connectdata *conn,
|
|||||||
transferred! */
|
transferred! */
|
||||||
|
|
||||||
|
|
||||||
if(conn->handler->protocol&CURLPROTO_HTTP) {
|
if(conn->handler->protocol&PROTO_FAMILY_HTTP) {
|
||||||
struct HTTP *http = data->req.protop;
|
struct HTTP *http = data->req.protop;
|
||||||
if(http->writebytecount)
|
if(http->writebytecount)
|
||||||
return Curl_readrewind(conn);
|
return Curl_readrewind(conn);
|
||||||
@@ -1972,7 +1972,7 @@ Curl_setup_transfer(
|
|||||||
state info where we wait for the 100-return code
|
state info where we wait for the 100-return code
|
||||||
*/
|
*/
|
||||||
if((data->state.expect100header) &&
|
if((data->state.expect100header) &&
|
||||||
(conn->handler->protocol&CURLPROTO_HTTP) &&
|
(conn->handler->protocol&PROTO_FAMILY_HTTP) &&
|
||||||
(http->sending == HTTPSEND_BODY)) {
|
(http->sending == HTTPSEND_BODY)) {
|
||||||
/* wait with write until we either got 100-continue or a timeout */
|
/* wait with write until we either got 100-continue or a timeout */
|
||||||
k->exp100 = EXP100_AWAITING_CONTINUE;
|
k->exp100 = EXP100_AWAITING_CONTINUE;
|
||||||
|
120
lib/url.c
120
lib/url.c
@@ -485,7 +485,7 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
|
|||||||
set->convtonetwork = ZERO_NULL;
|
set->convtonetwork = ZERO_NULL;
|
||||||
set->convfromutf8 = ZERO_NULL;
|
set->convfromutf8 = ZERO_NULL;
|
||||||
|
|
||||||
set->infilesize = -1; /* we don't know any size */
|
set->filesize = -1; /* we don't know the size */
|
||||||
set->postfieldsize = -1; /* unknown size */
|
set->postfieldsize = -1; /* unknown size */
|
||||||
set->maxredirs = -1; /* allow any amount by default */
|
set->maxredirs = -1; /* allow any amount by default */
|
||||||
|
|
||||||
@@ -1067,6 +1067,28 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
|||||||
data->set.headers = va_arg(param, struct curl_slist *);
|
data->set.headers = va_arg(param, struct curl_slist *);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CURLOPT_PROXYHEADER:
|
||||||
|
/*
|
||||||
|
* Set a list with proxy headers to use (or replace internals with)
|
||||||
|
*
|
||||||
|
* Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a
|
||||||
|
* long time we remain doing it this way until CURLOPT_PROXYHEADER is
|
||||||
|
* used. As soon as this option has been used, if set to anything but
|
||||||
|
* NULL, custom headers for proxies are only picked from this list.
|
||||||
|
*
|
||||||
|
* Set this option to NULL to restore the previous behavior.
|
||||||
|
*/
|
||||||
|
data->set.proxyheaders = va_arg(param, struct curl_slist *);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLOPT_HEADEROPT:
|
||||||
|
/*
|
||||||
|
* Set header option.
|
||||||
|
*/
|
||||||
|
arg = va_arg(param, long);
|
||||||
|
data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
case CURLOPT_HTTP200ALIASES:
|
case CURLOPT_HTTP200ALIASES:
|
||||||
/*
|
/*
|
||||||
* Set a list of aliases for HTTP 200 in response header
|
* Set a list of aliases for HTTP 200 in response header
|
||||||
@@ -1469,14 +1491,14 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
|||||||
* If known, this should inform curl about the file size of the
|
* If known, this should inform curl about the file size of the
|
||||||
* to-be-uploaded file.
|
* to-be-uploaded file.
|
||||||
*/
|
*/
|
||||||
data->set.infilesize = va_arg(param, long);
|
data->set.filesize = va_arg(param, long);
|
||||||
break;
|
break;
|
||||||
case CURLOPT_INFILESIZE_LARGE:
|
case CURLOPT_INFILESIZE_LARGE:
|
||||||
/*
|
/*
|
||||||
* If known, this should inform curl about the file size of the
|
* If known, this should inform curl about the file size of the
|
||||||
* to-be-uploaded file.
|
* to-be-uploaded file.
|
||||||
*/
|
*/
|
||||||
data->set.infilesize = va_arg(param, curl_off_t);
|
data->set.filesize = va_arg(param, curl_off_t);
|
||||||
break;
|
break;
|
||||||
case CURLOPT_LOW_SPEED_LIMIT:
|
case CURLOPT_LOW_SPEED_LIMIT:
|
||||||
/*
|
/*
|
||||||
@@ -2681,7 +2703,7 @@ static bool SocketIsDead(curl_socket_t sock)
|
|||||||
static bool IsPipeliningPossible(const struct SessionHandle *handle,
|
static bool IsPipeliningPossible(const struct SessionHandle *handle,
|
||||||
const struct connectdata *conn)
|
const struct connectdata *conn)
|
||||||
{
|
{
|
||||||
if((conn->handler->protocol & CURLPROTO_HTTP) &&
|
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
|
||||||
Curl_multi_pipeline_enabled(handle->multi) &&
|
Curl_multi_pipeline_enabled(handle->multi) &&
|
||||||
(handle->set.httpreq == HTTPREQ_GET ||
|
(handle->set.httpreq == HTTPREQ_GET ||
|
||||||
handle->set.httpreq == HTTPREQ_HEAD) &&
|
handle->set.httpreq == HTTPREQ_HEAD) &&
|
||||||
@@ -2905,7 +2927,7 @@ ConnectionExists(struct SessionHandle *data,
|
|||||||
bool canPipeline = IsPipeliningPossible(data, needle);
|
bool canPipeline = IsPipeliningPossible(data, needle);
|
||||||
bool wantNTLMhttp = ((data->state.authhost.want & CURLAUTH_NTLM) ||
|
bool wantNTLMhttp = ((data->state.authhost.want & CURLAUTH_NTLM) ||
|
||||||
(data->state.authhost.want & CURLAUTH_NTLM_WB)) &&
|
(data->state.authhost.want & CURLAUTH_NTLM_WB)) &&
|
||||||
(needle->handler->protocol & CURLPROTO_HTTP) ? TRUE : FALSE;
|
(needle->handler->protocol & PROTO_FAMILY_HTTP) ? TRUE : FALSE;
|
||||||
struct connectbundle *bundle;
|
struct connectbundle *bundle;
|
||||||
|
|
||||||
*force_reuse = FALSE;
|
*force_reuse = FALSE;
|
||||||
@@ -3474,6 +3496,8 @@ static bool tld_check_name(struct SessionHandle *data,
|
|||||||
static void fix_hostname(struct SessionHandle *data,
|
static void fix_hostname(struct SessionHandle *data,
|
||||||
struct connectdata *conn, struct hostname *host)
|
struct connectdata *conn, struct hostname *host)
|
||||||
{
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
#ifndef USE_LIBIDN
|
#ifndef USE_LIBIDN
|
||||||
(void)data;
|
(void)data;
|
||||||
(void)conn;
|
(void)conn;
|
||||||
@@ -3483,6 +3507,13 @@ static void fix_hostname(struct SessionHandle *data,
|
|||||||
|
|
||||||
/* set the name we use to display the host name */
|
/* set the name we use to display the host name */
|
||||||
host->dispname = host->name;
|
host->dispname = host->name;
|
||||||
|
|
||||||
|
len = strlen(host->name);
|
||||||
|
if(host->name[len-1] == '.')
|
||||||
|
/* strip off a single trailing dot if present, primarily for SNI but
|
||||||
|
there's no use for it */
|
||||||
|
host->name[len-1]=0;
|
||||||
|
|
||||||
if(!is_ASCII_name(host->name)) {
|
if(!is_ASCII_name(host->name)) {
|
||||||
#ifdef USE_LIBIDN
|
#ifdef USE_LIBIDN
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
@@ -3710,8 +3741,8 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
|||||||
char *path = data->state.path;
|
char *path = data->state.path;
|
||||||
char *query;
|
char *query;
|
||||||
int rc;
|
int rc;
|
||||||
char protobuf[16];
|
char protobuf[16] = "";
|
||||||
const char *protop;
|
const char *protop = "";
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
bool rebuild_url = FALSE;
|
bool rebuild_url = FALSE;
|
||||||
|
|
||||||
@@ -3953,21 +3984,54 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
|||||||
|
|
||||||
if(conn->host.name[0] == '[') {
|
if(conn->host.name[0] == '[') {
|
||||||
/* This looks like an IPv6 address literal. See if there is an address
|
/* This looks like an IPv6 address literal. See if there is an address
|
||||||
scope. */
|
scope if there is no location header */
|
||||||
char *percent = strstr (conn->host.name, "%25");
|
char *percent = strchr(conn->host.name, '%');
|
||||||
if(percent) {
|
if(percent) {
|
||||||
|
unsigned int identifier_offset = 3;
|
||||||
char *endp;
|
char *endp;
|
||||||
unsigned long scope = strtoul (percent + 3, &endp, 10);
|
unsigned long scope;
|
||||||
|
if(strncmp("%25", percent, 3) != 0) {
|
||||||
|
infof(data,
|
||||||
|
"Please URL encode %% as %%25, see RFC 6874.\n");
|
||||||
|
identifier_offset = 1;
|
||||||
|
}
|
||||||
|
scope = strtoul(percent + identifier_offset, &endp, 10);
|
||||||
if(*endp == ']') {
|
if(*endp == ']') {
|
||||||
/* The address scope was well formed. Knock it out of the
|
/* The address scope was well formed. Knock it out of the
|
||||||
hostname. */
|
hostname. */
|
||||||
memmove(percent, endp, strlen(endp)+1);
|
memmove(percent, endp, strlen(endp)+1);
|
||||||
if(!data->state.this_is_a_follow)
|
conn->scope = (unsigned int)scope;
|
||||||
/* Don't honour a scope given in a Location: header */
|
}
|
||||||
conn->scope = (unsigned int)scope;
|
else {
|
||||||
|
/* Zone identifier is not numeric */
|
||||||
|
#if defined(HAVE_NET_IF_H) && defined(IFNAMSIZ)
|
||||||
|
char ifname[IFNAMSIZ + 2];
|
||||||
|
char *square_bracket;
|
||||||
|
unsigned int scopeidx = 0;
|
||||||
|
strncpy(ifname, percent + identifier_offset, IFNAMSIZ + 2);
|
||||||
|
/* Ensure nullbyte termination */
|
||||||
|
ifname[IFNAMSIZ + 1] = '\0';
|
||||||
|
square_bracket = strchr(ifname, ']');
|
||||||
|
if(square_bracket) {
|
||||||
|
/* Remove ']' */
|
||||||
|
*square_bracket = '\0';
|
||||||
|
scopeidx = if_nametoindex(ifname);
|
||||||
|
if(scopeidx == 0) {
|
||||||
|
infof(data, "Invalid network interface: %s; %s\n", ifname,
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(scopeidx > 0) {
|
||||||
|
/* Remove zone identifier from hostname */
|
||||||
|
memmove(percent,
|
||||||
|
percent + identifier_offset + strlen(ifname),
|
||||||
|
identifier_offset + strlen(ifname));
|
||||||
|
conn->scope = scopeidx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* HAVE_NET_IF_H && IFNAMSIZ */
|
||||||
|
infof(data, "Invalid IPv6 address format\n");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
infof(data, "Invalid IPv6 address format\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4045,16 +4109,17 @@ static CURLcode setup_connection_internals(struct connectdata *conn)
|
|||||||
{
|
{
|
||||||
const struct Curl_handler * p;
|
const struct Curl_handler * p;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
/* in some case in the multi state-machine, we go back to the CONNECT state
|
/* in some case in the multi state-machine, we go back to the CONNECT state
|
||||||
and then a second (or third or...) call to this function will be made
|
and then a second (or third or...) call to this function will be made
|
||||||
without doing a DISCONNECT or DONE in between (since the connection is
|
without doing a DISCONNECT or DONE in between (since the connection is
|
||||||
yet in place) and therefore this function needs to first make sure
|
yet in place) and therefore this function needs to first make sure
|
||||||
there's no lingering previous data allocated. */
|
there's no lingering previous data allocated. */
|
||||||
Curl_free_request_state(conn->data);
|
Curl_free_request_state(data);
|
||||||
|
|
||||||
memset(&conn->data->req, 0, sizeof(struct SingleRequest));
|
memset(&data->req, 0, sizeof(struct SingleRequest));
|
||||||
conn->data->req.maxdownload = -1;
|
data->req.maxdownload = -1;
|
||||||
|
|
||||||
conn->socktype = SOCK_STREAM; /* most of them are TCP streams */
|
conn->socktype = SOCK_STREAM; /* most of them are TCP streams */
|
||||||
|
|
||||||
@@ -4350,12 +4415,21 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
|||||||
/* start scanning for port number at this point */
|
/* start scanning for port number at this point */
|
||||||
portptr = proxyptr;
|
portptr = proxyptr;
|
||||||
|
|
||||||
/* detect and extract RFC2732-style IPv6-addresses */
|
/* detect and extract RFC6874-style IPv6-addresses */
|
||||||
if(*proxyptr == '[') {
|
if(*proxyptr == '[') {
|
||||||
char *ptr = ++proxyptr; /* advance beyond the initial bracket */
|
char *ptr = ++proxyptr; /* advance beyond the initial bracket */
|
||||||
while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '%') ||
|
while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.')))
|
||||||
(*ptr == '.')))
|
|
||||||
ptr++;
|
ptr++;
|
||||||
|
if(*ptr == '%') {
|
||||||
|
/* There might be a zone identifier */
|
||||||
|
if(strncmp("%25", ptr, 3))
|
||||||
|
infof(data, "Please URL encode %% as %%25, see RFC 6874.\n");
|
||||||
|
ptr++;
|
||||||
|
/* Allow unresered characters as defined in RFC 3986 */
|
||||||
|
while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') ||
|
||||||
|
(*ptr == '.') || (*ptr == '_') || (*ptr == '~')))
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
if(*ptr == ']')
|
if(*ptr == ']')
|
||||||
/* yeps, it ended nicely with a bracket as well */
|
/* yeps, it ended nicely with a bracket as well */
|
||||||
*ptr++ = 0;
|
*ptr++ = 0;
|
||||||
@@ -5181,7 +5255,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
|||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
* If the protocol can't handle url query strings, then cut
|
* If the protocol can't handle url query strings, then cut
|
||||||
* of the unhandable part
|
* off the unhandable part
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
if((conn->given->flags&PROTOPT_NOURLQUERY)) {
|
if((conn->given->flags&PROTOPT_NOURLQUERY)) {
|
||||||
char *path_q_sep = strchr(conn->data->state.path, '?');
|
char *path_q_sep = strchr(conn->data->state.path, '?');
|
||||||
@@ -5266,7 +5340,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
|||||||
#else
|
#else
|
||||||
/* force this connection's protocol to become HTTP if not already
|
/* force this connection's protocol to become HTTP if not already
|
||||||
compatible - if it isn't tunneling through */
|
compatible - if it isn't tunneling through */
|
||||||
if(!(conn->handler->protocol & CURLPROTO_HTTP) &&
|
if(!(conn->handler->protocol & PROTO_FAMILY_HTTP) &&
|
||||||
!conn->bits.tunnel_proxy)
|
!conn->bits.tunnel_proxy)
|
||||||
conn->handler = &Curl_handler_http;
|
conn->handler = &Curl_handler_http;
|
||||||
|
|
||||||
|
@@ -58,6 +58,14 @@
|
|||||||
#define CURL_DEFAULT_USER "anonymous"
|
#define CURL_DEFAULT_USER "anonymous"
|
||||||
#define CURL_DEFAULT_PASSWORD "ftp@example.com"
|
#define CURL_DEFAULT_PASSWORD "ftp@example.com"
|
||||||
|
|
||||||
|
/* Convenience defines for checking protocols or their SSL based version. Each
|
||||||
|
protocol handler should only ever have a single CURLPROTO_ in its protocol
|
||||||
|
field. */
|
||||||
|
#define PROTO_FAMILY_HTTP (CURLPROTO_HTTP|CURLPROTO_HTTPS)
|
||||||
|
#define PROTO_FAMILY_FTP (CURLPROTO_FTP|CURLPROTO_FTPS)
|
||||||
|
#define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S)
|
||||||
|
#define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS)
|
||||||
|
|
||||||
#define DEFAULT_CONNCACHE_SIZE 5
|
#define DEFAULT_CONNCACHE_SIZE 5
|
||||||
|
|
||||||
/* length of longest IPv6 address string including the trailing null */
|
/* length of longest IPv6 address string including the trailing null */
|
||||||
@@ -318,6 +326,7 @@ struct ssl_connect_data {
|
|||||||
struct SessionHandle *data;
|
struct SessionHandle *data;
|
||||||
struct curl_llist *obj_list;
|
struct curl_llist *obj_list;
|
||||||
PK11GenericObject *obj_clicert;
|
PK11GenericObject *obj_clicert;
|
||||||
|
ssl_connect_state connecting_state;
|
||||||
#endif /* USE_NSS */
|
#endif /* USE_NSS */
|
||||||
#ifdef USE_QSOSSL
|
#ifdef USE_QSOSSL
|
||||||
SSLHandle *handle;
|
SSLHandle *handle;
|
||||||
@@ -595,7 +604,7 @@ enum upgrade101 {
|
|||||||
enum negotiatenpn {
|
enum negotiatenpn {
|
||||||
NPN_INIT, /* default state */
|
NPN_INIT, /* default state */
|
||||||
NPN_HTTP1_1, /* HTTP/1.1 negotiated */
|
NPN_HTTP1_1, /* HTTP/1.1 negotiated */
|
||||||
NPN_HTTP2_DRAFT09 /* HTTP-draft-0.9/2.0 negotiated */
|
NPN_HTTP2 /* HTTP2 (draft-xx) negotiated */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -777,7 +786,8 @@ struct Curl_handler {
|
|||||||
ssize_t *nread, bool *readmore);
|
ssize_t *nread, bool *readmore);
|
||||||
|
|
||||||
long defport; /* Default port. */
|
long defport; /* Default port. */
|
||||||
unsigned int protocol; /* See CURLPROTO_* */
|
unsigned int protocol; /* See CURLPROTO_* - this needs to be the single
|
||||||
|
specific protocol bit */
|
||||||
unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */
|
unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -795,8 +805,8 @@ struct Curl_handler {
|
|||||||
gets a default */
|
gets a default */
|
||||||
#define PROTOPT_NOURLQUERY (1<<6) /* protocol can't handle
|
#define PROTOPT_NOURLQUERY (1<<6) /* protocol can't handle
|
||||||
url query strings (?foo=bar) ! */
|
url query strings (?foo=bar) ! */
|
||||||
#define PROTOPT_CREDSPERREQUEST (1<<7) /* requires login creditials per request
|
#define PROTOPT_CREDSPERREQUEST (1<<7) /* requires login credentials per
|
||||||
as opposed to per connection */
|
request instead of per connection */
|
||||||
|
|
||||||
|
|
||||||
/* return the count of bytes sent, or -1 on error */
|
/* return the count of bytes sent, or -1 on error */
|
||||||
@@ -1125,6 +1135,7 @@ struct Progress {
|
|||||||
|
|
||||||
struct timeval start;
|
struct timeval start;
|
||||||
struct timeval t_startsingle;
|
struct timeval t_startsingle;
|
||||||
|
struct timeval t_startop;
|
||||||
struct timeval t_acceptdata;
|
struct timeval t_acceptdata;
|
||||||
#define CURR_TIME (5+1) /* 6 entries for 5 seconds */
|
#define CURR_TIME (5+1) /* 6 entries for 5 seconds */
|
||||||
|
|
||||||
@@ -1296,6 +1307,8 @@ struct UrlState {
|
|||||||
|
|
||||||
/* if true, force SSL connection retry (workaround for certain servers) */
|
/* if true, force SSL connection retry (workaround for certain servers) */
|
||||||
bool ssl_connect_retry;
|
bool ssl_connect_retry;
|
||||||
|
curl_off_t infilesize; /* size of file to upload, -1 means unknown.
|
||||||
|
Copied from set.filesize at start of operation */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1457,7 +1470,7 @@ struct UserDefined {
|
|||||||
long accepttimeout; /* in milliseconds, 0 means no timeout */
|
long accepttimeout; /* in milliseconds, 0 means no timeout */
|
||||||
long server_response_timeout; /* in milliseconds, 0 means no timeout */
|
long server_response_timeout; /* in milliseconds, 0 means no timeout */
|
||||||
long tftp_blksize ; /* in bytes, 0 means use default */
|
long tftp_blksize ; /* in bytes, 0 means use default */
|
||||||
curl_off_t infilesize; /* size of file to upload, -1 means unknown */
|
curl_off_t filesize; /* size of file to upload, -1 means unknown */
|
||||||
long low_speed_limit; /* bytes/second */
|
long low_speed_limit; /* bytes/second */
|
||||||
long low_speed_time; /* number of seconds */
|
long low_speed_time; /* number of seconds */
|
||||||
curl_off_t max_send_speed; /* high speed limit in bytes/second for upload */
|
curl_off_t max_send_speed; /* high speed limit in bytes/second for upload */
|
||||||
@@ -1465,7 +1478,9 @@ struct UserDefined {
|
|||||||
download */
|
download */
|
||||||
curl_off_t set_resume_from; /* continue [ftp] transfer from here */
|
curl_off_t set_resume_from; /* continue [ftp] transfer from here */
|
||||||
struct curl_slist *headers; /* linked list of extra headers */
|
struct curl_slist *headers; /* linked list of extra headers */
|
||||||
|
struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
|
||||||
struct curl_httppost *httppost; /* linked list of POST data */
|
struct curl_httppost *httppost; /* linked list of POST data */
|
||||||
|
bool sep_headers; /* handle host and proxy headers separately */
|
||||||
bool cookiesession; /* new cookie session? */
|
bool cookiesession; /* new cookie session? */
|
||||||
bool crlf; /* convert crlf on ftp upload(?) */
|
bool crlf; /* convert crlf on ftp upload(?) */
|
||||||
struct curl_slist *quote; /* after connection is established */
|
struct curl_slist *quote; /* after connection is established */
|
||||||
|
@@ -481,6 +481,7 @@ Curl_axtls_connect(struct connectdata *conn,
|
|||||||
return map_error_to_curl(ssl_fcn_return);
|
return map_error_to_curl(ssl_fcn_return);
|
||||||
}
|
}
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
/* TODO: check for timeout as this could hang indefinitely otherwise */
|
||||||
}
|
}
|
||||||
infof (conn->data, "handshake completed successfully\n");
|
infof (conn->data, "handshake completed successfully\n");
|
||||||
|
|
||||||
|
@@ -5,8 +5,8 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 - 2013, Nick Zitzmann, <nickzman@gmail.com>.
|
* Copyright (C) 2012 - 2014, Nick Zitzmann, <nickzman@gmail.com>.
|
||||||
* Copyright (C) 2012 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2012 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -952,7 +952,7 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
|
|||||||
|
|
||||||
/* Here we go: */
|
/* Here we go: */
|
||||||
status = SecPKCS12Import(pkcs_data, options, &items);
|
status = SecPKCS12Import(pkcs_data, options, &items);
|
||||||
if(status == noErr) {
|
if(status == noErr && items && CFArrayGetCount(items)) {
|
||||||
CFDictionaryRef identity_and_trust = CFArrayGetValueAtIndex(items, 0L);
|
CFDictionaryRef identity_and_trust = CFArrayGetValueAtIndex(items, 0L);
|
||||||
const void *temp_identity = CFDictionaryGetValue(identity_and_trust,
|
const void *temp_identity = CFDictionaryGetValue(identity_and_trust,
|
||||||
kSecImportItemIdentity);
|
kSecImportItemIdentity);
|
||||||
@@ -960,8 +960,10 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
|
|||||||
/* Retain the identity; we don't care about any other data... */
|
/* Retain the identity; we don't care about any other data... */
|
||||||
CFRetain(temp_identity);
|
CFRetain(temp_identity);
|
||||||
*out_cert_and_key = (SecIdentityRef)temp_identity;
|
*out_cert_and_key = (SecIdentityRef)temp_identity;
|
||||||
CFRelease(items);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(items)
|
||||||
|
CFRelease(items);
|
||||||
CFRelease(options);
|
CFRelease(options);
|
||||||
CFRelease(pkcs_data);
|
CFRelease(pkcs_data);
|
||||||
}
|
}
|
||||||
|
@@ -193,7 +193,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* allocate memory for the re-usable credential handle */
|
/* allocate memory for the re-usable credential handle */
|
||||||
connssl->cred = malloc(sizeof(struct curl_schannel_cred));
|
connssl->cred = (struct curl_schannel_cred *)
|
||||||
|
malloc(sizeof(struct curl_schannel_cred));
|
||||||
if(!connssl->cred) {
|
if(!connssl->cred) {
|
||||||
failf(data, "schannel: unable to allocate memory");
|
failf(data, "schannel: unable to allocate memory");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@@ -236,7 +237,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
|
|||||||
ISC_REQ_STREAM;
|
ISC_REQ_STREAM;
|
||||||
|
|
||||||
/* allocate memory for the security context handle */
|
/* allocate memory for the security context handle */
|
||||||
connssl->ctxt = malloc(sizeof(struct curl_schannel_ctxt));
|
connssl->ctxt = (struct curl_schannel_ctxt *)
|
||||||
|
malloc(sizeof(struct curl_schannel_ctxt));
|
||||||
if(!connssl->ctxt) {
|
if(!connssl->ctxt) {
|
||||||
failf(data, "schannel: unable to allocate memory");
|
failf(data, "schannel: unable to allocate memory");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@@ -310,6 +312,9 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
|
|||||||
infof(data, "schannel: SSL/TLS connection with %s port %hu (step 2/3)\n",
|
infof(data, "schannel: SSL/TLS connection with %s port %hu (step 2/3)\n",
|
||||||
conn->host.name, conn->remote_port);
|
conn->host.name, conn->remote_port);
|
||||||
|
|
||||||
|
if(!connssl->cred || !connssl->ctxt)
|
||||||
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
|
|
||||||
/* buffer to store previously received and encrypted data */
|
/* buffer to store previously received and encrypted data */
|
||||||
if(connssl->encdata_buffer == NULL) {
|
if(connssl->encdata_buffer == NULL) {
|
||||||
connssl->encdata_offset = 0;
|
connssl->encdata_offset = 0;
|
||||||
@@ -508,6 +513,9 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
|
|||||||
infof(data, "schannel: SSL/TLS connection with %s port %hu (step 3/3)\n",
|
infof(data, "schannel: SSL/TLS connection with %s port %hu (step 3/3)\n",
|
||||||
conn->host.name, conn->remote_port);
|
conn->host.name, conn->remote_port);
|
||||||
|
|
||||||
|
if(!connssl->cred)
|
||||||
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
|
|
||||||
/* check if the required context attributes are met */
|
/* check if the required context attributes are met */
|
||||||
if(connssl->ret_flags != connssl->req_flags) {
|
if(connssl->ret_flags != connssl->req_flags) {
|
||||||
if(!(connssl->ret_flags & ISC_RET_SEQUENCE_DETECT))
|
if(!(connssl->ret_flags & ISC_RET_SEQUENCE_DETECT))
|
||||||
@@ -757,7 +765,7 @@ schannel_send(struct connectdata *conn, int sockindex,
|
|||||||
|
|
||||||
this_write = 0;
|
this_write = 0;
|
||||||
|
|
||||||
timeleft = Curl_timeleft(conn->data, NULL, TRUE);
|
timeleft = Curl_timeleft(conn->data, NULL, FALSE);
|
||||||
if(timeleft < 0) {
|
if(timeleft < 0) {
|
||||||
/* we already got the timeout */
|
/* we already got the timeout */
|
||||||
failf(conn->data, "schannel: timed out sending data "
|
failf(conn->data, "schannel: timed out sending data "
|
||||||
|
@@ -47,11 +47,16 @@
|
|||||||
#define _MPRINTF_REPLACE /* use our functions only */
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
#include <curl/mprintf.h>
|
#include <curl/mprintf.h>
|
||||||
#include "curl_memory.h"
|
#include "curl_memory.h"
|
||||||
|
|
||||||
|
#include <cyassl/ssl.h>
|
||||||
|
#ifdef HAVE_CYASSL_ERROR_SSL_H
|
||||||
|
#include <cyassl/error-ssl.h>
|
||||||
|
#else
|
||||||
|
#include <cyassl/error.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#include <cyassl/ssl.h>
|
|
||||||
#include <cyassl/error.h>
|
|
||||||
|
|
||||||
|
|
||||||
static Curl_recv cyassl_recv;
|
static Curl_recv cyassl_recv;
|
||||||
static Curl_send cyassl_send;
|
static Curl_send cyassl_send;
|
||||||
|
@@ -735,9 +735,10 @@ gtls_connect_step3(struct connectdata *conn,
|
|||||||
/* initialize an X.509 certificate structure. */
|
/* initialize an X.509 certificate structure. */
|
||||||
gnutls_x509_crt_init(&x509_cert);
|
gnutls_x509_crt_init(&x509_cert);
|
||||||
|
|
||||||
/* convert the given DER or PEM encoded Certificate to the native
|
if(chainp)
|
||||||
gnutls_x509_crt_t format */
|
/* convert the given DER or PEM encoded Certificate to the native
|
||||||
gnutls_x509_crt_import(x509_cert, chainp, GNUTLS_X509_FMT_DER);
|
gnutls_x509_crt_t format */
|
||||||
|
gnutls_x509_crt_import(x509_cert, chainp, GNUTLS_X509_FMT_DER);
|
||||||
|
|
||||||
if(data->set.ssl.issuercert) {
|
if(data->set.ssl.issuercert) {
|
||||||
gnutls_x509_crt_init(&x509_issuer);
|
gnutls_x509_crt_init(&x509_issuer);
|
||||||
@@ -883,7 +884,7 @@ gtls_connect_step3(struct connectdata *conn,
|
|||||||
if(proto.size == NGHTTP2_PROTO_VERSION_ID_LEN &&
|
if(proto.size == NGHTTP2_PROTO_VERSION_ID_LEN &&
|
||||||
memcmp(NGHTTP2_PROTO_VERSION_ID, proto.data,
|
memcmp(NGHTTP2_PROTO_VERSION_ID, proto.data,
|
||||||
NGHTTP2_PROTO_VERSION_ID_LEN) == 0) {
|
NGHTTP2_PROTO_VERSION_ID_LEN) == 0) {
|
||||||
conn->negnpn = NPN_HTTP2_DRAFT09;
|
conn->negnpn = NPN_HTTP2;
|
||||||
}
|
}
|
||||||
else if(proto.size == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1,
|
else if(proto.size == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1,
|
||||||
proto.data, ALPN_HTTP_1_1_LENGTH) == 0) {
|
proto.data, ALPN_HTTP_1_1_LENGTH) == 0) {
|
||||||
|
281
lib/vtls/nss.c
281
lib/vtls/nss.c
@@ -180,6 +180,10 @@ static const cipher_s cipherlist[] = {
|
|||||||
static const char* pem_library = "libnsspem.so";
|
static const char* pem_library = "libnsspem.so";
|
||||||
SECMODModule* mod = NULL;
|
SECMODModule* mod = NULL;
|
||||||
|
|
||||||
|
/* NSPR I/O layer we use to detect blocking direction during SSL handshake */
|
||||||
|
static PRDescIdentity nspr_io_identity = PR_INVALID_IO_LAYER;
|
||||||
|
static PRIOMethods nspr_io_methods;
|
||||||
|
|
||||||
static const char* nss_error_to_name(PRErrorCode code)
|
static const char* nss_error_to_name(PRErrorCode code)
|
||||||
{
|
{
|
||||||
const char *name = PR_ErrorToName(code);
|
const char *name = PR_ErrorToName(code);
|
||||||
@@ -657,7 +661,7 @@ static void HandshakeCallback(PRFileDesc *sock, void *arg)
|
|||||||
if(buflen == NGHTTP2_PROTO_VERSION_ID_LEN &&
|
if(buflen == NGHTTP2_PROTO_VERSION_ID_LEN &&
|
||||||
memcmp(NGHTTP2_PROTO_VERSION_ID, buf, NGHTTP2_PROTO_VERSION_ID_LEN)
|
memcmp(NGHTTP2_PROTO_VERSION_ID, buf, NGHTTP2_PROTO_VERSION_ID_LEN)
|
||||||
== 0) {
|
== 0) {
|
||||||
conn->negnpn = NPN_HTTP2_DRAFT09;
|
conn->negnpn = NPN_HTTP2;
|
||||||
}
|
}
|
||||||
else if(buflen == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1, buf,
|
else if(buflen == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1, buf,
|
||||||
ALPN_HTTP_1_1_LENGTH)) {
|
ALPN_HTTP_1_1_LENGTH)) {
|
||||||
@@ -940,6 +944,60 @@ isTLSIntoleranceError(PRInt32 err)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* update blocking direction in case of PR_WOULD_BLOCK_ERROR */
|
||||||
|
static void nss_update_connecting_state(ssl_connect_state state, void *secret)
|
||||||
|
{
|
||||||
|
struct ssl_connect_data *connssl = (struct ssl_connect_data *)secret;
|
||||||
|
if(PR_GetError() != PR_WOULD_BLOCK_ERROR)
|
||||||
|
/* an unrelated error is passing by */
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(connssl->connecting_state) {
|
||||||
|
case ssl_connect_2:
|
||||||
|
case ssl_connect_2_reading:
|
||||||
|
case ssl_connect_2_writing:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* we are not called from an SSL handshake */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update the state accordingly */
|
||||||
|
connssl->connecting_state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* recv() wrapper we use to detect blocking direction during SSL handshake */
|
||||||
|
static PRInt32 nspr_io_recv(PRFileDesc *fd, void *buf, PRInt32 amount,
|
||||||
|
PRIntn flags, PRIntervalTime timeout)
|
||||||
|
{
|
||||||
|
const PRRecvFN recv_fn = fd->lower->methods->recv;
|
||||||
|
const PRInt32 rv = recv_fn(fd->lower, buf, amount, flags, timeout);
|
||||||
|
if(rv < 0)
|
||||||
|
/* check for PR_WOULD_BLOCK_ERROR and update blocking direction */
|
||||||
|
nss_update_connecting_state(ssl_connect_2_reading, fd->secret);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send() wrapper we use to detect blocking direction during SSL handshake */
|
||||||
|
static PRInt32 nspr_io_send(PRFileDesc *fd, const void *buf, PRInt32 amount,
|
||||||
|
PRIntn flags, PRIntervalTime timeout)
|
||||||
|
{
|
||||||
|
const PRSendFN send_fn = fd->lower->methods->send;
|
||||||
|
const PRInt32 rv = send_fn(fd->lower, buf, amount, flags, timeout);
|
||||||
|
if(rv < 0)
|
||||||
|
/* check for PR_WOULD_BLOCK_ERROR and update blocking direction */
|
||||||
|
nss_update_connecting_state(ssl_connect_2_writing, fd->secret);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close() wrapper to avoid assertion failure due to fd->secret != NULL */
|
||||||
|
static PRStatus nspr_io_close(PRFileDesc *fd)
|
||||||
|
{
|
||||||
|
const PRCloseFN close_fn = PR_GetDefaultIOMethods()->close;
|
||||||
|
fd->secret = NULL;
|
||||||
|
return close_fn(fd);
|
||||||
|
}
|
||||||
|
|
||||||
static CURLcode nss_init_core(struct SessionHandle *data, const char *cert_dir)
|
static CURLcode nss_init_core(struct SessionHandle *data, const char *cert_dir)
|
||||||
{
|
{
|
||||||
NSSInitParameters initparams;
|
NSSInitParameters initparams;
|
||||||
@@ -1004,6 +1062,21 @@ static CURLcode nss_init(struct SessionHandle *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(nspr_io_identity == PR_INVALID_IO_LAYER) {
|
||||||
|
/* allocate an identity for our own NSPR I/O layer */
|
||||||
|
nspr_io_identity = PR_GetUniqueIdentity("libcurl");
|
||||||
|
if(nspr_io_identity == PR_INVALID_IO_LAYER)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
/* the default methods just call down to the lower I/O layer */
|
||||||
|
memcpy(&nspr_io_methods, PR_GetDefaultIOMethods(), sizeof nspr_io_methods);
|
||||||
|
|
||||||
|
/* override certain methods in the table by our wrappers */
|
||||||
|
nspr_io_methods.recv = nspr_io_recv;
|
||||||
|
nspr_io_methods.send = nspr_io_send;
|
||||||
|
nspr_io_methods.close = nspr_io_close;
|
||||||
|
}
|
||||||
|
|
||||||
rv = nss_init_core(data, cert_dir);
|
rv = nss_init_core(data, cert_dir);
|
||||||
if(rv)
|
if(rv)
|
||||||
return rv;
|
return rv;
|
||||||
@@ -1296,19 +1369,71 @@ static CURLcode nss_init_sslver(SSLVersionRange *sslver,
|
|||||||
return CURLE_SSL_CONNECT_ERROR;
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
|
static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
|
||||||
|
struct SessionHandle *data,
|
||||||
|
CURLcode curlerr)
|
||||||
{
|
{
|
||||||
|
SSLVersionRange sslver;
|
||||||
PRErrorCode err = 0;
|
PRErrorCode err = 0;
|
||||||
|
|
||||||
|
/* reset the flag to avoid an infinite loop */
|
||||||
|
data->state.ssl_connect_retry = FALSE;
|
||||||
|
|
||||||
|
if(is_nss_error(curlerr)) {
|
||||||
|
/* read NSPR error code */
|
||||||
|
err = PR_GetError();
|
||||||
|
if(is_cc_error(err))
|
||||||
|
curlerr = CURLE_SSL_CERTPROBLEM;
|
||||||
|
|
||||||
|
/* print the error number and error string */
|
||||||
|
infof(data, "NSS error %d (%s)\n", err, nss_error_to_name(err));
|
||||||
|
|
||||||
|
/* print a human-readable message describing the error if available */
|
||||||
|
nss_print_error_message(data, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cleanup on connection failure */
|
||||||
|
Curl_llist_destroy(connssl->obj_list, NULL);
|
||||||
|
connssl->obj_list = NULL;
|
||||||
|
|
||||||
|
if((SSL_VersionRangeGet(connssl->handle, &sslver) == SECSuccess)
|
||||||
|
&& (sslver.min == SSL_LIBRARY_VERSION_3_0)
|
||||||
|
&& (sslver.max == SSL_LIBRARY_VERSION_TLS_1_0)
|
||||||
|
&& isTLSIntoleranceError(err)) {
|
||||||
|
/* schedule reconnect through Curl_retry_request() */
|
||||||
|
data->state.ssl_connect_retry = TRUE;
|
||||||
|
infof(data, "Error in TLS handshake, trying SSLv3...\n");
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return curlerr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Switch the SSL socket into non-blocking mode. */
|
||||||
|
static CURLcode nss_set_nonblock(struct ssl_connect_data *connssl,
|
||||||
|
struct SessionHandle *data)
|
||||||
|
{
|
||||||
|
static PRSocketOptionData sock_opt;
|
||||||
|
sock_opt.option = PR_SockOpt_Nonblocking;
|
||||||
|
sock_opt.value.non_blocking = PR_TRUE;
|
||||||
|
|
||||||
|
if(PR_SetSocketOption(connssl->handle, &sock_opt) != PR_SUCCESS)
|
||||||
|
return nss_fail_connect(connssl, data, CURLE_SSL_CONNECT_ERROR);
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
|
||||||
|
{
|
||||||
PRFileDesc *model = NULL;
|
PRFileDesc *model = NULL;
|
||||||
|
PRFileDesc *nspr_io = NULL;
|
||||||
|
PRFileDesc *nspr_io_stub = NULL;
|
||||||
PRBool ssl_no_cache;
|
PRBool ssl_no_cache;
|
||||||
PRBool ssl_cbc_random_iv;
|
PRBool ssl_cbc_random_iv;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
curl_socket_t sockfd = conn->sock[sockindex];
|
curl_socket_t sockfd = conn->sock[sockindex];
|
||||||
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
||||||
CURLcode curlerr;
|
CURLcode curlerr;
|
||||||
PRSocketOptionData sock_opt;
|
|
||||||
long time_left;
|
|
||||||
PRUint32 timeout;
|
|
||||||
|
|
||||||
SSLVersionRange sslver = {
|
SSLVersionRange sslver = {
|
||||||
SSL_LIBRARY_VERSION_3_0, /* min */
|
SSL_LIBRARY_VERSION_3_0, /* min */
|
||||||
@@ -1475,12 +1600,35 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Import our model socket onto the existing file descriptor */
|
/* wrap OS file descriptor by NSPR's file descriptor abstraction */
|
||||||
connssl->handle = PR_ImportTCPSocket(sockfd);
|
nspr_io = PR_ImportTCPSocket(sockfd);
|
||||||
connssl->handle = SSL_ImportFD(model, connssl->handle);
|
if(!nspr_io)
|
||||||
if(!connssl->handle)
|
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
/* create our own NSPR I/O layer */
|
||||||
|
nspr_io_stub = PR_CreateIOLayerStub(nspr_io_identity, &nspr_io_methods);
|
||||||
|
if(!nspr_io_stub) {
|
||||||
|
PR_Close(nspr_io);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make the per-connection data accessible from NSPR I/O callbacks */
|
||||||
|
nspr_io_stub->secret = (void *)connssl;
|
||||||
|
|
||||||
|
/* push our new layer to the NSPR I/O stack */
|
||||||
|
if(PR_PushIOLayer(nspr_io, PR_TOP_IO_LAYER, nspr_io_stub) != PR_SUCCESS) {
|
||||||
|
PR_Close(nspr_io);
|
||||||
|
PR_Close(nspr_io_stub);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* import our model socket onto the current I/O stack */
|
||||||
|
connssl->handle = SSL_ImportFD(model, nspr_io);
|
||||||
|
if(!connssl->handle) {
|
||||||
|
PR_Close(nspr_io);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
PR_Close(model); /* We don't need this any more */
|
PR_Close(model); /* We don't need this any more */
|
||||||
model = NULL;
|
model = NULL;
|
||||||
|
|
||||||
@@ -1534,30 +1682,43 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
|
|||||||
|
|
||||||
SSL_SetURL(connssl->handle, conn->host.name);
|
SSL_SetURL(connssl->handle, conn->host.name);
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if(model)
|
||||||
|
PR_Close(model);
|
||||||
|
|
||||||
|
return nss_fail_connect(connssl, data, curlerr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
|
||||||
|
{
|
||||||
|
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
CURLcode curlerr = CURLE_SSL_CONNECT_ERROR;
|
||||||
|
PRUint32 timeout;
|
||||||
|
|
||||||
/* check timeout situation */
|
/* check timeout situation */
|
||||||
time_left = Curl_timeleft(data, NULL, TRUE);
|
const long time_left = Curl_timeleft(data, NULL, TRUE);
|
||||||
if(time_left < 0L) {
|
if(time_left < 0L) {
|
||||||
failf(data, "timed out before SSL handshake");
|
failf(data, "timed out before SSL handshake");
|
||||||
curlerr = CURLE_OPERATION_TIMEDOUT;
|
curlerr = CURLE_OPERATION_TIMEDOUT;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
timeout = PR_MillisecondsToInterval((PRUint32) time_left);
|
|
||||||
|
|
||||||
/* Force the handshake now */
|
/* Force the handshake now */
|
||||||
|
timeout = PR_MillisecondsToInterval((PRUint32) time_left);
|
||||||
if(SSL_ForceHandshakeWithTimeout(connssl->handle, timeout) != SECSuccess) {
|
if(SSL_ForceHandshakeWithTimeout(connssl->handle, timeout) != SECSuccess) {
|
||||||
if(conn->data->set.ssl.certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN)
|
if(PR_GetError() == PR_WOULD_BLOCK_ERROR)
|
||||||
|
/* blocking direction is updated by nss_update_connecting_state() */
|
||||||
|
return CURLE_AGAIN;
|
||||||
|
else if(conn->data->set.ssl.certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN)
|
||||||
curlerr = CURLE_PEER_FAILED_VERIFICATION;
|
curlerr = CURLE_PEER_FAILED_VERIFICATION;
|
||||||
else if(conn->data->set.ssl.certverifyresult!=0)
|
else if(conn->data->set.ssl.certverifyresult!=0)
|
||||||
curlerr = CURLE_SSL_CACERT;
|
curlerr = CURLE_SSL_CACERT;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* switch the SSL socket into non-blocking mode */
|
|
||||||
sock_opt.option = PR_SockOpt_Nonblocking;
|
|
||||||
sock_opt.value.non_blocking = PR_TRUE;
|
|
||||||
if(PR_SetSocketOption(connssl->handle, &sock_opt) != PR_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
connssl->state = ssl_connection_complete;
|
connssl->state = ssl_connection_complete;
|
||||||
conn->recv[sockindex] = nss_recv;
|
conn->recv[sockindex] = nss_recv;
|
||||||
conn->send[sockindex] = nss_send;
|
conn->send[sockindex] = nss_send;
|
||||||
@@ -1585,40 +1746,70 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
|
|||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
/* reset the flag to avoid an infinite loop */
|
return nss_fail_connect(connssl, data, curlerr);
|
||||||
data->state.ssl_connect_retry = FALSE;
|
}
|
||||||
|
|
||||||
if(is_nss_error(curlerr)) {
|
static CURLcode nss_connect_common(struct connectdata *conn, int sockindex,
|
||||||
/* read NSPR error code */
|
bool *done)
|
||||||
err = PR_GetError();
|
{
|
||||||
if(is_cc_error(err))
|
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
||||||
curlerr = CURLE_SSL_CERTPROBLEM;
|
struct SessionHandle *data = conn->data;
|
||||||
|
const bool blocking = (done == NULL);
|
||||||
|
CURLcode rv;
|
||||||
|
|
||||||
/* print the error number and error string */
|
if(connssl->connecting_state == ssl_connect_1) {
|
||||||
infof(data, "NSS error %d (%s)\n", err, nss_error_to_name(err));
|
rv = nss_setup_connect(conn, sockindex);
|
||||||
|
if(rv)
|
||||||
|
/* we do not expect CURLE_AGAIN from nss_setup_connect() */
|
||||||
|
return rv;
|
||||||
|
|
||||||
/* print a human-readable message describing the error if available */
|
if(!blocking) {
|
||||||
nss_print_error_message(data, err);
|
/* in non-blocking mode, set NSS non-blocking mode before handshake */
|
||||||
|
rv = nss_set_nonblock(connssl, data);
|
||||||
|
if(rv)
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
connssl->connecting_state = ssl_connect_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(model)
|
rv = nss_do_connect(conn, sockindex);
|
||||||
PR_Close(model);
|
switch(rv) {
|
||||||
|
case CURLE_OK:
|
||||||
/* cleanup on connection failure */
|
break;
|
||||||
Curl_llist_destroy(connssl->obj_list, NULL);
|
case CURLE_AGAIN:
|
||||||
connssl->obj_list = NULL;
|
if(!blocking)
|
||||||
|
/* CURLE_AGAIN in non-blocking mode is not an error */
|
||||||
if((sslver.min == SSL_LIBRARY_VERSION_3_0)
|
return CURLE_OK;
|
||||||
&& (sslver.max == SSL_LIBRARY_VERSION_TLS_1_0)
|
/* fall through */
|
||||||
&& isTLSIntoleranceError(err)) {
|
default:
|
||||||
/* schedule reconnect through Curl_retry_request() */
|
return rv;
|
||||||
data->state.ssl_connect_retry = TRUE;
|
|
||||||
infof(data, "Error in TLS handshake, trying SSLv3...\n");
|
|
||||||
return CURLE_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return curlerr;
|
if(blocking) {
|
||||||
|
/* in blocking mode, set NSS non-blocking mode _after_ SSL handshake */
|
||||||
|
rv = nss_set_nonblock(connssl, data);
|
||||||
|
if(rv)
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* signal completed SSL handshake */
|
||||||
|
*done = TRUE;
|
||||||
|
|
||||||
|
connssl->connecting_state = ssl_connect_done;
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
|
||||||
|
{
|
||||||
|
return nss_connect_common(conn, sockindex, /* blocking */ NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CURLcode Curl_nss_connect_nonblocking(struct connectdata *conn,
|
||||||
|
int sockindex, bool *done)
|
||||||
|
{
|
||||||
|
return nss_connect_common(conn, sockindex, done);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t nss_send(struct connectdata *conn, /* connection data */
|
static ssize_t nss_send(struct connectdata *conn, /* connection data */
|
||||||
|
@@ -68,6 +68,7 @@ void Curl_nss_md5sum(unsigned char *tmp, /* input */
|
|||||||
#define curlssl_init Curl_nss_init
|
#define curlssl_init Curl_nss_init
|
||||||
#define curlssl_cleanup Curl_nss_cleanup
|
#define curlssl_cleanup Curl_nss_cleanup
|
||||||
#define curlssl_connect Curl_nss_connect
|
#define curlssl_connect Curl_nss_connect
|
||||||
|
#define curlssl_connect_nonblocking Curl_nss_connect_nonblocking
|
||||||
|
|
||||||
/* NSS has its own session ID cache */
|
/* NSS has its own session ID cache */
|
||||||
#define curlssl_session_free(x) Curl_nop_stmt
|
#define curlssl_session_free(x) Curl_nop_stmt
|
||||||
|
@@ -538,6 +538,7 @@ int cert_stuff(struct connectdata *conn,
|
|||||||
|
|
||||||
if(!cert_done)
|
if(!cert_done)
|
||||||
return 0; /* failure! */
|
return 0; /* failure! */
|
||||||
|
break;
|
||||||
#else
|
#else
|
||||||
failf(data, "file type P12 for certificate not supported");
|
failf(data, "file type P12 for certificate not supported");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1430,8 +1431,9 @@ select_next_proto_cb(SSL *ssl,
|
|||||||
(void)ssl;
|
(void)ssl;
|
||||||
|
|
||||||
if(retval == 1) {
|
if(retval == 1) {
|
||||||
infof(conn->data, "NPN, negotiated HTTP2\n");
|
infof(conn->data, "NPN, negotiated HTTP2 (%s)\n",
|
||||||
conn->negnpn = NPN_HTTP2_DRAFT09;
|
NGHTTP2_PROTO_VERSION_ID);
|
||||||
|
conn->negnpn = NPN_HTTP2;
|
||||||
}
|
}
|
||||||
else if(retval == 0) {
|
else if(retval == 0) {
|
||||||
infof(conn->data, "NPN, negotiated HTTP1.1\n");
|
infof(conn->data, "NPN, negotiated HTTP1.1\n");
|
||||||
@@ -1499,6 +1501,8 @@ ossl_connect_step1(struct connectdata *conn,
|
|||||||
/* Make funny stuff to get random input */
|
/* Make funny stuff to get random input */
|
||||||
Curl_ossl_seed(data);
|
Curl_ossl_seed(data);
|
||||||
|
|
||||||
|
data->set.ssl.certverifyresult = !X509_V_OK;
|
||||||
|
|
||||||
/* check to see if we've been told to use an explicit SSL/TLS version */
|
/* check to see if we've been told to use an explicit SSL/TLS version */
|
||||||
|
|
||||||
switch(data->set.ssl.version) {
|
switch(data->set.ssl.version) {
|
||||||
@@ -1891,11 +1895,6 @@ ossl_connect_step2(struct connectdata *conn, int sockindex)
|
|||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
int err;
|
int err;
|
||||||
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
||||||
#ifdef HAS_ALPN
|
|
||||||
char* neg_protocol;
|
|
||||||
int len = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
|
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
|
||||||
|| ssl_connect_2_reading == connssl->connecting_state
|
|| ssl_connect_2_reading == connssl->connecting_state
|
||||||
|| ssl_connect_2_writing == connssl->connecting_state);
|
|| ssl_connect_2_writing == connssl->connecting_state);
|
||||||
@@ -1997,13 +1996,15 @@ ossl_connect_step2(struct connectdata *conn, int sockindex)
|
|||||||
* negotiated
|
* negotiated
|
||||||
*/
|
*/
|
||||||
if(data->set.ssl_enable_alpn) {
|
if(data->set.ssl_enable_alpn) {
|
||||||
|
const unsigned char* neg_protocol;
|
||||||
|
unsigned int len;
|
||||||
SSL_get0_alpn_selected(connssl->handle, &neg_protocol, &len);
|
SSL_get0_alpn_selected(connssl->handle, &neg_protocol, &len);
|
||||||
if(len != 0) {
|
if(len != 0) {
|
||||||
infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol);
|
infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol);
|
||||||
|
|
||||||
if(len == NGHTTP2_PROTO_VERSION_ID_LEN &&
|
if(len == NGHTTP2_PROTO_VERSION_ID_LEN &&
|
||||||
memcmp(NGHTTP2_PROTO_VERSION_ID, neg_protocol, len) == 0) {
|
memcmp(NGHTTP2_PROTO_VERSION_ID, neg_protocol, len) == 0) {
|
||||||
conn->negnpn = NPN_HTTP2_DRAFT09;
|
conn->negnpn = NPN_HTTP2;
|
||||||
}
|
}
|
||||||
else if(len == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1,
|
else if(len == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1,
|
||||||
neg_protocol, ALPN_HTTP_1_1_LENGTH) == 0) {
|
neg_protocol, ALPN_HTTP_1_1_LENGTH) == 0) {
|
||||||
@@ -2119,7 +2120,7 @@ static int X509V3_ext(struct SessionHandle *data,
|
|||||||
sep=", ";
|
sep=", ";
|
||||||
j++; /* skip the newline */
|
j++; /* skip the newline */
|
||||||
};
|
};
|
||||||
while((biomem->data[j] == ' ') && (j<(size_t)biomem->length))
|
while((j<(size_t)biomem->length) && (biomem->data[j] == ' '))
|
||||||
j++;
|
j++;
|
||||||
if(j<(size_t)biomem->length)
|
if(j<(size_t)biomem->length)
|
||||||
ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
|
ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
|
||||||
@@ -2161,8 +2162,6 @@ static void dumpcert(struct SessionHandle *data, X509 *x, int numcert)
|
|||||||
|
|
||||||
BIO_get_mem_ptr(bio_out, &biomem);
|
BIO_get_mem_ptr(bio_out, &biomem);
|
||||||
|
|
||||||
infof(data, "%s\n", biomem->data);
|
|
||||||
|
|
||||||
Curl_ssl_push_certinfo_len(data, numcert,
|
Curl_ssl_push_certinfo_len(data, numcert,
|
||||||
"Cert", biomem->data, biomem->length);
|
"Cert", biomem->data, biomem->length);
|
||||||
|
|
||||||
@@ -2366,8 +2365,6 @@ static CURLcode servercert(struct connectdata *conn,
|
|||||||
/* we've been asked to gather certificate info! */
|
/* we've been asked to gather certificate info! */
|
||||||
(void)get_cert_chain(conn, connssl);
|
(void)get_cert_chain(conn, connssl);
|
||||||
|
|
||||||
data->set.ssl.certverifyresult = !X509_V_OK;
|
|
||||||
|
|
||||||
connssl->server_cert = SSL_get_peer_certificate(connssl->handle);
|
connssl->server_cert = SSL_get_peer_certificate(connssl->handle);
|
||||||
if(!connssl->server_cert) {
|
if(!connssl->server_cert) {
|
||||||
if(strict)
|
if(strict)
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
/* see http://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-04 */
|
/* see http://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-04 */
|
||||||
#define ALPN_HTTP_1_1_LENGTH 8
|
#define ALPN_HTTP_1_1_LENGTH 8
|
||||||
#define ALPN_HTTP_1_1 "http/1.0"
|
#define ALPN_HTTP_1_1 "http/1.1"
|
||||||
|
|
||||||
bool Curl_ssl_config_matches(struct ssl_config_data* data,
|
bool Curl_ssl_config_matches(struct ssl_config_data* data,
|
||||||
struct ssl_config_data* needle);
|
struct ssl_config_data* needle);
|
||||||
|
@@ -4729,7 +4729,7 @@ AC_DEFUN([CURL_CHECK_FUNC_POLL], [
|
|||||||
tst_allow_poll="unknown"
|
tst_allow_poll="unknown"
|
||||||
#
|
#
|
||||||
case $host_os in
|
case $host_os in
|
||||||
darwin*|interix*)
|
darwin[[123456789]].*|darwin10.*|darwin11.*|darwin12.*|interix*)
|
||||||
dnl poll() does not work on these platforms
|
dnl poll() does not work on these platforms
|
||||||
dnl Interix: "does provide poll(), but the implementing developer must
|
dnl Interix: "does provide poll(), but the implementing developer must
|
||||||
dnl have been in a bad mood, because poll() only works on the /proc
|
dnl have been in a bad mood, because poll() only works on the /proc
|
||||||
|
6
maketgz
6
maketgz
@@ -9,7 +9,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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -123,6 +123,10 @@ make -s html
|
|||||||
echo "make pdf"
|
echo "make pdf"
|
||||||
make -s pdf
|
make -s pdf
|
||||||
|
|
||||||
|
# And the IDE files
|
||||||
|
echo "make vc-ide"
|
||||||
|
make -s vc-ide
|
||||||
|
|
||||||
echo "produce CHANGES"
|
echo "produce CHANGES"
|
||||||
git log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./log2changes.pl > CHANGES.dist
|
git log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./log2changes.pl > CHANGES.dist
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
; curl package defintion file
|
; curl package definition file
|
||||||
; Use with makesis to create a Symbian .sis package
|
; Use with makesis to create a Symbian .sis package
|
||||||
|
|
||||||
;Language - standard language definitions
|
;Language - standard language definitions
|
||||||
|
@@ -39,7 +39,7 @@ SOURCE \
|
|||||||
http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.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_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_ntlm_msgs.c \
|
||||||
curl_sasl.c vtls/curl_schannel.c curl_multibyte.c \
|
curl_sasl.c vtls/curl_schannel.c curl_multibyte.c \
|
||||||
vtls/curl_darwinssl.c bundles.c conncache.c
|
vtls/curl_darwinssl.c bundles.c conncache.c curl_sasl_sspi.c
|
||||||
|
|
||||||
USERINCLUDE ../../../lib ../../../include/curl
|
USERINCLUDE ../../../lib ../../../include/curl
|
||||||
#ifdef ENABLE_SSL
|
#ifdef ENABLE_SSL
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
; libcurl package defintion file
|
; libcurl package definition file
|
||||||
; Use with makesis to create a Symbian .sis package
|
; Use with makesis to create a Symbian .sis package
|
||||||
|
|
||||||
;Language - standard language definitions
|
;Language - standard language definitions
|
||||||
|
104
projects/README
Normal file
104
projects/README
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
Building via IDE Project Files
|
||||||
|
==============================
|
||||||
|
|
||||||
|
This document describes how to compile, build and install curl and libcurl
|
||||||
|
from sources using an IDE based development tool such as Visual Studio.
|
||||||
|
|
||||||
|
Project files are currently available for Visual C++ v6.0 to v12.0. The
|
||||||
|
following directory structure has been used to cater for this:
|
||||||
|
|
||||||
|
somedirectory\
|
||||||
|
|_curl
|
||||||
|
|_projects
|
||||||
|
|_<platform>
|
||||||
|
|_<ide>
|
||||||
|
|_lib
|
||||||
|
|_src
|
||||||
|
|
||||||
|
This structure allows for side-by-side compilation of curl on the same
|
||||||
|
machine using different versions of a given compiler (for example VC8, VC9
|
||||||
|
and VC10) and allows for your own application or product to be compiled
|
||||||
|
against those variants of libcurl for example.
|
||||||
|
|
||||||
|
Note: Typically this side-by-side compilation is generally only required
|
||||||
|
when a library is being compiled against dynamic runtime libraries.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
The projects files also support build configurations that require third
|
||||||
|
party dependencies such as openssl and ssh2. If you wish to support these,
|
||||||
|
you will also need to download and compile those libraries as well.
|
||||||
|
|
||||||
|
To support compilation of these libraries using different versions of
|
||||||
|
compilers, the following directory structure has been used for both the
|
||||||
|
output of curl and libcurl as well as these dependencies.
|
||||||
|
|
||||||
|
somedirectory\
|
||||||
|
|_curl
|
||||||
|
| |_ build
|
||||||
|
| |_<architecture>
|
||||||
|
| |_<ide>
|
||||||
|
| |_<configuration>
|
||||||
|
| |_lib
|
||||||
|
| |_src
|
||||||
|
|
|
||||||
|
|_openssl
|
||||||
|
| |_ build
|
||||||
|
| |_<architecture>
|
||||||
|
| |_VC <version>
|
||||||
|
| |_<configuration>
|
||||||
|
|
|
||||||
|
|_libssh2
|
||||||
|
|_ build
|
||||||
|
|_<architecture>
|
||||||
|
|_VC <version>
|
||||||
|
|_<configuration>
|
||||||
|
|
||||||
|
As OpenSSL doesn't support side-by-side compilation when using different
|
||||||
|
versions of Visual Studio a build helper batch file has been provided to
|
||||||
|
assist with this. Please run "build-openssl -help" for usage details.
|
||||||
|
|
||||||
|
Building with Visual C++
|
||||||
|
========================
|
||||||
|
|
||||||
|
To build with VC++, you will of course have to first install VC++ which is
|
||||||
|
part of Visual Studio.
|
||||||
|
|
||||||
|
If you are building with VC6 then you will also need the February 2003
|
||||||
|
Edition of the Platform SDK which can be downloaded from:
|
||||||
|
|
||||||
|
http://www.microsoft.com/en-us/download/details.aspx?id=12261
|
||||||
|
|
||||||
|
Once you have VC++ installed you should launch the application and open one
|
||||||
|
of the solution or workspace files.
|
||||||
|
|
||||||
|
Whilst files are provided for both libcurl and the curl command line tool as
|
||||||
|
well as a configuration that includes both, it is recommend that you use the
|
||||||
|
all-in-one configuration.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
=====
|
||||||
|
|
||||||
|
The following keywords have been used in the directory hierarchy:
|
||||||
|
|
||||||
|
<platform> - The platform (For example: Windows)
|
||||||
|
<ide> - The IDE (For example: VC6, VC10, BCC5)
|
||||||
|
<architecture> - The platform architecture (For example: Win32, Win64)
|
||||||
|
<configuration> - The target configuration (For example: DLL Debug,
|
||||||
|
LIB Release - LIB OpenSSL)
|
||||||
|
|
||||||
|
TODO
|
||||||
|
====
|
||||||
|
|
||||||
|
These project files are a recent addition to the curl source code and as such
|
||||||
|
are not 100% complete. This is a list of things that are still todo:
|
||||||
|
|
||||||
|
* Support zlib
|
||||||
|
* Support WinIDN
|
||||||
|
* Use of static runtime libraries
|
||||||
|
* Generate *.vcxproj.filters files for VC10, VC11 and VC12
|
||||||
|
* Use CURLX_* definitions for curl tool project generation
|
||||||
|
* Support for other development IDEs
|
||||||
|
|
||||||
|
Any additional help would be appreciated ;-)
|
4
projects/Windows/VC10/.gitignore
vendored
Normal file
4
projects/Windows/VC10/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/*.ncb
|
||||||
|
/*.opensdf
|
||||||
|
/*.sdf
|
||||||
|
/*.suo
|
218
projects/Windows/VC10/curl.sln
Normal file
218
projects/Windows/VC10/curl.sln
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
|
# Visual Studio 2010
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
DLL Debug|Win32 = DLL Debug|Win32
|
||||||
|
DLL Debug|x64 = DLL Debug|x64
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
|
||||||
|
DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
DLL Release|Win32 = DLL Release|Win32
|
||||||
|
DLL Release|x64 = DLL Release|x64
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
LIB Debug|Win32 = LIB Debug|Win32
|
||||||
|
LIB Debug|x64 = LIB Debug|x64
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
|
||||||
|
LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
|
||||||
|
LIB Release|Win32 = LIB Release|Win32
|
||||||
|
LIB Release|x64 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
6
projects/Windows/VC10/lib/.gitignore
vendored
Normal file
6
projects/Windows/VC10/lib/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*.vcxproj
|
||||||
|
/*.filters
|
||||||
|
/*.user
|
||||||
|
/*.ncb
|
||||||
|
/*.sdf
|
||||||
|
/*.suo
|
133
projects/Windows/VC10/lib/libcurl.sln
Normal file
133
projects/Windows/VC10/lib/libcurl.sln
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
|
# Visual Studio 2010
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
DLL Debug|Win32 = DLL Debug|Win32
|
||||||
|
DLL Debug|x64 = DLL Debug|x64
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
|
||||||
|
DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
DLL Release|Win32 = DLL Release|Win32
|
||||||
|
DLL Release|x64 = DLL Release|x64
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
LIB Debug|Win32 = LIB Debug|Win32
|
||||||
|
LIB Debug|x64 = LIB Debug|x64
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
|
||||||
|
LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
|
||||||
|
LIB Release|Win32 = LIB Release|Win32
|
||||||
|
LIB Release|x64 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
1967
projects/Windows/VC10/lib/libcurl.tmpl
Normal file
1967
projects/Windows/VC10/lib/libcurl.tmpl
Normal file
File diff suppressed because it is too large
Load Diff
6
projects/Windows/VC10/src/.gitignore
vendored
Normal file
6
projects/Windows/VC10/src/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*.vcxproj
|
||||||
|
/*.filters
|
||||||
|
/*.user
|
||||||
|
/*.ncb
|
||||||
|
/*.sdf
|
||||||
|
/*.suo
|
133
projects/Windows/VC10/src/curlsrc.sln
Normal file
133
projects/Windows/VC10/src/curlsrc.sln
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
|
# Visual Studio 2010
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
DLL Debug|Win32 = DLL Debug|Win32
|
||||||
|
DLL Debug|x64 = DLL Debug|x64
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
|
||||||
|
DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
DLL Release|Win32 = DLL Release|Win32
|
||||||
|
DLL Release|x64 = DLL Release|x64
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
LIB Debug|Win32 = LIB Debug|Win32
|
||||||
|
LIB Debug|x64 = LIB Debug|x64
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
|
||||||
|
LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
|
||||||
|
LIB Release|Win32 = LIB Release|Win32
|
||||||
|
LIB Release|x64 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
2459
projects/Windows/VC10/src/curlsrc.tmpl
Normal file
2459
projects/Windows/VC10/src/curlsrc.tmpl
Normal file
File diff suppressed because it is too large
Load Diff
4
projects/Windows/VC11/.gitignore
vendored
Normal file
4
projects/Windows/VC11/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/*.ncb
|
||||||
|
/*.opensdf
|
||||||
|
/*.sdf
|
||||||
|
/*.suo
|
218
projects/Windows/VC11/curl.sln
Normal file
218
projects/Windows/VC11/curl.sln
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 2012
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
DLL Debug|Win32 = DLL Debug|Win32
|
||||||
|
DLL Debug|x64 = DLL Debug|x64
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
|
||||||
|
DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
DLL Release|Win32 = DLL Release|Win32
|
||||||
|
DLL Release|x64 = DLL Release|x64
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
LIB Debug|Win32 = LIB Debug|Win32
|
||||||
|
LIB Debug|x64 = LIB Debug|x64
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
|
||||||
|
LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
|
||||||
|
LIB Release|Win32 = LIB Release|Win32
|
||||||
|
LIB Release|x64 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
6
projects/Windows/VC11/lib/.gitignore
vendored
Normal file
6
projects/Windows/VC11/lib/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*.vcxproj
|
||||||
|
/*.filters
|
||||||
|
/*.user
|
||||||
|
/*.ncb
|
||||||
|
/*.sdf
|
||||||
|
/*.suo
|
133
projects/Windows/VC11/lib/libcurl.sln
Normal file
133
projects/Windows/VC11/lib/libcurl.sln
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 2012
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
DLL Debug|Win32 = DLL Debug|Win32
|
||||||
|
DLL Debug|x64 = DLL Debug|x64
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
|
||||||
|
DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
|
||||||
|
DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
|
||||||
|
DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
DLL Release|Win32 = DLL Release|Win32
|
||||||
|
DLL Release|x64 = DLL Release|x64
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
LIB Debug|Win32 = LIB Debug|Win32
|
||||||
|
LIB Debug|x64 = LIB Debug|x64
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
|
||||||
|
LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
|
||||||
|
LIB Release|Win32 = LIB Release|Win32
|
||||||
|
LIB Release|x64 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
|
||||||
|
{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
2007
projects/Windows/VC11/lib/libcurl.tmpl
Normal file
2007
projects/Windows/VC11/lib/libcurl.tmpl
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user