Comments (18)
I'd say so, yes
from lwp-protocol-https.
confirm all passing!
from lwp-protocol-https.
the import from RT didn't quite work…
the original ticket said:
LWP::Protocol::https version 6.07.
LWP’s env_proxy appears to prefer HTTPS_PROXY to https_proxy, so t/https_proxy.t’s https_proxy env var setting gets ignored:
t/https_proxy.t .. 1/56 unexpected response: HTTP/1.1 403 Forbidden
Connection: close
and provided a patch (I'm attaching it)
from lwp-protocol-https.
diff -rup LWP-Protocol-https-6.07-1/t/https_proxy.t LWP-Protocol-https-6.07-0/t/https_proxy.t
--- LWP-Protocol-https-6.07-1/t/https_proxy.t 2016-06-30 03:43:17.000000000 -0700
+++ LWP-Protocol-https-6.07-0/t/https_proxy.t 2017-10-30 22:13:29.000000000 -0700
@@ -85,6 +85,7 @@ $ua{proxy_nokeepalive} = LWP::UserAgent-
SSL_ca_file => $cafile
}
);
+$ENV{HTTP_PROXY} = $ENV{HTTPS_PROXY} =
$ENV{http_proxy} = $ENV{https_proxy} = "http://foo:bar\@$saddr[0]";
$ua{proxy}->env_proxy;
$ua{proxy_nokeepalive}->env_proxy;
from lwp-protocol-https.
possibly separate: even when those env variables have empty values, they still affect the module's operation, which is a bit annoying when trying to run something without proxy, because http_proxy= https_proxy= HTTP_PROXY= HTTPS_PROXY= the_program
still tries to talk to a non-existent proxy
from lwp-protocol-https.
Looks to be related to libwww-perl/libwww-perl#230
from lwp-protocol-https.
The proposed fix is at gisle/libwww-perl#3
from lwp-protocol-https.
See also libwww-perl/libwww-perl@a87c28123254c9b38be
from lwp-protocol-https.
all of that looks very related, yes. I'm not sure how much of those fixes have been released, though.
This happens, with LWP-Protocol-https-6.09
(sometimes, randomly):
]$ HTTPS_PROXY= prove -lv t/https_proxy.t
t/https_proxy.t ..
1..56
ok 1 - noproxy http://127.0.0.1:57597/foo -> A.1@nossl
ok 2 - URL in request -> /foo
ok 3 - noproxy http://127.0.0.1:57597/bar -> A.2@nossl
ok 4 - URL in request -> /bar
ok 5 - noproxy http://127.0.0.1:37563/foo -> B.1@nossl
ok 6 - URL in request -> /foo
ok 7 - noproxy http://127.0.0.1:37563/bar -> B.2@nossl
ok 8 - URL in request -> /bar
ok 9 - noproxy http://127.0.0.1:57597/tor -> A.3@nossl
ok 10 - URL in request -> /tor
ok 11 - noproxy http://127.0.0.1:37563/tor -> B.3@nossl
ok 12 - URL in request -> /tor
ok 13 - proxy http://foo/foo -> C.1.auth@nossl
ok 14 - URL in request -> http://foo/foo
ok 15 - proxy http://foo/bar -> C.2.auth@nossl
ok 16 - URL in request -> http://foo/bar
ok 17 - proxy http://bar/foo -> C.3.auth@nossl
ok 18 - URL in request -> http://bar/foo
ok 19 - proxy http://bar/bar -> C.4.auth@nossl
ok 20 - URL in request -> http://bar/bar
ok 21 - proxy http://foo/tor -> C.5.auth@nossl
ok 22 - URL in request -> http://foo/tor
ok 23 - proxy http://bar/tor -> C.6.auth@nossl
ok 24 - URL in request -> http://bar/tor
# creating cert for direct.ssl.access
ok 25 - noproxy https://127.0.0.1:57597/foo -> [email protected]
ok 26 - URL in request -> /foo
ok 27 - noproxy https://127.0.0.1:57597/bar -> [email protected]
ok 28 - URL in request -> /bar
# creating cert for direct.ssl.access
ok 29 - noproxy https://127.0.0.1:37563/foo -> [email protected]
ok 30 - URL in request -> /foo
ok 31 - noproxy https://127.0.0.1:37563/bar -> [email protected]
ok 32 - URL in request -> /bar
ok 33 - noproxy https://127.0.0.1:57597/tor -> [email protected]
ok 34 - URL in request -> /tor
ok 35 - noproxy https://127.0.0.1:37563/tor -> [email protected]
ok 36 - URL in request -> /tor
unexpected response: 500 Can't connect to foo:443 (Name or service not known)
Content-Type: text/plain
Client-Date: Mon, 14 Dec 2020 18:16:02 GMT
Client-Warning: Internal response
Can't connect to foo:443 (Name or service not known)
Name or service not known at /home/dakkar/perl5/perlbrew/perls/perl-5.32.0/lib/site_perl/5.32.0/LWP/Protocol/http.pm line 50.
# Looks like your test exited with 22 just after 36.
Dubious, test returned 22 (wstat 5632, 0x1600)
Failed 20/56 subtests
Test Summary Report
-------------------
t/https_proxy.t (Wstat: 5632 Tests: 36 Failed: 0)
Non-zero exit status: 22
Parse errors: Bad plan. You planned 56 tests but ran 36.
Files=1, Tests=36, 1 wallclock secs ( 0.02 usr 0.01 sys + 0.20 cusr 0.02 csys = 0.25 CPU)
Result: FAIL
I see two problems:
- the hash-order / conflicting env vars as noted in the other issues/PRs
- an empty env variable is not ignored, but I think it should
from lwp-protocol-https.
@dakkar are you able to test if the random failures disappear with gisle/libwww-perl#3?
from lwp-protocol-https.
Something is different.
I checked out https://github.com/demerphq/libwww-perl at that commit, then:
$ HTTP_PROXY= HTTPS_PROXY= PERL5LIB=/tmp/libwww-perl/lib prove -lv t/https_proxy.t
t/https_proxy.t ..
1..56
ok 1 - noproxy http://127.0.0.1:48887/foo -> A.1@nossl
ok 2 - URL in request -> /foo
ok 3 - noproxy http://127.0.0.1:48887/bar -> A.2@nossl
ok 4 - URL in request -> /bar
ok 5 - noproxy http://127.0.0.1:47551/foo -> B.1@nossl
ok 6 - URL in request -> /foo
ok 7 - noproxy http://127.0.0.1:47551/bar -> B.2@nossl
ok 8 - URL in request -> /bar
ok 9 - noproxy http://127.0.0.1:48887/tor -> A.3@nossl
ok 10 - URL in request -> /tor
ok 11 - noproxy http://127.0.0.1:47551/tor -> B.3@nossl
ok 12 - URL in request -> /tor
ok 13 - proxy http://foo/foo -> C.1.auth@nossl
ok 14 - URL in request -> http://foo/foo
ok 15 - proxy http://foo/bar -> C.2.auth@nossl
ok 16 - URL in request -> http://foo/bar
ok 17 - proxy http://bar/foo -> C.3.auth@nossl
ok 18 - URL in request -> http://bar/foo
ok 19 - proxy http://bar/bar -> C.4.auth@nossl
ok 20 - URL in request -> http://bar/bar
ok 21 - proxy http://foo/tor -> C.5.auth@nossl
ok 22 - URL in request -> http://foo/tor
ok 23 - proxy http://bar/tor -> C.6.auth@nossl
ok 24 - URL in request -> http://bar/tor
# creating cert for direct.ssl.access
ok 25 - noproxy https://127.0.0.1:48887/foo -> [email protected]
ok 26 - URL in request -> /foo
ok 27 - noproxy https://127.0.0.1:48887/bar -> [email protected]
ok 28 - URL in request -> /bar
# creating cert for direct.ssl.access
ok 29 - noproxy https://127.0.0.1:47551/foo -> [email protected]
ok 30 - URL in request -> /foo
ok 31 - noproxy https://127.0.0.1:47551/bar -> [email protected]
ok 32 - URL in request -> /bar
ok 33 - noproxy https://127.0.0.1:48887/tor -> [email protected]
ok 34 - URL in request -> /tor
ok 35 - noproxy https://127.0.0.1:47551/tor -> [email protected]
ok 36 - URL in request -> /tor
not ok 37 - proxy https://foo/foo -> C.8.Tauth@foo
# Failed test 'proxy https://foo/foo -> C.8.Tauth@foo'
# at t/https_proxy.t line 182.
# got: 'C.7.auth@nossl'
# expected: 'C.8.Tauth@foo'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 181
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 7
#
# ID: 3.7.auth@nossl
# ---------
# GET https://foo/foo HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE
# Host: foo
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 38 - URL in request -> /foo
# Failed test 'URL in request -> /foo'
# at t/https_proxy.t line 190.
# got: 'https://foo/foo'
# expected: '/foo'
not ok 39 - proxy https://foo/bar -> C.9.Tauth@foo
# Failed test 'proxy https://foo/bar -> C.9.Tauth@foo'
# at t/https_proxy.t line 182.
# got: 'C.8.auth@nossl'
# expected: 'C.9.Tauth@foo'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 181
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 8
#
# ID: 3.8.auth@nossl
# ---------
# GET https://foo/bar HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE
# Host: foo
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 40 - URL in request -> /bar
# Failed test 'URL in request -> /bar'
# at t/https_proxy.t line 190.
# got: 'https://foo/bar'
# expected: '/bar'
not ok 41 - proxy https://bar/foo -> F.2.Tauth@bar
# Failed test 'proxy https://bar/foo -> F.2.Tauth@bar'
# at t/https_proxy.t line 182.
# got: 'C.9.auth@nossl'
# expected: 'F.2.Tauth@bar'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 181
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 9
#
# ID: 3.9.auth@nossl
# ---------
# GET https://bar/foo HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE
# Host: bar
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 42 - URL in request -> /foo
# Failed test 'URL in request -> /foo'
# at t/https_proxy.t line 190.
# got: 'https://bar/foo'
# expected: '/foo'
not ok 43 - proxy https://bar/bar -> F.3.Tauth@bar
# Failed test 'proxy https://bar/bar -> F.3.Tauth@bar'
# at t/https_proxy.t line 182.
# got: 'C.10.auth@nossl'
# expected: 'F.3.Tauth@bar'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 182
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 10
#
# ID: 3.10.auth@nossl
# ---------
# GET https://bar/bar HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE
# Host: bar
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 44 - URL in request -> /bar
# Failed test 'URL in request -> /bar'
# at t/https_proxy.t line 190.
# got: 'https://bar/bar'
# expected: '/bar'
not ok 45 - proxy https://foo/tor -> C.10.Tauth@foo
# Failed test 'proxy https://foo/tor -> C.10.Tauth@foo'
# at t/https_proxy.t line 182.
# got: 'C.11.auth@nossl'
# expected: 'C.10.Tauth@foo'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 182
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 11
#
# ID: 3.11.auth@nossl
# ---------
# GET https://foo/tor HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE
# Host: foo
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 46 - URL in request -> /tor
# Failed test 'URL in request -> /tor'
# at t/https_proxy.t line 190.
# got: 'https://foo/tor'
# expected: '/tor'
not ok 47 - proxy https://bar/tor -> F.4.Tauth@bar
# Failed test 'proxy https://bar/tor -> F.4.Tauth@bar'
# at t/https_proxy.t line 182.
# got: 'C.12.auth@nossl'
# expected: 'F.4.Tauth@bar'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 182
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 12
#
# ID: 3.12.auth@nossl
# ---------
# GET https://bar/tor HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE
# Host: bar
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 48 - URL in request -> /tor
# Failed test 'URL in request -> /tor'
# at t/https_proxy.t line 190.
# got: 'https://bar/tor'
# expected: '/tor'
not ok 49 - proxy_nokeepalive https://foo/foo -> H.2.Tauth@foo
# Failed test 'proxy_nokeepalive https://foo/foo -> H.2.Tauth@foo'
# at t/https_proxy.t line 182.
# got: 'H.1.auth@nossl'
# expected: 'H.2.Tauth@foo'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 188
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 1
#
# ID: 6.1.auth@nossl
# ---------
# GET https://foo/foo HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE, close
# Host: foo
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 50 - URL in request -> /foo
# Failed test 'URL in request -> /foo'
# at t/https_proxy.t line 190.
# got: 'https://foo/foo'
# expected: '/foo'
not ok 51 - proxy_nokeepalive https://foo/bar -> I.2.Tauth@foo
# Failed test 'proxy_nokeepalive https://foo/bar -> I.2.Tauth@foo'
# at t/https_proxy.t line 182.
# got: 'I.1.auth@nossl'
# expected: 'I.2.Tauth@foo'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 188
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 1
#
# ID: 7.1.auth@nossl
# ---------
# GET https://foo/bar HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE, close
# Host: foo
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 52 - URL in request -> /bar
# Failed test 'URL in request -> /bar'
# at t/https_proxy.t line 190.
# got: 'https://foo/bar'
# expected: '/bar'
not ok 53 - proxy_nokeepalive https://bar/foo -> J.2.Tauth@bar
# Failed test 'proxy_nokeepalive https://bar/foo -> J.2.Tauth@bar'
# at t/https_proxy.t line 182.
# got: 'J.1.auth@nossl'
# expected: 'J.2.Tauth@bar'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 188
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 1
#
# ID: 8.1.auth@nossl
# ---------
# GET https://bar/foo HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE, close
# Host: bar
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 54 - URL in request -> /foo
# Failed test 'URL in request -> /foo'
# at t/https_proxy.t line 190.
# got: 'https://bar/foo'
# expected: '/foo'
not ok 55 - proxy_nokeepalive https://bar/bar -> K.2.Tauth@bar
# Failed test 'proxy_nokeepalive https://bar/bar -> K.2.Tauth@bar'
# at t/https_proxy.t line 182.
# got: 'K.1.auth@nossl'
# expected: 'K.2.Tauth@bar'
# HTTP/1.1 200 ok
# Connection: keep-alive
# Content-Length: 188
# Content-Type: text/plain
# Client-Date: Mon, 14 Dec 2020 19:15:56 GMT
# Client-Peer: 127.0.0.1:48887
# Client-Response-Num: 1
#
# ID: 9.1.auth@nossl
# ---------
# GET https://bar/bar HTTP/1.1
# TE: deflate,gzip;q=0.3
# Connection: TE, close
# Host: bar
# Proxy-Authorization: Basic Zm9vOmJhcg==
# User-Agent: libwww-perl/6.05
not ok 56 - URL in request -> /bar
# Failed test 'URL in request -> /bar'
# at t/https_proxy.t line 190.
# got: 'https://bar/bar'
# expected: '/bar'
# Looks like you failed 20 tests of 56.
Dubious, test returned 20 (wstat 5120, 0x1400)
Failed 20/56 subtests
Test Summary Report
-------------------
t/https_proxy.t (Wstat: 5120 Tests: 56 Failed: 20)
Failed tests: 37-56
Non-zero exit status: 20
Files=1, Tests=56, 0 wallclock secs ( 0.04 usr 0.00 sys + 0.27 cusr 0.02 csys = 0.33 CPU)
Result: FAIL
from lwp-protocol-https.
oh, should have added: setting HTTP_PROXY
and HTTPS_PROXY
to empty strings, or not setting them at all, produces the same test result.
But:
$ HTTP_PROXY=a HTTPS_PROXY=b PERL5LIB=/tmp/libwww-perl/lib prove -lv t/https_proxy.t
t/https_proxy.t .. Proxy must be specified as absolute URI; 'b' is not at t/https_proxy.t line 89.
and
$ HTTP_PROXY=http://localhost HTTPS_PROXY=https://localhost PERL5LIB=/tmp/libwww-perl/lib prove -lv t/https_proxy.t
t/https_proxy.t .. Environment contains multiple differing definitions for 'http_proxy'.
Using value from 'HTTP_PROXY' (http://localhost) and ignoring 'http_proxy' (http://foo:[email protected]:36237) at /tmp/libwww-perl/lib/LWP/UserAgent.pm line 1017.
Environment contains multiple differing definitions for 'https_proxy'.
Using value from 'HTTPS_PROXY' (https://localhost) and ignoring 'https_proxy' (http://foo:[email protected]:36237) at /tmp/libwww-perl/lib/LWP/UserAgent.pm line 1017.
Environment contains multiple differing definitions for 'http_proxy'.
Using value from 'HTTP_PROXY' (http://localhost) and ignoring 'http_proxy' (http://foo:[email protected]:36237) at /tmp/libwww-perl/lib/LWP/UserAgent.pm line 1017.
Environment contains multiple differing definitions for 'https_proxy'.
Using value from 'HTTPS_PROXY' (https://localhost) and ignoring 'https_proxy' (http://foo:[email protected]:36237) at /tmp/libwww-perl/lib/LWP/UserAgent.pm line 1017.
1..56
ok 1 - noproxy http://127.0.0.1:36237/foo -> A.1@nossl
ok 2 - URL in request -> /foo
ok 3 - noproxy http://127.0.0.1:36237/bar -> A.2@nossl
ok 4 - URL in request -> /bar
ok 5 - noproxy http://127.0.0.1:38743/foo -> B.1@nossl
ok 6 - URL in request -> /foo
ok 7 - noproxy http://127.0.0.1:38743/bar -> B.2@nossl
ok 8 - URL in request -> /bar
ok 9 - noproxy http://127.0.0.1:36237/tor -> A.3@nossl
ok 10 - URL in request -> /tor
ok 11 - noproxy http://127.0.0.1:38743/tor -> B.3@nossl
ok 12 - URL in request -> /tor
unexpected response: 500 Can't connect to localhost:80
Content-Type: text/plain
Client-Date: Mon, 14 Dec 2020 19:36:47 GMT
Client-Warning: Internal response
Can't connect to localhost:80
Connection refused at /tmp/libwww-perl/lib/LWP/Protocol/http.pm line 51.
# Looks like your test exited with 111 just after 12.
Dubious, test returned 111 (wstat 28416, 0x6f00)
Failed 44/56 subtests
Test Summary Report
-------------------
t/https_proxy.t (Wstat: 28416 Tests: 12 Failed: 0)
Non-zero exit status: 111
Parse errors: Bad plan. You planned 56 tests but ran 12.
Files=1, Tests=12, 0 wallclock secs ( 0.03 usr 0.00 sys + 0.26 cusr 0.01 csys = 0.30 CPU)
Result: FAIL
reliably
from lwp-protocol-https.
Thanks @dakkar! That's helpful information. Maybe the first step would be getting that PR to work with the latest version of libwww-perl?
from lwp-protocol-https.
Ok, I'll take a quick look at it now.
from lwp-protocol-https.
Rebased PR is at libwww-perl/libwww-perl#355
from lwp-protocol-https.
@dakkar the PR above has now been merged. Can you try HTTP_PROXY= HTTPS_PROXY= PERL5LIB=/tmp/libwww-perl/lib prove -lv t/https_proxy.t
again using the updated repository? On my system the tests are passing.
from lwp-protocol-https.
notice though, that HTTP_PROXY=http://localhost HTTPS_PROXY=http://localhost PERL5LIB=/tmp/libwww-perl/lib prove -l t/https_proxy.t
still fails: the test should set/clear those env vars
from lwp-protocol-https.
@dakkar are you able to put together a pull request for this?
from lwp-protocol-https.
Related Issues (20)
- apache.t fails due to firewall [rt.cpan.org #85957] HOT 1
- tests passes when prereq IO::Socket::SSL not met [rt.cpan.org #88594] HOT 1
- TODO for next release: include openssl diagnostics [rt.cpan.org #105870] HOT 2
- LWP::Protocol::https/_check_sock() has insufficient certificate checking [rt.cpan.org #43733]
- Old Bug, Revisited: Peer certificate not verified [rt.cpan.org #61340] HOT 1
- Crypt::SSLeay should work transparently with Mozilla::CA [rt.cpan.org #66561] HOT 1
- HTTPS authentication error hangs instead of returning authentication error. Fix included. [rt.cpan.org #66657]
- t/apache.t fails: connection refused [rt.cpan.org #67001] HOT 1
- X-Died header appears in apache.t [rt.cpan.org #91653]
- debian squeeze - perl update - error cpan LWP::Protocol::https [rt.cpan.org #105889] HOT 1
- LWP::Protocol::https discards 0 value for SSL_VERIFY_mode [rt.cpan.org #111517] HOT 5
- Proxy test failures HOT 1
- [PRC] How may I be of help HOT 3
- https_proxy.t hangs on perl 5.27.8, Windows HOT 2
- tests failed on install with cpanm HOT 4
- Test 'https_proxy.t' fails on windows 10 HOT 1
- Unable to install on MacOS 12.1 with perl 5.34 HOT 1
- Unable to install this in Ubuntu 20.04 HOT 3
- t/apache.t fails when apache.org changes content HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from lwp-protocol-https.