juliaweb / libcurl.jl Goto Github PK
View Code? Open in Web Editor NEWJulia wrapper for libcurl
License: Other
Julia wrapper for libcurl
License: Other
All open issues are known, bun unclear which apply to master and which (also) to LTS.
It might be good to make a list of known bugs (a label? "applies only to LTS"?), for security, or otherwise, for the LTS. Some such as the (non-security? or would this some/this bug also count as such?) under discussion here, are known to be fixed on master (and 1.7 if I recall), but not the LTS, and will likely never be fixed:
https://www.reddit.com/r/Julia/comments/uqwd2h/comment/i8u36py/
julia> Pkg.build("LibCURL")
INFO: Building LibCURL
julia> Pkg.test("LibCURL")
INFO: Testing LibCURL
WARNING: deprecated syntax "typealias time_t Int" at /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl:8.
Use "const time_t = Int" instead.
WARNING: deprecated syntax "typealias size_t Csize_t" at /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl:9.
Use "const size_t = Csize_t" instead.
WARNING: deprecated syntax "typealias curl_off_t Int64" at /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl:10.
Use "const curl_off_t = Int64" instead.
WARNING: deprecated syntax "typealias time_t Int" at /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl:8.
Use "const time_t = Int" instead.
WARNING: deprecated syntax "typealias size_t Csize_t" at /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl:9.
Use "const size_t = Csize_t" instead.
WARNING: deprecated syntax "typealias curl_off_t Int64" at /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl:10.
Use "const curl_off_t = Int64" instead.
WARNING: deprecated syntax "typealias $fake_t $real_t" at /home/lobi/.julia/v0.6/LibCURL/src/lC_common_h.jl:11.
Use "$fake_t = $real_t" instead.
ERROR: LoadError: LoadError: invalid return type or argument type in ccall
Stacktrace:
[1] include_from_node1(::String) at ./loading.jl:552
[2] include(::String) at ./sysimg.jl:14
[3] include_from_node1(::String) at ./loading.jl:552
[4] include(::String) at ./sysimg.jl:14
[5] anonymous at ./<missing>:2
while loading /home/lobi/.julia/v0.6/LibCURL/src/lC_curl_h.jl, in expression starting on line 4
while loading /home/lobi/.julia/v0.6/LibCURL/src/LibCURL.jl, in expression starting on line 20
ERROR: LoadError: Failed to precompile LibCURL to /home/lobi/.julia/lib/v0.6/LibCURL.ji.
Stacktrace:
[1] compilecache(::String) at ./loading.jl:686
[2] _require(::Symbol) at ./loading.jl:473
[3] require(::Symbol) at ./loading.jl:386
[4] include_from_node1(::String) at ./loading.jl:552
[5] include(::String) at ./sysimg.jl:14
[6] process_options(::Base.JLOptions) at ./client.jl:305
[7] _start() at ./client.jl:371
while loading /home/lobi/.julia/v0.6/LibCURL/test/runtests.jl, in expression starting on line 1
===============================[ ERROR: LibCURL ]===============================
failed process: Process(`/home/lobi/julia06/usr/bin/julia -Cnative -J/home/lobi/julia06/usr/lib/julia/sys.so --compile=yes --depwarn=yes --check-bounds=yes --code-coverage=none --color=yes --compilecache=yes /home/lobi/.julia/v0.6/LibCURL/test/runtests.jl`, ProcessExited(1)) [1]
================================================================================
ERROR: LibCURL had test errors
julia> versioninfo()
Julia Version 0.6.0-rc1.0
Commit 6bdb395* (2017-05-07 00:00 UTC)
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge)
LAPACK: libopenblas64_
LIBM: libopenlibm
LLVM: libLLVM-3.7.1 (ORCJIT, sandybridge)
i found this as dependency to WinRPM
See #95 (comment) and #99: in short, we've lost the ability to generate the wrapper code for libcurl. Would be great to
I just updated LibCURL.jl from v0.5.1 to v0.5.2 on my windows 10 machine running Julia v1.1.1, I got the following build error. The version 0.5.1 was working without any problem. Also, v0.5.2 is fine on my MacBook Pro. Here is the error I got. Thanks for your help!
(v1.1) pkg> build LibCURL
Building LibCURL → `C:\Users\XXX\.julia\packages\LibCURL\lWJxD\deps\build.log`
┌ Error: Error building `LibCURL`:
│ ERROR: LoadError: LoadError: LibraryProduct(nothing, ["libz"], :libz, "Prefix(C:\\Users\\XXX\\.julia\\packages\\LibCURL\\lWJxD\\deps\\usr)") is not satisfied, cannot generate deps.jl!
│ Stacktrace:
│ [1] error(::String) at .\error.jl:33
│ [2] #write_deps_file#169(::Bool, ::Bool, ::Function, ::String, ::Array{LibraryProduct,1}) at C:\Users\XXX\.julia\packages\BinaryProvider\A0sDa\src\Products.jl:419
│ [3] (::getfield(BinaryProvider, Symbol("#kw##write_deps_file")))(::NamedTuple{(:verbose,),Tuple{Bool}}, ::typeof(write_deps_file), ::String, ::Array{LibraryProduct,1}) at .\none:0
│ [4] top-level scope at none:0
│ [5] include at .\boot.jl:326 [inlined]
│ [6] include_relative(::Module, ::String) at .\loading.jl:1038
│ [7] include at .\sysimg.jl:29 [inlined]
│ [8] include(::String) at C:\Users\XXX\.julia\packages\LibCURL\lWJxD\deps\build.jl:24
│ [9] top-level scope at C:\Users\XXX\.julia\packages\LibCURL\lWJxD\deps\build.jl:25
│ [10] include at .\boot.jl:326 [inlined]
│ [11] include_relative(::Module, ::String) at .\loading.jl:1038
│ [12] include(::Module, ::String) at .\sysimg.jl:29
│ [13] include(::String) at .\client.jl:403
│ [14] top-level scope at none:0
│ in expression starting at C:\Users\XXX\.julia\packages\LibCURL\lWJxD\deps\build_Zlib.v1.2.11.jl:48
│ in expression starting at C:\Users\XXX\.julia\packages\LibCURL\lWJxD\deps\build.jl:14
└ @ Pkg.Operations C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Pkg\src\Operations.jl:1075
This issue is being filed by a script, but if you reply, I will see it.
PackageEvaluator.jl is a script that runs nightly. It attempts to load all Julia packages and run their test (if available) on both the stable version of Julia (0.2) and the nightly build of the unstable version (0.3).
The results of this script are used to generate a package listing enhanced with testing results.
The status of this package, LibCURL, on...
'No tests, but package loads.' can be due to their being no tests (you should write some if you can!) but can also be due to PackageEvaluator not being able to find your tests. Consider adding a test/runtests.jl
file.
'Package doesn't load.' is the worst-case scenario. Sometimes this arises because your package doesn't have BinDeps support, or needs something that can't be installed with BinDeps. If this is the case for your package, please file an issue and an exception can be made so your package will not be tested.
This automatically filed issue is a one-off message. Starting soon, issues will only be filed when the testing status of your package changes in a negative direction (gets worse). If you'd like to opt-out of these status-change messages, reply to this message.
I get a segfault while running on v0.4.1:
julia> Pkg.test("LibCURL")
INFO: Computing test dependencies for LibCURL...
INFO: Installing HTTPClient v0.2.0
INFO: Building LibCURL
INFO: Testing LibCURL
signal (11): Segmentation fault
unknown function (ip: 0x34cd481171)
__strdup at /lib64/libc.so.6 (unknown line)
curl_slist_append at /usr/lib64/libcurl.so.4 (unknown line)
Curl_slist_duplicate at /usr/lib64/libcurl.so.4 (unknown line)
curl_easy_duphandle at /usr/lib64/libcurl.so.4 (unknown line)
unknown function (ip: 0x34cd78fe80)
=====================================================================[ ERROR: LibCURL ]=====================================================================
failed process: Process(`/opt/julia-cbe1bee3a8/bin/julia --check-bounds=yes --code-coverage=none --color=yes /home/ranjan/.julia/v0.4/LibCURL/test/runtests.jl`, ProcessSignaled(11)) [0]
============================================================================================================================================================
INFO: Removing HTTPClient v0.2.0
ERROR: LibCURL had test errors
in error at ./error.jl:21
in test at pkg/entry.jl:803
in anonymous at pkg/dir.jl:31
in cd at file.jl:22
in cd at pkg/dir.jl:31
in test at pkg.jl:71
This is my versioninfo:
julia> versioninfo()
Julia Version 0.4.1
Commit cbe1bee* (2015-11-08 10:33 UTC)
Platform Info:
System: Linux (x86_64-unknown-linux-gnu)
CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge)
LAPACK: libopenblas64_
LIBM: libopenlibm
LLVM: libLLVM-3.3
Hi,
Is there an example on how to curl get and post using LibCURL.jl?
For example is it possible to do:
curl "http://localhost:8000/echo"
Or
curl -H "Content-Type: application /json" --data '{"a":4,"b":5}' http//localhost:800/sum
The above example are directly taken from the following link (r package plumber):
https://www.rplumber.io/
Please note that I currently can't test the package HTTP because I currently can't install packages. I raise an issue in repo Pkg. The nice thing is that LibCURL comes pre-installed with Julia.
Thank you for your help.
In case you are interested in trying to push this further with structs, I pushed a branch with generated Julia types for all the cURL structs (I didn't merge this stuff into the generator yet, needs a few tweaks still for more complicated structs):
https://github.com/ihnorton/libCURL.jl/tree/struct_test
There are (at least) three structs with unsupported field types (you can tell by searching for ::Void):
CURLMsg
curl_fileinfo
curl_sockaddr
If you need these, it will be necessary to use StrPack as discussed by @pao (https://groups.google.com/d/msg/julia-dev/p6DUUSdtY2A/CR3zeC3QyeIJ)
Also, for the other ones you may need to change "type" to "immutable" in the declarations in order to make sure isbits(type) == true (see: https://groups.google.com/d/msg/julia-dev/jiJpHlgLZkA/ftClOEROlLYJ )
If you have a chance to try it I will be very interested to see the results! (also any issues)
Hi,
See PR I started here:
JuliaLang/julia#45839
I'm not sure where the main place to fix this is, seemingly in Libcurl_jll, can someone take over, to do that? I'll likely not fix the other PR (soon), and unclear if JuliaLang should even have LibCURL (or i.e. just depend on this package)?
Hi,
I'm trying to connect via a Proxy (inside corp network, I can't choose not to)
I have, of course, replaced the USER PASS & PROXY_URL text
First the error message, perhaps this is the wrong place to report it so there would be no point reading the rest :)
Assertion failure: 0 != rv, at ntio.c:1803
Please submit a bug report with steps to reproduce this fault, and any error messages that follow (in > their entirety). Thanks.
Exception: EXCEPTION_BREAKPOINT at 0x7ff9caa7e0e2 -- DebugBreak at C:\windows\system32\KERNELBASE.dll (unknown line)
DebugBreak at C:\windows\system32\KERNELBASE.dll (unknown line)
So here I am submitting this bug report. Can I also add that if it is a Julia error message, it should include a guide to where to report this bug. Thanks
My code :
using HTTPClient.HTTPC
using LibCURL
const CHECK_SSL = false
function customize_curl(curl)
# removed error trapping for clarity
LibCURL.curl_easy_setopt(curl, LibCURL.CURLOPT_PROXY, "http://USER:PASS@PROXY_URL")
LibCURL.curl_easy_setopt(curl, LibCURL.CURLOPT_PROXYPORT, 8080)
LibCURL.curl_easy_setopt(curl, LibCURL.CURLOPT_SSL_VERIFYPEER, CHECK_SSL)
end
r = HTTPC.get("https://news.ycombinator.com/news",
RequestOptions(request_timeout=5.0,callback=customize_curl)
)
println(r)
if CHECK_SSL is true I get
ERROR: LoadError: "Error executing request : Problem with the SSL CA cert (path? access rights?)"
which is a known problem, but to see here how to set options for CA checking
https://curl.haxx.se/docs/sslcerts.html
Tell libcurl to not verify the peer. With libcurl you disable this with curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
With the curl command line tool, you disable this with -k/--insecure.
so I added CHECK_SSL and set to false and then get the error message at the top.
It would be nice to be able to download a windows binary for libCurl automatically using Bindeps.
Due to security issues in prior versions of curl, it is recommended to upgrade the dependency to curl 7.78.0
In a move towards artifacts, I am wondering if this package can move away from BinaryProvider.
Should this package rely on libcurl
that ships with Julia?
It's mentioned in #1 but curl_off_t
isn't exported—it is defined internally in LibCURL. This is pretty crucial if you want to define callbacks with curl_off_t
argument types. I don't understand the Clang.jl code generation well enough to figure out why this doesn't get exported though.
When updating HDF5.jl today (15 Aug), the build of LibCURL failed (see below). It only seems to happen when logged in as a User, not as an Administrator.
(0.7) pkg> build HDF5
Building LibCURL ─────→ `C:\Users\Me\.julia\packages\LibCURL\p0LUA\deps\build.log`
┌ Error: Error building `LibCURL`:
│ ERROR: LoadError: LoadError: Could not unpack C:\Users\Me\.julia\packages\LibCURL\p0LUA\deps\usr\downloads\Zlib.v1.2.11.x86_64-w64-mingw32.tar.gz into C:\Users\Me\.julia\packages\LibCURL\p0LUA\deps\usr
│ Stacktrace:
│ [1] error(::String) at .\error.jl:33
│ [2] #unpack#98(::Bool, ::Function, ::String, ::String) at C:\Users\Me\.julia\packages\BinaryProvider\pWVqZ\src\PlatformEngines.jl:600
│ [3] macro expansion at .\none:0 [inlined]
It would be nice if you could provide usage example for curl_multi perform.
It would be nice to have the ability to download and save a file using libCURL. If the output directory and filename are not given, it could go into the current directory.
_
_ _ ()_ | A fresh approach to technical computing
() | () () | Documentation: http://docs.julialang.org
_ _ | | __ _ | Type "help()" to list help topics
| | | | | | |/ ` | |
| | || | | | (| | | Version 0.2.1 (2014-02-11 06:30 UTC)
/ |_'|||__'| | Official http://julialang.org/ release
|__/ | x86_64-w64-mingw32
julia> Pkg.build("LibCURL")
INFO: Building LibCURL
INFO: Updating WinRPM package list
INFO: Downloading http://download.opensuse.org/repositories/windows:/mingw:/win3
2/openSUSE_Factory/
/repodata/repomd.xml
INFO: Downloading http://download.opensuse.org/repositories/windows:/mingw:/win6
4/openSUSE_Factory/
/repodata/repomd.xml
INFO: Packages to install: libgpg-error-lang, libgcc, libgpg-error, libgcrypt, l
ibidn-lang, libintl, libsqlite3-0, libssh2, libidn, mozilla-nss, zlib, mozilla-n
spr, libcurl
INFO: Downloading: libgpg-error-lang
INFO: try running WinRPM.update() and retrying the install
===============================[ ERROR: LibCURL ]===============================
WARNING: backtraces on your platform are often misleading or partially incorrect
failed to download libgpg-error-lang 0 from http://download.opensuse.org/reposit
ories/windows:/mingw:/win64/openSUSE_Factory/
/noarch/mingw64-libgpg-error-lang-1.12-3.19.noarch.rpm.
at C:\Users\Maxime.julia\v0.2\LibCURL\deps\build.jl:13
================================[ BUILD ERRORS ]================================
WARNING: LibCURL had build errors.
Pkg.build(pkg)
deps/build.jl
scriptjulia> Pkg.build("LibCURL")
INFO: Building LibCURL
INFO: Packages to install: libgpg-error-lang, libgcc, libgpg-error, libgcrypt, l
ibidn-lang, libintl, libsqlite3-0, libssh2, libidn, mozilla-nss, zlib, mozilla-n
spr, libcurl
INFO: Downloading: libgpg-error-lang
INFO: Extracting: libgpg-error-lang
7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Processing archive: C:\Users\Maxime.julia\v0.2\WinRPM\cache\http%3a%2f%2fdownlo
ad.opensuse.org%2frepositories%2fwindows%3a%2fmingw%3a%2fwin64%2fopenSUSE_Factor
y%2f%0d%0a\noarch%2fmingw64-libgpg-error-lang-1.12-3.19.noarch.rpm
Extracting noarch%2fmingw64-libgpg-error-lang-1.12-3.19.noarch.cpio
Everything is Ok
Size: 243988
Compressed: 46193
7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Processing archive: C:\Users\Maxime.julia\v0.2\WinRPM\cache\http%3a%2f%2fdownlo
ad.opensuse.org%2frepositories%2fwindows%3a%2fmingw%3a%2fwin64%2fopenSUSE_Factor
y%2f%0d%0a\noarch%2fmingw64-libgpg-error-lang-1.12-3.19.noarch.cpio
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\cs\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\da\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\de\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\eo\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\fr\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\it\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\ja\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\nl\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\pl\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\ro\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\sv\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\uk\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\vi\LC_MESSAGES
libgpg-error.mo
Extracting .\usr\x86_64-w64-mingw32\sys-root\mingw\share\locale\zh_CN\LC_MESSAG
ES\libgpg-error.mo
Everything is Ok
Files: 14
Size: 241098
Compressed: 243988
INFO: Downloading: libgcc
INFO: try running WinRPM.update() and retrying the install
===============================[ ERROR: LibCURL ]===============================
failed to download libgcc 0 from http://download.opensuse.org/repositories/windo
ws:/mingw:/win64/openSUSE_Factory/
/noarch/mingw64-libgcc-4.8.3-5.6.noarch.rpm.
at C:\Users\Maxime.julia\v0.2\LibCURL\deps\build.jl:13
================================[ BUILD ERRORS ]================================
WARNING: LibCURL had build errors.
Pkg.build(pkg)
deps/build.jl
scriptAs you can see sometimes it goes further into the installation.
I had this installed before but everytime I install a new package LibCURL has to build from start.
I have to say this is very frustrating.
Caus Packages to install are : libgpg-error-lang, libgcc, libgpg-error, libgcrypt, l
ibidn-lang, libintl, libsqlite3-0, libssh2, libidn, mozilla-nss, zlib, mozilla-n
spr, libcurl
and sometime It stop for exemple at zlib (the 11th) but when I try again, the installation restart with libgpg-error-lang so from the beginning(the 1st).
When I need a new package this problem is coming back.
I have friends with the same problem in Belgium.
Thank you very much for your time, I love your work!
Running Julia 0.3.0:
julia> Pkg.add("LibCURL")
INFO: Installing BinDeps v0.3.5
INFO: Installing HTTPClient v0.1.4
INFO: Installing LibCURL v0.1.4
INFO: Installing LibExpat v0.0.4
INFO: Installing SHA v0.0.3
INFO: Installing URIParser v0.0.2
INFO: Installing URLParse v0.0.0
INFO: Installing WinRPM v0.1.2
INFO: Installing Zlib v0.1.7
INFO: Building WinRPM
WARNING: The URLParse.jl package has been deprecated in favour of JuliaWeb/URIParser.jl
https://github.com/JuliaWeb/URIParser.jl
As of Julia 0.4 this package will no longer be installable
through `Pkg.add`. Please convert your code accordingly.
WARNING: encounted invalid data while parsing repomd
Warning: error initializing module WinRPM:
"ErrorException("Error parsing document : 0"), not well-formed (invalid token), 1, 1, 1"
INFO: Downloading http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.1//repodata/repomd.xml
WARNING: encounted invalid data while parsing repomd
========================================[ ERROR: WinRPM ]========================================
"ErrorException(\"Error parsing document : 0\"), not well-formed (invalid token), 1, 1, 1"
while loading C:\home\simonp\.julia\v0.3\WinRPM\deps\build.jl, in expression starting on line 2
=================================================================================================
INFO: Building LibCURL
INFO: Updating WinRPM package list
INFO: Downloading http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.1//repodata/repomd.xml
WARNING: encounted invalid data while parsing repomd
=======================================[ ERROR: LibCURL ]========================================
"ErrorException(\"Error parsing document : 0\"), not well-formed (invalid token), 1, 1, 1"
while loading C:\home\simonp\.julia\v0.3\LibCURL\deps\build.jl, in expression starting on line 14
=================================================================================================
========================================[ BUILD ERRORS ]=========================================
WARNING: WinRPM and LibCURL had build errors.
- packages with build errors remain installed in C:\home\simonp\.julia\v0.3
Thanks in advance.
Hi @amitmurthy !
I try to get IJulia running for Julia ...
Version 0.3.0-prerelease+4095 (2014-07-09 02:16 UTC)
Commit 2b6d708 (4 days old master)
i686-w64-mingw32
While LibCURL doesn't build, Nettle can't either.
===============================[ ERROR: LibCURL ]===============================
None of the selected providers can install dependency libcurl-4
while loading C:\Documents and Settings\Administrateur\.julia\v0.3\LibCURL\deps\
build.jl, in expression starting on line 13
===============================================================================
================================[ BUILD ERRORS ]================================
WARNING: LibCURL had build errors.
- packages with build errors remain installed in C:\Documents and Settings\Admi
nistrateur\.julia\v0.3
- build a package and all its dependencies with `Pkg.build(pkg)`
- build a single package by running its `deps/build.jl` script
================================================================================
Here is deps/build.jl
From the @windows_only macro, expression starting on line 13 (@BinDeps.install)
is waiting for a dependency provided by "WinRPM"
using BinDeps
@BinDeps.setup
@windows_only begin
# note that there is a 32-bit version of libcurl.dll
# included with Git, which will not work with 64 bit Julia
libcurl = library_dependency("libcurl-4")
using WinRPM
provides(WinRPM.RPM, "libcurl", libcurl, os = :Windows)
end
@BinDeps.install
Also, there is a part of the "Pkg" functionality that is very unclear to me :
when running "Pkg.status()", and more with "Pkg.installed()", shouldn't we expect "the-real-build-status-with-individual-dependancies-resolving" of the packages instead of just release numbers ? Or : Should Julia be aware of it's extended aptitudes, or not ...
Best regards, Stan.
This issue is used to trigger TagBot; feel free to unsubscribe.
If you haven't already, you should update your TagBot.yml
to include issue comment triggers.
Please see this post on Discourse for instructions and more details.
LibPQ.jl does this really well
Here is the docs with all the codes, but there might be another list of coddes somewhere that is easier to regex into julia code
Right now we get things passed on to FTPClient.jl which result in unuseful messages like:
FTPClientError("Failed to upload /foo.bar", 0x0000003c).
But it could have been:
CURLE_PEER_FAILED_VERIFICATION (60)
The remote server's SSL certificate or SSH md5 fingerprint was deemed not OK.
I'm getting a segfault on Julia 0.4.2, tests pass, but:
_
_ _ _(_)_ | A fresh approach to technical computing
(_) | (_) (_) | Documentation: http://docs.julialang.org
_ _ _| |_ __ _ | Type "?help" for help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 0.4.2 (2015-12-06 21:47 UTC)
_/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release
|__/ | x86_64-unknown-linux-gnu
julia> Pkg.test("LibCURL")
INFO: Testing LibCURL
INFO: LibCURL tests passed
julia> using LibCURL
julia> curl = curl_easy_init()
Ptr{Union{}} @0x0000000002b8c360
julia> curl_easy_setopt(curl, CURLOPT_URL, "http://example.com")
signal (11): Segmentation fault
curl_easy_reset at /usr/lib64/libcurl.so.4 (unknown line)
unknown function (ip: 0x2c33228)
Segmentation fault (core dumped)
julia> Pkg.status()
...
- LibCURL 0.2.0+ master
...
I get this error trying to use libCURL on a Mac (64-bit).
julia> using libCURL
ERROR: cfunction: return type of write_cb does not match
in cfunction at c.jl:33
in include_from_node1 at loading.jl:91 (repeats 2 times)
in reload_path at loading.jl:114
in require at loading.jl:48
at /Users/viral/.julia/libCURL/src/HTTPC.jl:88
at /Users/viral/.julia/libCURL/src/libCURL.jl:32
Since the LibCURL library is cross compiled on a Linux instance, when it compiles the linux versions it sets the CACert location to the default location on Linux. For the other OS's (Apple, Windows, etc) it leaves the CACert location blank in the build as it does not know where to find them. This causes the other OS's to not have any CACerts to validate SSL/TLS certificates. Currently the only solution would be to supply your own cert when you are using LibCURL.jl
It seems to me that the regular get/post/put/etc. already operate asynchronously. What's the purpose of having a second method?
I see that they are returning RemoteRefs, so they do work differently, but the naming convention is a bit ambiguous.
Maybe merge these two functions into one. If you call get with a callback, the callback will fire on completion. If you call it without a callback, it behaves the way get_async currently does.
How does one use CURLOPT_SSLVERSION
with this wrapper?
curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_DEFAULT)
does not work for me since CURL_SSLVERSION_DEFAULT
is not defined. I can not find any exposed values for this option by the wrapper.
Line 21 in 8310487
this is causing the stdlib Downloader to fail when built into a standalone application, since there is no cert.pem
shipped with the application, and even it is shipped with the application this path is already fixed during the compilation.
Error Message
ERROR: Error reading ca cert file /Users/runner/hostedtoolcache/julia/1.5.3/x64/share/julia/cert.pem - mbedTLS: (-0x3E00) PK - Read/write of file failed while requesting https://julialangnightlies-s3.julialang.org/bin/mac/x64/julia-latest-mac64.dmg
Stacktrace:
[1] (::Downloads.var"#9#17"{IOStream,Base.DevNull,Nothing,Array{Pair{String,String},1},Float64,Bool,Bool,String,Bool,Bool,Int64})(::Downloads.Curl.Easy) at /Users/roger/.ion/applications/ion/bin/ion.dylib:?
[2] with_handle(::Downloads.var"#9#17"{IOStream,Base.DevNull,Nothing,Array{Pair{String,String},1},Float64,Bool,Bool,String,Bool,Bool,Int64}, ::Downloads.Curl.Easy) at /Users/roger/.ion/applications/ion/bin/ion.dylib:?
[3] arg_write(::Downloads.var"#8#16"{Base.DevNull,Nothing,Array{Pair{String,String},1},Float64,Bool,Bool,String,Bool,Bool,Int64}, ::IOStream) at /Users/roger/.ion/applications/ion/bin/ion.dylib:?
Since the Clang-generated wrapper was generated 6 years ago, newer options such as CURLOPT_UNIX_SOCKET_PATH
are missing. The constants, at least, should be regenerated.
Building LibCURL → ~/.julia/packages/LibCURL/yT2TD/deps/build.log
┌ Error: Error building LibCURL
:
│ WARNING: could not import Compat.is_windows into Main
│ ERROR: LoadError: UndefVarError: is_windows not defined
│ Stacktrace:
│ [1] top-level scope at none:0
│ [2] include at ./boot.jl:317 [inlined]
│ [3] include_relative(::Module, ::String) at ./loading.jl:1038
│ [4] include(::Module, ::String) at ./sysimg.jl:29
│ [5] include(::String) at ./client.jl:388
│ [6] top-level scope at none:0
│ in expression starting at /Users/arora/.julia/packages/LibCURL/yT2TD/deps/build.jl:6
└ @ Pkg.Operations ~/src/julia/usr/share/julia/stdlib/v1.0/Pkg/src/Operations.jl:1068
Here's the error:
julia> Pkg.test("LibCURL")
INFO: Testing LibCURL
ERROR: LoadError: error compiling curl_easy_init: could not load library "C:\Use
rs\julia\.julia\v0.5\WinRPM\deps\usr\x86_64-w64-mingw32\sys-root\mingw\bin\libcu
rl-4"
The specified module could not be found.
in include_from_node1(::String) at .\loading.jl:488
in process_options(::Base.JLOptions) at .\client.jl:262
in _start() at .\client.jl:318
while loading C:\Users\julia\.julia\v0.5\LibCURL\test\runtests.jl, in expression
starting on line 5
===============================[ ERROR: LibCURL ]===============================
failed process: Process(`'C:\Users\julia\AppData\Local\Julia-0.5.0\bin\julia' -C
x86-64 '-JC:\Users\julia\AppData\Local\Julia-0.5.0\lib\julia\sys.dll' --compile=
yes --depwarn=yes --check-bounds=yes --code-coverage=none --color=yes --compilec
ache=yes 'C:\Users\julia\.julia\v0.5\LibCURL\test\runtests.jl'`, ProcessExited(1
)) [1]
================================================================================
ERROR: LibCURL had test errors
in #test#61(::Bool, ::Function, ::Array{AbstractString,1}) at .\pkg\entry.jl:74
0
in (::Base.Pkg.Entry.#kw##test)(::Array{Any,1}, ::Base.Pkg.Entry.#test, ::Array
{AbstractString,1}) at .\<missing>:0
in (::Base.Pkg.Dir.##2#3{Array{Any,1},Base.Pkg.Entry.#test,Tuple{Array{Abstract
String,1}}})() at .\pkg\dir.jl:31
in cd(::Base.Pkg.Dir.##2#3{Array{Any,1},Base.Pkg.Entry.#test,Tuple{Array{Abstra
ctString,1}}}, ::String) at .\file.jl:48
in #cd#1(::Array{Any,1}, ::Function, ::Function, ::Array{AbstractString,1}, ::V
ararg{Array{AbstractString,1},N}) at .\pkg\dir.jl:31
in (::Base.Pkg.Dir.#kw##cd)(::Array{Any,1}, ::Base.Pkg.Dir.#cd, ::Function, ::A
rray{AbstractString,1}, ::Vararg{Array{AbstractString,1},N}) at .\<missing>:0
in #test#3(::Bool, ::Function, ::String, ::Vararg{String,N}) at .\pkg\pkg.jl:25
8
in test(::String, ::Vararg{String,N}) at .\pkg\pkg.jl:258
Julia version: 1.0.5
LibCURL: [b27032c2] LibCURL v0.5.2
julia> unsafe_string(LibCURL.curl_version())
"libcurl/7.64.1 mbedTLS/2.6.1 zlib/1.2.11"
When I use a write callback with a Channel, I always get a Channel is closed
error even though I never close the channel.
Code:
using LibCURL, Test
function curl_write_cb(curlbuf::Ptr{Cvoid}, s::Csize_t, n::Csize_t, p_ctxt::Ptr{Cvoid})::Csize_t
sz = s * n
data = Array{UInt8}(undef, sz)
ccall(:memcpy, Ptr{Cvoid}, (Ptr{Cvoid}, Ptr{Cvoid}, UInt64), data, curlbuf, sz)
ch_ref = unsafe_pointer_to_objref(p_ctxt)
GC.@preserve data ch_ref begin
put!(ch_ref[], data)
end
sz::Csize_t
end
c_curl_write_cb = @cfunction(curl_write_cb, Csize_t, (Ptr{Cvoid}, Csize_t, Csize_t, Ptr{Cvoid}))
function curl_add_headers(curl::Ptr, headers::Vector{String})
slist = Ptr{Cvoid}(0)
for header in headers
slist = curl_slist_append(slist, header)
end
return curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist)
end
function test_writeCB()
curl = curl_easy_init()
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1) # Follow HTTP redirects
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1) # Verify the peer's SSL cert
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2) # Verify the server's Common Name
curl_easy_setopt(curl, CURLOPT_SSLVERSION, 7<<16) # Try highest version up to TLS 1.3
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, 4) # Use H2 over SSL or HTTP/1.1 otherwise
curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 1) # Use TCP Fastopen
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1) # Use TCP Keepalive
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "") # Use best supported encoding (compression) method. gzip or deflate
curl_easy_setopt(curl, CURLOPT_POST, 1) # Use HTTP Post
curl_easy_setopt(curl, CURLOPT_URL, "https://postman-echo.com/post")
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1)
# We create a channel to pass data between the curl write handler and this function
databuffer = Array{UInt8}[]
ch = Channel(ctype=Array{UInt8}) do ch
push!(databuffer, take!(ch))
end
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, c_curl_write_cb)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, Ref(ch))
errorbuffer = Array{UInt8}(undef, CURL_ERROR_SIZE)
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer)
requestBody = """{"a":10,"b":[1,2,3]}"""
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, length(requestBody))
curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, requestBody)
curl_add_headers(curl, [
"Content-Type: application/json",
"Content-Length: $(length(requestBody))"
])
res = curl_easy_perform(curl)
println(length(databuffer))
println(join(map(String, databuffer), ""))
@test 0 == res
end
test_writeCB()
Output (after all the TCP and SSL stuff):
> POST /post HTTP/1.1
Host: postman-echo.com
Accept: */*
Accept-Encoding: deflate, gzip
Content-Type: application/json
Content-Length: 20
* upload completely sent off: 20 out of 20 bytes
< HTTP/1.1 200 OK
< Date: Thu, 04 Jun 2020 01:39:12 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 383
< Connection: keep-alive
< ETag: W/"17f-a0IU3ZFzsjQnxeU9NYDf8IpRn7I"
< Vary: Accept-Encoding
< set-cookie: sails.sid=s%3AKXgZGDIOUCGmkt61Dp26tyyEckbI2cBk.AeM6UJ6UjW7L9HA1jbKrM7W1rSPiyemT5Ez%2FJ%2BCodlg; Path=/; HttpOnly
<
ERROR: LoadError: InvalidStateException("Channel is closed.", :closed)
Stacktrace:
[1] check_channel_state at ./channels.jl:120 [inlined]
[2] put!(::Channel{Array{UInt8,N} where N}, ::Array{UInt8,1}) at ./channels.jl:250
[3] macro expansion at ./gcutils.jl:87 [inlined]
[4] curl_write_cb(::Ptr{Nothing}, ::UInt64, ::UInt64, ::Ptr{Nothing}) at test/runtests.jl:12
[5] curl_easy_perform at /home/ubuntu/.julia/packages/LibCURL/lWJxD/src/lC_curl_h.jl:162 [inlined]
[6] test_writeCB() at test/runtests.jl:68
[7] top-level scope at none:0
[8] include at ./boot.jl:317 [inlined]
[9] include_relative(::Module, ::String) at ./loading.jl:1044
[10] include(::Module, ::String) at ./sysimg.jl:29
[11] exec_options(::Base.JLOptions) at ./client.jl:266
[12] _start() at ./client.jl:425
in expression starting at test/runtests.jl:77
Should be done before we have a LibCURL 1.0 release
I notice LibCURL_jll.jl is outdated too, and the project file here doesn't even point to the version there.
[I just saw PHP was updated because of security issue in libcurl.]
Should this be reported at LibCURL_jll.j and/or Julia?
I can't see where the version number is otherwise, so not sure how to make a PR.
more detailed description is here.
In short this simple piece works with LibCURL v0.5.0 and fails with 0.5.1-0.5.2 on Windows. (As I understand AWS* does not use LibCURL, just initialization of LibCURL causes the failure later)
using AWSS3, AWSCore
#just initing LibCURL cause HTTP to fail
using LibCURL
aws = AWSCore.default_aws_config()
s3_list_buckets(aws)
And for reference the error I am getting
ERROR: error compiling #sslconnection#18: error compiling Type: could not load library "C:\Users\retracted_id\.julia\packages\MbedTLS\X4xar\deps\usr\bin\libmbedtls.dll"
The specified procedure could not be found.
Stacktrace:
[1] #getconnection#11(::Int64, ::Int64, ::Int64, ::Int64, ::Bool, ::Base.Iterators.Pairs{Symbol,Union{Nothing, Int64},Tuple{Symbol,Symbol},NamedTuple{(:iofunction, :verbose),Tuple{Nothing,Int64}}}, ::Function, ::Type{HTTP.ConnectionPool.Transaction{MbedTLS.SSLContext}}, ::SubString{String}, ::SubString{String}) at .\none:0
[2] (::getfield(HTTP.ConnectionPool, Symbol("#kw##getconnection")))(::NamedTuple{(:reuse_limit, :iofunction, :verbose, :require_ssl_verification),Tuple{Int64,Nothing,Int64,Bool}}, ::typeof(HTTP.ConnectionPool.getconnection), ::Type{HTTP.ConnectionPool.Transaction{MbedTLS.SSLContext}}, ::SubString{String}, ::SubString{String}) at .\none:0
[3] #request#1(::Nothing, ::Type, ::Int64, ::Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:iofunction, :verbose, :require_ssl_verification),Tuple{Nothing,Int64,Bool}}}, ::Function, ::Type{HTTP.ConnectionRequest.ConnectionPoolLayer{HTTP.StreamRequest.StreamLayer}}, ::HTTP.URIs.URI, ::HTTP.Messages.Request, ::String) at C:\Users\retracted_id\.julia\packages\HTTP\U2ZVp\src\ConnectionRequest.jl:41
[4] (::getfield(HTTP, Symbol("#kw##request")))(::NamedTuple{(:iofunction, :verbose, :require_ssl_verification),Tuple{Nothing,Int64,Bool}}, ::typeof(HTTP.request), ::Type{HTTP.ConnectionRequest.ConnectionPoolLayer{HTTP.StreamRequest.StreamLayer}}, ::HTTP.URIs.URI, ::HTTP.Messages.Request, ::String) at .\none:0
[5] #request#1(::Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:iofunction, :verbose, :require_ssl_verification),Tuple{Nothing,Int64,Bool}}}, ::Function, ::Type{HTTP.ExceptionRequest.ExceptionLayer{HTTP.ConnectionRequest.ConnectionPoolLayer{HTTP.StreamRequest.StreamLayer}}}, ::HTTP.URIs.URI, ::Vararg{Any,N} where N) at C:\Users\retracted_id\.julia\packages\HTTP\U2ZVp\src\ExceptionRequest.jl:19
[6] #request at .\none:0 [inlined]
[7] #request#1(::VersionNumber, ::String, ::Nothing, ::Nothing, ::Base.Iterators.Pairs{Symbol,Integer,Tuple{Symbol,Symbol},NamedTuple{(:verbose, :require_ssl_verification),Tuple{Int64,Bool}}}, ::Function, ::Type{HTTP.MessageRequest.MessageLayer{HTTP.ExceptionRequest.ExceptionLayer{HTTP.ConnectionRequest.ConnectionPoolLayer{HTTP.StreamRequest.StreamLayer}}}}, ::String, ::HTTP.URIs.URI, ::Array{Pair{SubString{String},SubString{String}},1}, ::String) at C:\Users\retracted_id\.julia\packages\HTTP\U2ZVp\src\MessageRequest.jl:47
[8] (::getfield(HTTP, Symbol("#kw##request")))(::NamedTuple{(:verbose, :require_ssl_verification),Tuple{Int64,Bool}}, ::typeof(HTTP.request), ::Type{HTTP.MessageRequest.MessageLayer{HTTP.ExceptionRequest.ExceptionLayer{HTTP.ConnectionRequest.ConnectionPoolLayer{HTTP.StreamRequest.StreamLayer}}}}, ::String, ::HTTP.URIs.URI, ::Array{Pair{SubString{String},SubString{String}},1}, ::String) at .\none:0
[9] http_request(::Dict{Symbol,Any}) at C:\Users\retracted_id\.julia\packages\AWSCore\BzoMV\src\http.jl:36
[10] macro expansion at C:\Users\retracted_id\.julia\packages\AWSCore\BzoMV\src\AWSCore.jl:410 [inlined]
[11] macro expansion at C:\Users\retracted_id\.julia\packages\Retry\0jMye\src\repeat_try.jl:192 [inlined]
[12] do_request(::Dict{Symbol,Any}) at C:\Users\retracted_id\.julia\packages\AWSCore\BzoMV\src\AWSCore.jl:393
[13] macro expansion at C:\Users\retracted_id\.julia\packages\AWSS3\eYu6G\src\AWSS3.jl:108 [inlined]
[14] macro expansion at C:\Users\retracted_id\.julia\packages\Retry\0jMye\src\repeat_try.jl:192 [inlined]
[15] #s3#1(::Dict{String,String}, ::String, ::Dict{String,String}, ::String, ::String, ::Bool, ::Bool, ::Function, ::Dict{Symbol,Any}, ::String, ::String) at C:\Users\retracted_id\.julia\packages\AWSS3\eYu6G\src\AWSS3.jl:82
[16] #s3 at .\none:0 [inlined] (repeats 2 times)
[17] s3_list_buckets(::Dict{Symbol,Any}) at C:\Users\retracted_id\.julia\packages\AWSS3\eYu6G\src\AWSS3.jl:463
[18] top-level scope at none:0
The LibCURL build currently contains a statement to download a repomd.xml file if it's not found in the cache. However, on some secure networks, direct file downloads like wget are blocked entirely. Would it be possible to incorporate this .xml file in to your git repository so that users can install from behind strict firewalls?
Below is a screenshot of the build errors.
The build.jl
script uses the download
function in line 20
.
I think the Base.download
function is shadowed by a version from BinaryProvider
, which does not use the proxy.
Julia Version 0.7.0-DEV.1038
Commit f77d4cfdbe* (2017-07-18 17:03 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-4510U CPU @ 2.00GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
LAPACK: libopenblas64_
LIBM: libopenlibm
LLVM: libLLVM-3.9.1 (ORCJIT, haswell)
Environment:
JULIA_EDITOR = subl
JULIA_NUM_THREADS = 4
julia> using HTTPClient.HTTPC
julia> source = "https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_Leap_42.2/repodata/repomd.xml"
julia> x = HTTPC.get(source)
ERROR: error compiling get: error compiling setup_easy_handle: could not load library "C:\Users\Mus\.julia\v0.7\WinRPM\deps\usr\x86_64-w64-mingw32\sys-root\mingw\bin\libcurl-4"
The specified module could not be found.
Couldn't these just fall under put and post? Why have post_file and put_file?
I believe (but am not entirely certain) that these warnings are coming from LibCURL... have not been able to isolate yet.
WARNING: convert{T}(p::Type{Ptr{T}},a::Array) is deprecated, use convert(p,pointer(a)) instead.
in convert at deprecated.jl:26
in exec_as_multi at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:670
in _put_post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:484
in put_post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:454
in post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:388
in post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:527
in include at ./boot.jl:245
in include_from_node1 at loading.jl:128
in process_options at ./client.jl:285
in _start at ./client.jl:354
WARNING: convert{T}(p::Type{Ptr{T}},a::Array) is deprecated, use convert(p,pointer(a)) instead.
in convert at deprecated.jl:26
in exec_as_multi at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:673
in _put_post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:484
in put_post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:454
in post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:388
in post at /home/ihnorton/.julia/v0.3/HTTPClient/src/HTTPC.jl:527
in include at ./boot.jl:245
in include_from_node1 at loading.jl:128
in process_options at ./client.jl:285
in _start at ./client.jl:354
The progress callback is supposed to indicate success by returning the special values CURL_PROGRESSFUNC_CONTINUE
. However, this is is not defined or exported by the LibCURL bindings.
I forgot to check the latest here and ran through fixing the 32 / 64 issues independently >.<
On 0.6 this causes a UndefVarError: fd_set not defined
on load. I have no idea why it works on 0.5.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.