Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dart pub get on a VM gives TLS error #4448

Open
samirbilalmemon opened this issue Nov 29, 2024 · 23 comments
Open

dart pub get on a VM gives TLS error #4448

samirbilalmemon opened this issue Nov 29, 2024 · 23 comments

Comments

@samirbilalmemon
Copy link

Environment

  • Dart version (run dart --version): 3.5.3 from pacman -Sy dart
  • OS kind and version (e.g. "Windows 10, version 1809" or "macOS 12.4"):
    Arch Linux ARM64
    Linux 6.12.1-1-aarch64-ARCH
  • Are you using the Chinese community mirror or a corporate firewall? No I am not
  • Hardware: iPhone running VM on UTM SE app from AppStore.

Problem

Running dart pub get results in a TLS error. However running openssl and curl commands with detailed output result in no TLS errors. Able to download as well using wget without error. It’s a mystery why dart pub get doesn’t work even though all other commands do.

I have provided the outputs to curl -v, openssl s_client -connect and dart pub get below. If needed I can attach output of working wget to download a package too.

curl -v https://pub.dev


  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host pub.dev:443 was resolved.
* IPv6: 2600:1901:0:382a::
* IPv4: 34.36.0.14

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying [2600:1901:0:382a::]:443...
* connect to 2600:1901:0:382a:: port 443 from fec0::749a:90ff:fe11:bc97 port 60324 failed: No route to host
*   Trying 34.36.0.14:443...
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none

  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [15 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [4009 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=pub.dev
*  start date: Oct 27 13:18:38 2024 GMT
*  expire date: Jan 25 14:12:11 2025 GMT
*  subjectAltName: host "pub.dev" matched cert's "pub.dev"
*  issuer: C=US; O=Google Trust Services; CN=WR3
*  SSL certificate verify ok.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha384WithRSAEncryption
* Connected to pub.dev (34.36.0.14) port 443
* using HTTP/2

  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0* [HTTP/2] [1] OPENED stream for https://pub.dev/
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: pub.dev]
* [HTTP/2] [1] [:path: /]
* [HTTP/2] [1] [user-agent: curl/8.11.0]
* [HTTP/2] [1] [accept: */*]
} [5 bytes data]
> GET / HTTP/2
> Host: pub.dev
> User-Agent: curl/8.11.0
> Accept: */*
> 
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [284 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [284 bytes data]
* Request completely sent off
{ [5 bytes data]
< HTTP/2 200 
< date: Fri, 29 Nov 2024 07:50:59 GMT
< content-type: text/html; charset="utf-8"
< content-length: 32356
< vary: Accept-Encoding
< x-powered-by: Dart with package:shelf
< cache-control: no-store, no-cache, must-revalidate
< strict-transport-security: max-age=31536000; preload
< referrer-policy: no-referrer-when-downgrade
< x-frame-options: deny
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< content-security-policy: default-src 'self' https:;font-src 'self' data: https://fonts.googleapis.com/ https://fonts.gstatic.com/;img-src 'self' https: data:;manifest-src 'none';object-src 'none';script-src 'self' https://tagmanager.google.com https://www.googletagmanager.com/ https://www.google.com/ https://www.google-analytics.com/ https://ssl.google-analytics.com https://adservice.google.com/ https://ajax.googleapis.com/ https://apis.google.com/ https://unpkg.com/ https://www.gstatic.com/ https://gstatic.com https://accounts.google.com/gsi/client;style-src 'self' https://unpkg.com/ https://pub.dartlang.org/static/ 'unsafe-inline' https://fonts.googleapis.com/ https://gstatic.com https://www.gstatic.com/ https://tagmanager.google.com https://accounts.google.com/gsi/style
< expires: Fri, 29 Nov 2024 07:45:59 GMT
< x-appengine-flex-applatency: 0.004
< via: 1.1 google
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< 
{ [5 bytes data]
<!DOCTYPE html> And then all the html stuff and html tags of the website.

openssl s_client -connect pub.dev:443


Connecting to 34.36.0.14
depth=2 C=US, O=Google Trust Services LLC, CN=GTS Root R1
verify return:1
depth=1 C=US, O=Google Trust Services, CN=WR3
verify return:1
depth=0 CN=pub.dev
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:CN=pub.dev
   i:C=US, O=Google Trust Services, CN=WR3
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Oct 27 13:18:38 2024 GMT; NotAfter: Jan 25 14:12:11 2025 GMT
 1 s:C=US, O=Google Trust Services, CN=WR3
   i:C=US, O=Google Trust Services LLC, CN=GTS Root R1
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Dec 13 09:00:00 2023 GMT; NotAfter: Feb 20 14:00:00 2029 GMT
 2 s:C=US, O=Google Trust Services LLC, CN=GTS Root R1
   i:C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
   a:PKEY: rsaEncryption, 4096 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jun 19 00:00:42 2020 GMT; NotAfter: Jan 28 00:00:42 2028 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFGTCCBAGgAwIBAgIRAK8KWDPTgADxCbeHqt0JbAEwDQYJKoZIhvcNAQELBQAw
OzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczEM
MAoGA1UEAxMDV1IzMB4XDTI0MTAyNzEzMTgzOFoXDTI1MDEyNTE0MTIxMVowEjEQ
MA4GA1UEAxMHcHViLmRldjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALEUu7YQz3amtTx5Wqrb7ReCrHYoDWYyOPLkYSbFyX1pJnCMKTwUub2kp0N1cqjp
r9EDKlFTQi5vvPi3YbAgj555PzevtqVMgoGwGN9L7/wg32Y2BdL70SG5YeRX07Jt
3vq/0Fuwu/Rpg2ovqsBRgL2gXgrK6qX85uOw4dQyNsd9ZlihnRnIYZf0Ra32GcUl
xkHYF8Ve5Or4ILNhk7/k4CbWd8d8b43uU1vdPKa5OL7wEl2JL7f29X5dCKlmr2HO
1S8pYU7Blb/ck3LEWx6Qzl+Q9T2Mqx3Do2CDDGnhvAsnA1FqDThIWaRgK4PJogu1
MwzP7oW48Sqf6WaTeqSvc+cCAwEAAaOCAj8wggI7MA4GA1UdDwEB/wQEAwIFoDAT
BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBT7caqC
m4RU6sQ9A5n+hZgyKiym0DAfBgNVHSMEGDAWgBTHgfX9jojZADxNY6JQMSSgziP+
IzBeBggrBgEFBQcBAQRSMFAwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vLnBraS5nb29n
L3Mvd3IzL3J3bzAlBggrBgEFBQcwAoYZaHR0cDovL2kucGtpLmdvb2cvd3IzLmNy
dDASBgNVHREECzAJggdwdWIuZGV2MBMGA1UdIAQMMAowCAYGZ4EMAQIBMDYGA1Ud
HwQvMC0wK6ApoCeGJWh0dHA6Ly9jLnBraS5nb29nL3dyMy81bVdZOUdrUXhldy5j
cmwwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdgDPEVbu1S58r/OHW9lpLpvpGnFn
SrAX7KwB0lt3zsw7CAAAAZLOV+JtAAAEAwBHMEUCIQCjBw+e2mLbft/XesJDpQQJ
OFlmfnpDm8MXyItOpUOTYwIgYlUGMocLhfBjCUGys+5onUU8ruCG+Z2+8IauefwF
JKMAdQDM+w9qhXEJZf6Vm1PO6bJ8IumFXA2XjbapflTA/kwNsAAAAZLOV+J0AAAE
AwBGMEQCIA3ZmRQDekSRZUlTh+mLuqBwGCg4LrbO5zarEcEnPn21AiBjytx+kFCx
qoSX0CMmxPIk0vkSk/EuTEpbVw3wk0NlSDANBgkqhkiG9w0BAQsFAAOCAQEADzI7
H8HWO0YzvKL2J9hsa1Xri3zybieDhxrCyLYhnhpy/a0pVf+GToDgmzy3uR5ifH5o
+qX2mN3Q/9AvL2hxh295GSh+GQiEQB0cCdQSxl4H64tyKbLnLULUrfk0Ga4mzE4C
7vRHWAVKAgy+LMHYXQyRFOeXienzDJEtQo1o3KLVREwwsocB8BUkYgrG7vwKk6Tg
+FdrJxdDz1DRPkslcdw91XXMHVjuc2lLNJGFgHrCRXgVDSi8wQw28m6rVtG4AFlZ
ATMnUnV6uIEBoipE+WLegmgxQtmLG3Z+buzgxprJSJEjJxn6TEuE/FaQPr/avVUJ
IMbHcvHGQbAszJXs5Q==
-----END CERTIFICATE-----
subject=CN=pub.dev
issuer=C=US, O=Google Trust Services, CN=WR3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4486 bytes and written 398 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Protocol: TLSv1.3
Server public key is 2048 bit
This TLS version forbids renegotiation.
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

pub_log.txt


Pub version: 3.5.3
Created: 2024-11-29T11:32:40.951052
FLUTTER_ROOT: <not set>
PUB_HOSTED_URL: <not set>
PUB_CACHE: "<not set>"
Command: dart pub get --verbose
Platform: linux

---- /root/project/pubspec.yaml ----
name: project
description: A sample command-line application.
version: 1.0.0
# repository: https://github.com/my_org/my_repo

environment:
  sdk: ^3.5.3

# Add regular dependencies here.
dependencies:
  # path: ^1.8.0

dev_dependencies:
  lints: ^4.0.0
  test: ^1.24.0

---- End pubspec.yaml ----
<No pubspec.lock>
---- Log transcript ----
FINE: Pub 3.5.3
MSG : Resolving dependencies...
SLVR: fact: project is 1.0.0
SLVR: derived: project
SLVR: fact: project depends on lints ^4.0.0
SLVR: fact: project depends on test ^1.24.0
SLVR:   selecting project
SLVR:   derived: test ^1.24.0
SLVR:   derived: lints ^4.0.0
IO  : Get versions from https://pub.dev/api/packages/lints.
IO  : Get versions from https://pub.dev/api/packages/test.
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : Attempt #2 for fetching versions for "lints" from "https://pub.dev/api/packages/lints"
IO  : Attempt #2 for fetching versions for "test" from "https://pub.dev/api/packages/test"
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : Attempt #3 for fetching versions for "lints" from "https://pub.dev/api/packages/lints"
IO  : Attempt #3 for fetching versions for "test" from "https://pub.dev/api/packages/test"
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : Attempt #4 for fetching versions for "lints" from "https://pub.dev/api/packages/lints"
IO  : Attempt #4 for fetching versions for "test" from "https://pub.dev/api/packages/test"
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : Attempt #5 for fetching versions for "lints" from "https://pub.dev/api/packages/lints"
IO  : Attempt #5 for fetching versions for "test" from "https://pub.dev/api/packages/test"
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : Attempt #6 for fetching versions for "lints" from "https://pub.dev/api/packages/lints"
IO  : Attempt #6 for fetching versions for "test" from "https://pub.dev/api/packages/test"
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : Attempt #7 for fetching versions for "test" from "https://pub.dev/api/packages/test"
IO  : Attempt #7 for fetching versions for "lints" from "https://pub.dev/api/packages/lints"
IO  : HTTP GET https://pub.dev/api/packages/test
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
IO  : HTTP GET https://pub.dev/api/packages/lints
    | Accept: application/vnd.pub.v2+json
    | X-Pub-OS: linux
    | X-Pub-Command: get
    | X-Pub-Session-ID: 9121A4AE-F835-4E20-86A3-F4EE7252A818
    | X-Pub-Reason: dev
    | user-agent: Dart pub 3.5.3
SLVR: Version solving took 0:00:41.481562 seconds.
    | Tried 1 solutions.
FINE: Resolving dependencies finished (43.410s).
ERR : Got TLS error trying to find package test at https://pub.dev.
FINE: Exception type: WrappedException
FINE: package:pub/src/utils.dart 573:5                      fail
    | package:pub/src/source/hosted.dart 1692:7             HostedSource._throwFriendlyError
    | package:pub/src/source/hosted.dart 499:7              HostedSource._fetchVersionsNoPrefetching
    | ===== asynchronous gap ===========================
    | dart:async                                            Future.catchError
    | package:pub/src/utils.dart 139:10                     captureErrors.wrappedCallback
    | package:stack_trace                                   Chain.capture
    | package:pub/src/utils.dart 154:11                     captureErrors
    | package:pub/src/command.dart 196:13                   PubCommand.run
    | package:args/command_runner.dart 212:27               CommandRunner.runCommand
    | package:dartdev/dartdev.dart 236:30                   DartdevRunner.runCommand
    | package:args/command_runner.dart 122:25               CommandRunner.run.<fn>
    | dart:async                                            new Future.sync
    | package:args/command_runner.dart 122:14               CommandRunner.run
    | package:dartdev/dartdev.dart 47:29                    runDartdev
    | /b/s/w/ir/x/w/sdk/pkg/dartdev/bin/dartdev.dart 13:11  main
FINE: Wrapped exception: HandshakeException: Handshake error in client (OS Error: 
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:393))
    | dart:io-patch/secure_socket_patch.dart 99:46                  _SecureFilterImpl._handshake
    | dart:io-patch/secure_socket_patch.dart 143:25                 _SecureFilterImpl.handshake
    | dart:io/secure_socket.dart 920:54                             _RawSecureSocket._secureHandshake
    | dart:io/secure_socket.dart 1049:19                            _RawSecureSocket._tryFilter
    | ===== asynchronous gap ===========================
    | dart:async/future_impl.dart 20:44                             _Completer.completeError
    | dart:io/secure_socket.dart 886:26                             _RawSecureSocket._reportError
    | dart:io/secure_socket.dart 931:7                              _RawSecureSocket._secureHandshake
    | dart:io/secure_socket.dart 1049:19                            _RawSecureSocket._tryFilter
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | dart:io/secure_socket.dart 1006:25                            _RawSecureSocket._tryFilter
    | dart:io/secure_socket.dart 991:12                             _RawSecureSocket._scheduleFilter
    | dart:io/secure_socket.dart 865:5                              _RawSecureSocket._readHandler
    | dart:io/secure_socket.dart 852:9                              _RawSecureSocket._eventDispatcher
    | package:stack_trace/src/stack_zone_specification.dart 127:36  StackZoneSpecification._registerUnaryCallback.<fn>.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 207:15  StackZoneSpecification._run
    | package:stack_trace/src/stack_zone_specification.dart 127:24  StackZoneSpecification._registerUnaryCallback.<fn>
    | dart:async/zone.dart 1415:13                                  _rootRunUnary
    | dart:async/zone.dart 1308:19                                  _CustomZone.runUnary
    | dart:async/zone.dart 1217:7                                   _CustomZone.runUnaryGuarded
    | dart:async/stream_impl.dart 365:11                            _BufferingStreamSubscription._sendData
    | dart:async/stream_impl.dart 297:7                             _BufferingStreamSubscription._add
    | dart:async/stream_controller.dart 784:19                      _SyncStreamControllerDispatch._sendData
    | dart:async/stream_controller.dart 658:7                       _StreamController._add
    | dart:async/stream_controller.dart 606:5                       _StreamController.add
    | dart:io-patch/socket_patch.dart 1942:33                       new _RawSocket.<fn>
    | dart:io-patch/socket_patch.dart 1385:14                       _NativeSocket.issueReadEvent.issue
    | dart:async/schedule_microtask.dart 40:21                      _microtaskLoop
    | dart:async/schedule_microtask.dart 49:5                       _startMicrotaskLoop
    | dart:isolate-patch/isolate_patch.dart 118:13                  _runPendingImmediateCallback
    | dart:isolate-patch/isolate_patch.dart 185:5                   _RawReceivePort._handleMessage
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | dart:async/stream_impl.dart 154:17                            _BufferingStreamSubscription._registerDataHandler
    | dart:async/stream_impl.dart 128:19                            new _BufferingStreamSubscription.zoned
    | dart:async/stream_impl.dart 122:14                            new _BufferingStreamSubscription
    | dart:async/stream_controller.dart 857:9                       new _ControllerSubscription
    | dart:async/stream_controller.dart 688:47                      _StreamController._subscribe
    | dart:async/stream_controller.dart 837:19                      _ControllerStream._createSubscription
    | dart:async/stream_impl.dart 497:9                             _StreamImpl.listen
    | dart:io-patch/socket_patch.dart 1982:31                       _RawSocket.listen
    | dart:io/secure_socket.dart 630:37                             new _RawSecureSocket
    | dart:io/secure_socket.dart 564:16                             _RawSecureSocket.connect
    | dart:io/secure_socket.dart 373:29                             RawSecureSocket.secure
    | dart:io/secure_socket.dart 302:16                             RawSecureSocket.startConnect.<fn>.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 127:36  StackZoneSpecification._registerUnaryCallback.<fn>.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 207:15  StackZoneSpecification._run
    | package:stack_trace/src/stack_zone_specification.dart 127:24  StackZoneSpecification._registerUnaryCallback.<fn>
    | dart:async/zone.dart 1407:47                                  _rootRunUnary
    | dart:async/zone.dart 1308:19                                  _CustomZone.runUnary
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | dart:async/future_impl.dart 335:23                            Future.then
    | dart:io/secure_socket.dart 301:56                             RawSecureSocket.startConnect.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 127:36  StackZoneSpecification._registerUnaryCallback.<fn>.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 207:15  StackZoneSpecification._run
    | package:stack_trace/src/stack_zone_specification.dart 127:24  StackZoneSpecification._registerUnaryCallback.<fn>
    | dart:async/zone.dart 1407:47                                  _rootRunUnary
    | dart:async/zone.dart 1308:19                                  _CustomZone.runUnary
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | dart:async/future_impl.dart 335:23                            Future.then
    | dart:io/secure_socket.dart 300:10                             RawSecureSocket.startConnect
    | dart:io/secure_socket.dart 77:28                              SecureSocket.startConnect
    | dart:_http/http_impl.dart 2487:26                             _ConnectionTarget.connect
    | dart:_http/http_impl.dart 2930:12                             _HttpClient._getConnection.connect
    | dart:_http/http_impl.dart 2935:12                             _HttpClient._getConnection
    | dart:_http/http_impl.dart 2790:12                             _HttpClient._openUrl
    | dart:_http/http_impl.dart 2627:7                              _HttpClient.openUrl
    | package:http/src/io_client.dart 117:38                        IOClient.send
    | package:pub/src/http.dart 76:39                               _PubHttpClient.send
    | package:pub/src/authentication/client.dart 52:35              _AuthenticatedClient.send
    | package:pub/src/http.dart 435:36                              RequestSending.fetch
    | package:pub/src/source/hosted.dart 483:41                     HostedSource._fetchVersionsNoPrefetching.<fn>.<fn>
    | package:pub/src/http.dart 365:66                              retryForHttp.<fn>.<fn>
    | package:pool/pool.dart 127:28                                 Pool.withResource
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | package:pool/pool.dart 125:20                                 Pool.withResource
    | package:pub/src/http.dart 365:33                              retryForHttp.<fn>
    | package:pub/src/utils.dart 749:22                             retry
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | package:pub/src/utils.dart 749:14                             retry
    | package:pub/src/http.dart 364:16                              retryForHttp
    | package:pub/src/source/hosted.dart 478:22                     HostedSource._fetchVersionsNoPrefetching.<fn>
    | package:pub/src/authentication/client.dart 127:20             withAuthenticatedClient
    | package:pub/src/source/hosted.dart 476:24                     HostedSource._fetchVersionsNoPrefetching
    | package:pub/src/source/hosted.dart 548:26                     HostedSource._fetchVersions
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | package:pub/src/source/hosted.dart 544:9                      HostedSource._fetchVersions
    | dart:async/zone.dart 1415:13                                  _rootRunUnary
    | dart:async/zone.dart 1308:19                                  _CustomZone.runUnary
    | package:pub/src/rate_limited_scheduler.dart 86:27             RateLimitedScheduler._processNextTask.runJob
    | package:pub/src/rate_limited_scheduler.dart 89:24             RateLimitedScheduler._processNextTask
    | package:pool/pool.dart 127:28                                 Pool.withResource
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | package:pool/pool.dart 125:20                                 Pool.withResource
    | package:pub/src/rate_limited_scheduler.dart 135:37            RateLimitedScheduler.schedule.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 207:15  StackZoneSpecification._run
    | package:stack_trace/src/stack_zone_specification.dart 114:48  StackZoneSpecification._registerCallback.<fn>
    | dart:async/zone.dart 1391:47                                  _rootRun
    | dart:async/zone.dart 1301:19                                  _CustomZone.run
    | dart:async/zone.dart 1209:7                                   _CustomZone.runGuarded
    | dart:async/zone.dart 1249:23                                  _CustomZone.bindCallbackGuarded.<fn>
    | package:stack_trace/src/stack_zone_specification.dart 207:15  StackZoneSpecification._run
    | package:stack_trace/src/stack_zone_specification.dart 114:48  StackZoneSpecification._registerCallback.<fn>
    | dart:async/zone.dart 1399:13                                  _rootRun
    | dart:async/zone.dart 1301:19                                  _CustomZone.run
    | dart:async/zone.dart 1209:7                                   _CustomZone.runGuarded
    | dart:async/zone.dart 1249:23                                  _CustomZone.bindCallbackGuarded.<fn>
    | dart:async/schedule_microtask.dart 40:21                      _microtaskLoop
    | dart:async/schedule_microtask.dart 49:5                       _startMicrotaskLoop
    | dart:isolate-patch/isolate_patch.dart 118:13                  _runPendingImmediateCallback
    | dart:isolate-patch/isolate_patch.dart 185:5                   _RawReceivePort._handleMessage
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1322:19                                  _CustomZone.registerCallback
    | dart:async/zone.dart 1248:22                                  _CustomZone.bindCallbackGuarded
    | dart:async/schedule_microtask.dart 144:47                     scheduleMicrotask
    | package:pub/src/rate_limited_scheduler.dart 135:7             RateLimitedScheduler.schedule
    | package:pub/src/source/hosted.dart 1054:41                    HostedSource.doGetVersions
    | package:pub/src/system_cache.dart 179:37                      SystemCache.getVersions
    | package:pub/src/solver/package_lister.dart 100:36             PackageLister._versions.<fn>.<fn>
    | dart:async/zone.dart 1399:13                                  _rootRun
    | dart:async/zone.dart 1301:19                                  _CustomZone.run
    | dart:async/zone.dart 1826:10                                  _runZoned
    | dart:async/zone.dart 1763:10                                  runZoned
    | package:pub/src/http.dart 179:10                              withDependencyType
    | package:pub/src/solver/package_lister.dart 98:22              PackageLister._versions.<fn>
    | dart:async/future.dart 313:27                                 new Future.sync
    | package:async/src/async_memoizer.dart 43:45                   AsyncMemoizer.runOnce
    | package:pub/src/solver/package_lister.dart 87:58              PackageLister._versions
    | package:pub/src/solver/package_lister.dart 152:21             PackageLister.countVersions
    | package:pub/src/solver/version_solver.dart 386:44             VersionSolver._choosePackageVersion.<fn>
    | dart:_internal/iterable.dart 425:31                           MappedListIterable.elementAt
    | dart:_internal/iterable.dart 354:26                           ListIterator.moveNext
    | dart:async/future.dart 532:26                                 Future.wait
    | package:pub/src/utils.dart 320:39                             minByAsync
    | package:pub/src/solver/version_solver.dart 385:27             VersionSolver._choosePackageVersion
    | package:pub/src/solver/version_solver.dart 134:24             VersionSolver.solve.<fn>
    | ===== asynchronous gap ===========================
    | dart:async/zone.dart 1329:19                                  _CustomZone.registerUnaryCallback
    | package:pub/src/solver/version_solver.dart 134:18             VersionSolver.solve.<fn>
    | dart:async/zone.dart 1399:13                                  _rootRun
    | dart:async/zone.dart 1301:19                                  _CustomZone.run
    | dart:async/zone.dart 1826:10                                  _runZoned
    | dart:async/zone.dart 1763:10                                  runZoned
    | package:pub/src/source/hosted.dart 1736:20                    HostedSource.withPrefetching.<fn>
    | package:pub/src/rate_limited_scheduler.dart 111:28            RateLimitedScheduler.withPrescheduling
    | package:pub/src/source/hosted.dart 1735:29                    HostedSource.withPrefetching
    | package:pub/src/solver/version_solver.dart 130:40             VersionSolver.solve
    | package:pub/src/solver.dart 56:17                             resolveVersions
    | package:pub/src/entrypoint.dart 541:16                        Entrypoint.acquireDependencies.<fn>
    | package:pub/src/log.dart 450:18                               progress
    | package:pub/src/entrypoint.dart 537:26                        Entrypoint.acquireDependencies
    | package:pub/src/command/get.dart 76:22                        GetCommand.runProtected
    | package:pub/src/command.dart 197:21                           PubCommand.run.<fn>
    | dart:async/future.dart 313:27                                 new Future.sync
    | package:pub/src/utils.dart 137:12                             captureErrors.wrappedCallback
    | package:stack_trace/src/chain.dart 97:24                      Chain.capture.<fn>
    | dart:async/zone.dart 1399:13                                  _rootRun
    | dart:async/zone.dart 1301:19                                  _CustomZone.run
    | dart:async/zone.dart 1826:10                                  _runZoned
    | dart:async/zone.dart 1763:10                                  runZoned
    | package:stack_trace/src/chain.dart 95:12                      Chain.capture
    | package:pub/src/utils.dart 154:11                             captureErrors
    | package:pub/src/command.dart 196:13                           PubCommand.run
    | package:args/command_runner.dart 212:27                       CommandRunner.runCommand
    | package:dartdev/dartdev.dart 236:30                           DartdevRunner.runCommand
    | package:args/command_runner.dart 122:25                       CommandRunner.run.<fn>
    | dart:async/future.dart 313:27                                 new Future.sync
    | package:args/command_runner.dart 122:14                       CommandRunner.run
    | package:dartdev/dartdev.dart 47:29                            runDartdev
    | /b/s/w/ir/x/w/sdk/pkg/dartdev/bin/dartdev.dart 13:11          main
    | dart:isolate-patch/isolate_patch.dart 293:33                  _delayEntrypointInvocation.<fn>
    | dart:isolate-patch/isolate_patch.dart 184:12                  _RawReceivePort._handleMessage
---- End log transcript ----

@sigurdm
Copy link
Contributor

sigurdm commented Nov 29, 2024

Hmm no clue what happens here.

Can you try running: https://github.com/dart-lang/pub-dev/blob/master/app/bin/tools/check_domain_access.dart and post the output? That will hopefully give us more information about your network.

@samirbilalmemon
Copy link
Author

Hi thanks for having a look, here’s the output of running it

Testing host resolves...
- pub.dev IPv4 resolve and connect succeeded: 1 / 1
- pub.dev IPv6 resolve and connect succeeded: 0 / 1
- pub.dartlang.org IPv4 resolve and connect succeeded: 1 / 1
- pub.dartlang.org IPv6 resolve and connect succeeded: 0 / 1
- storage.googleapis.com IPv4 resolve and connect succeeded: 4 / 4
- storage.googleapis.com IPv6 resolve and connect succeeded: 0 / 4
Testing one connection per request...
Unhandled exception:
HandshakeException: Handshake error in client (OS Error: 
	ASN.1 encoding routines(pem_oth.c:83)
	PEM routines(by_file.c:136)
	DECODE_ERROR(x_x509.c:155)
	ASN.1 encoding routines(pem_oth.c:83)
	PEM routines(by_file.c:136)
	DECODE_ERROR(x_x509.c:155)
	ASN.1 encoding routines(pem_oth.c:83)
	PEM routines(by_file.c:136)
	DECODE_ERROR(x_x509.c:155)
	ASN.1 encoding routines(pem_oth.c:83)
	PEM routines(by_file.c:136)
	DECODE_ERROR(x_x509.c:155)
	ASN.1 encoding routines(pem_oth.c:83)
	PEM routines(by_file.c:136)
	CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:393))
#0      _SecureFilterImpl._handshake (dart:io-patch/secure_socket_patch.dart:99:46)
#1      _SecureFilterImpl.handshake (dart:io-patch/secure_socket_patch.dart:143:25)
#2      _RawSecureSocket._secureHandshake (dart:io/secure_socket.dart:920:54)
#3      _RawSecureSocket._tryFilter (dart:io/secure_socket.dart:1049:19)
<asynchronous suspension>

@sigurdm
Copy link
Contributor

sigurdm commented Dec 2, 2024

I guess there is some issue with the setup of the certificates on the machine...

@jonasfj can you make sense of this?
@samirbilalmemon could you try also running:

$ curl -v -L https://pub.dev/api/packages/retry
$ curl -v -L https://pub.dev/api/archives/retry-3.1.2.tar.gz

@samirbilalmemon
Copy link
Author

@sigurdm thanks for having a look, here are the results

curl -v -L https://pub.dev/api/packages/retry

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host pub.dev:443 was resolved.
* IPv6: 2600:1901:0:382a::
* IPv4: 34.36.0.14

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying [2600:1901:0:382a::]:443...
* connect to 2600:1901:0:382a:: port 443 from fec0::749a:90ff:fe11:bc97 port 47104 failed: No route to host
*   Trying 34.36.0.14:443...
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none

  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [15 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [4009 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=pub.dev
*  start date: Oct 27 13:18:38 2024 GMT
*  expire date: Jan 25 14:12:11 2025 GMT
*  subjectAltName: host "pub.dev" matched cert's "pub.dev"
*  issuer: C=US; O=Google Trust Services; CN=WR3
*  SSL certificate verify ok.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha384WithRSAEncryption
* Connected to pub.dev (34.36.0.14) port 443
* using HTTP/2

  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0* [HTTP/2] [1] OPENED stream for https://pub.dev/api/packages/retry
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: pub.dev]
* [HTTP/2] [1] [:path: /api/packages/retry]
* [HTTP/2] [1] [user-agent: curl/8.11.0]
* [HTTP/2] [1] [accept: */*]
} [5 bytes data]
> GET /api/packages/retry HTTP/2
> Host: pub.dev
> User-Agent: curl/8.11.0
> Accept: */*
> 
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [284 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [284 bytes data]
* Request completely sent off
{ [5 bytes data]
< HTTP/2 200 
< date: Mon, 02 Dec 2024 10:36:27 GMT
< cache-control: public, max-age=120
< expires: Mon, 02 Dec 2024 10:38:27 GMT
< last-modified: Thu, 21 Nov 2024 16:36:18 GMT
< etag: W/"206ce44c11cf2239e2b91e4261c187c6"
< vary: Accept-Encoding
< x-goog-generation: 1732206978176692
< x-goog-metageneration: 4
< x-goog-stored-content-encoding: gzip
< x-goog-stored-content-length: 1412
< x-goog-meta-validated: 2024-12-01T11:49:05.320724
< content-type: application/json; charset="utf-8"
< x-goog-hash: crc32c=+obdlg==
< x-goog-hash: md5=IGzkTBHPIjniuR5CYcGHxg==
< x-goog-storage-class: STANDARD
< x-guploader-response-body-transformations: gunzipped
< warning: 214 UploadServer gunzipped
< x-guploader-uploadid: AFiumC5tdWkTOqEK1HXFyroB-qmSd7BziwKf4YlDJhCyahvZCHSEOehaeK5BTSJXBar0u4T2zvu5lGM_8A
< server: UploadServer
< via: 1.1 google
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< 
{ [5 bytes data]

100  7998    0  7998    0     0   2469      0 --:--:--  0:00:03 --:--:--  2475
* Connection #0 to host pub.dev left intact
{"name":"retry","latest":{"version":"3.1.2","pubspec":{"name":"retry","version":"3.1.2","description":"Utility for wrapping an asynchronous function in automatic retry logic with exponential back-off, useful when making requests over network.","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.16.0-nullsafety.13","lints":"^1.0.0"},"environment":{"sdk":"^3.0.0"},"topics":["network","http"]},"archive_url":"https://pub.dev/api/archives/retry-3.1.2.tar.gz","archive_sha256":"822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc","published":"2023-05-16T14:26:11.159498Z"},"versions":[{"version":"1.0.0","pubspec":{"homepage":"https://github.com/gwTumm/dart-retry","version":"1.0.0","name":"retry","author":"Tim Kluge <[email protected]>","description":"Execute a function repeatedly until no exception is thrown","dev_dependencies":{"test":"any"}},"archive_url":"https://pub.dev/api/archives/retry-1.0.0.tar.gz","archive_sha256":"4d918240ea6fba89e4aaf814a7a6b40f9f72998ed04780db32d53a8f64989abc","published":"2016-03-31T16:47:45.053Z"},{"version":"2.0.0","pubspec":{"authors":["Jonas Finnemann Jensen <[email protected]>"],"repository":"https://github.com/google/dart-neats.git","version":"2.0.0","name":"retry","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential backoff, useful when making requests over network.\n","environment":{"sdk":">=2.0.0 <3.0.0"},"homepage":"https://github.com/google/dart-neats/tree/master/retry","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.5.1","pedantic":"^1.4.0"}},"archive_url":"https://pub.dev/api/archives/retry-2.0.0.tar.gz","archive_sha256":"08c6fa9b59f216fb32259ffa7e4b0a5ed921777218760e4c3918e4d75a31341a","published":"2019-03-22T14:21:00.391587Z"},{"version":"3.0.0","pubspec":{"authors":["Jonas Finnemann Jensen <[email protected]>"],"repository":"https://github.com/google/dart-neats.git","version":"3.0.0","name":"retry","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","environment":{"sdk":">=2.0.0 <3.0.0"},"homepage":"https://github.com/google/dart-neats/tree/master/retry","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.5.1","pedantic":"^1.4.0"}},"archive_url":"https://pub.dev/api/archives/retry-3.0.0.tar.gz","archive_sha256":"7dec5e833bf587c0997c882b8ad46e5a0b69e68055817a738275691b556e25f7","published":"2019-06-20T18:34:40.073842Z"},{"version":"3.0.0+1","pubspec":{"authors":["Jonas Finnemann Jensen <[email protected]>"],"repository":"https://github.com/google/dart-neats.git","version":"3.0.0+1","name":"retry","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","environment":{"sdk":">=2.0.0 <3.0.0"},"homepage":"https://github.com/google/dart-neats/tree/master/retry","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.5.1","pedantic":"^1.4.0"}},"archive_url":"https://pub.dev/api/archives/retry-3.0.0%2B1.tar.gz","archive_sha256":"0719943a7d596ee6ba9e53e5cff853ab276dd7125848f890e2853aebf8bfb1c9","published":"2019-08-26T08:37:44.221096Z"},{"version":"3.0.1-null-safety.0","pubspec":{"name":"retry","version":"3.0.1-null-safety.0","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.5.1","pedantic":"^1.4.0"},"environment":{"sdk":">=2.12.0-0 <2.12.0"}},"archive_url":"https://pub.dev/api/archives/retry-3.0.1-null-safety.0.tar.gz","archive_sha256":"dda0aaa6d66fdba3d27c3954a3326f4e4848f96eadf2ab81023324c178110023","published":"2020-11-02T13:46:25.148871Z"},{"version":"3.0.1","pubspec":{"name":"retry","version":"3.0.1","authors":["Jonas Finnemann Jensen <[email protected]>"],"description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.5.1","pedantic":"^1.4.0"},"environment":{"sdk":">=2.0.0 <3.0.0"}},"archive_url":"https://pub.dev/api/archives/retry-3.0.1.tar.gz","archive_sha256":"6d0cc7caba6caa8a16bbb7b6d79a5328e708940541090bcbebe844d4e0811440","published":"2020-07-01T17:29:53.216548Z"},{"version":"3.1.0-null-safety.0","pubspec":{"name":"retry","version":"3.1.0-null-safety.0","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.5.1","pedantic":"^1.4.0"},"environment":{"sdk":">=2.12.0-0 <2.12.0"}},"archive_url":"https://pub.dev/api/archives/retry-3.1.0-null-safety.0.tar.gz","archive_sha256":"64d274790adfd9e46b704459b91b2babde2ceeb3f7fa72327519998e3972da79","published":"2020-12-02T20:55:00.012653Z"},{"version":"3.1.0","pubspec":{"name":"retry","version":"3.1.0","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.16.0-nullsafety.13","pedantic":"^1.4.0"},"environment":{"sdk":">=2.12.0-0 <3.0.0"}},"archive_url":"https://pub.dev/api/archives/retry-3.1.0.tar.gz","archive_sha256":"45dfeebaf095b606fdb9dbfb4c114cc204449bc274783b452658365e03afdbab","published":"2021-03-01T18:27:00.565009Z"},{"version":"3.1.1","pubspec":{"name":"retry","version":"3.1.1","description":"Utility for wrapping an asynchronous function in automatic retry logic with\nexponential back-off, useful when making requests over network.\n","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.16.0-nullsafety.13","lints":"^1.0.0"},"environment":{"sdk":">=2.12.0 <3.0.0"},"topics":["network","http"]},"archive_url":"https://pub.dev/api/archives/retry-3.1.1.tar.gz","archive_sha256":"a8a1e475a100a0bdc73f529ca8ea1e9c9c76bec8ad86a1f47780139a34ce7aea","published":"2023-03-27T09:18:10.201498Z"},{"version":"3.1.2","pubspec":{"name":"retry","version":"3.1.2","description":"Utility for wrapping an asynchronous function in automatic retry logic with exponential back-off, useful when making requests over network.","homepage":"https://github.com/google/dart-neats/tree/master/retry","repository":"https://github.com/google/dart-neats.git","issue_tracker":"https://github.com/google/dart-neats/labels/pkg:retry","dev_dependencies":{"test":"^1.16.0-nullsafety.13","lints":"^1.0.0"},"environment":{"sdk":"^3.0.0"},"topics":["network","http"]},"archive_url":"https://pub.dev/api/archives/retry-3.1.2.tar.gz","archive_sha256":"822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc","published":"2023-05-16T14:26:11.159498Z"}]}

curl -v -L https://pub.dev/api/archives/retry-3.1.2.tar.gz

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host pub.dev:443 was resolved.
* IPv6: 2600:1901:0:382a::
* IPv4: 34.36.0.14

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying [2600:1901:0:382a::]:443...
* connect to 2600:1901:0:382a:: port 443 from fec0::749a:90ff:fe11:bc97 port 37986 failed: No route to host
*   Trying 34.36.0.14:443...
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none

  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [15 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [4009 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=pub.dev
*  start date: Oct 27 13:18:38 2024 GMT
*  expire date: Jan 25 14:12:11 2025 GMT
*  subjectAltName: host "pub.dev" matched cert's "pub.dev"
*  issuer: C=US; O=Google Trust Services; CN=WR3
*  SSL certificate verify ok.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha384WithRSAEncryption
* Connected to pub.dev (34.36.0.14) port 443
* using HTTP/2

  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0* [HTTP/2] [1] OPENED stream for https://pub.dev/api/archives/retry-3.1.2.tar.gz
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: pub.dev]
* [HTTP/2] [1] [:path: /api/archives/retry-3.1.2.tar.gz]
* [HTTP/2] [1] [user-agent: curl/8.11.0]
* [HTTP/2] [1] [accept: */*]
} [5 bytes data]
> GET /api/archives/retry-3.1.2.tar.gz HTTP/2
> Host: pub.dev
> User-Agent: curl/8.11.0
> Accept: */*
> 
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [284 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [284 bytes data]
< HTTP/2 200 
< x-goog-generation: 1732206977820160
< x-goog-metageneration: 1
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 8072
< x-goog-meta-validated: 2024-11-21T16:36:17.783002
< content-disposition: attachment; filename="retry-3.1.2.tar.gz"
< x-goog-hash: crc32c=mX9Z7Q==
< x-goog-hash: md5=apw92dpfOiTKE+16ERbeYA==
< x-goog-storage-class: STANDARD
< accept-ranges: bytes
< content-length: 8072
< x-guploader-uploadid: AFiumC4s-Sa_cPVjzHrqFI3NGtLj6lqegdtxghUCQ6TbL1oSmnl3eZ5RTL0up0YnQFfqySU3UFqOa3M_MQ
< server: UploadServer
< via: 1.1 google
< date: Mon, 02 Dec 2024 10:19:00 GMT
< expires: Mon, 02 Dec 2024 12:19:00 GMT
< cache-control: public, max-age=7200
< age: 1119
< last-modified: Thu, 21 Nov 2024 16:36:17 GMT
< etag: "6a9c3dd9da5f3a24ca13ed7a1116de60"
< content-type: application/octet
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< 
{ [5 bytes data]
* abort upload
{ [0 bytes data]

100  8072  100  8072    0     0   2737      0  0:00:02  0:00:02 --:--:--  2742
* Connection #0 to host pub.dev left intact
����������í=ûsÛ¸ÑýY��êN�)¡iË�8u.éøbçÎmâdlçËwãqcJ�eÔ�©òaY÷5ÿû·�¼HÑ�k�ÜôjN&�I`±Xì.v��°�E¹�Ë2��*ág8�òòw÷|	¸�nl�¾V��ÅV�ó©èol¬¯nõûø[�þÚÖú�X½oDÚ®ª(£üw«bZ
n,wÛûÿÐkeE¼Ê¦ó\�ÏK±¶Ú�&~Ȳq"Å�7¯:++ðO¼QC��r$ªt$sQ�K±3��ðG¿	ÄÿȼPY*ÖÂUÑÅ�KúÕRï9��g��Ds�f¥¨
	0T!b�ÍÈ«¡��B¥b�M¦��Ò¡�3U�S;�J�0~Ò0²A�Añ�*Lá.ö��¨ÔHãu^�Ób{ee6���a�fùx%á²ÅÊ�ýW{�G{Ë�µ®õ!MdQ�\þ³R9ôx0�Ñ�°�F�À5�f"ËE4Î%¼+3Äz�«R¥ã@�Y\΢\"��*Ê\
ª²F4�#tÝ/�d�R±´s$ö��Ä÷;GûG��ù¸�üã»�ÇâãÎááÎÁñþÞ�xw(^½;ØÝ?Þ�w�w¯ÅÎÁOâoû�»��@2hG^Msì� ©��rD´;�²�B�1JÅT�U¬�еt\Ec)ÆÙ¥ÌSè��Ê|¢
�Ö���!�DMT��ôh¡_a§�Mfy)��­/�Ø6j��«V�=_(@��Õ�)Ò¹ÌÔ��Z¥Ý�ø¿��ã<«¦ÝG�XèÝ�����ýR��ß}4�qT%¥�É$�û¯�Àî+ä*b:,�#�C�²��ÉGI"ò*�ª��ê_�RMd��¡®��ê^F¹ø�x!V�Ã�ïD�u��=yâ���*��¡.K(wb����¼��ÕÚí³úmÿiý~}­~ÿ´Q½¿Ö�°¶Y�púÜþÄ�ä��OÅnϽ·ÝTÜM�Ý�¾��LÇå9Ü×;kº;�ÒyHDïª^¨Ò·*IT!�Y:*�{Å�/å°ì����ýt�T�º��Àt²�Í�¨SñX¬�[��°·ýpíiÏCñsÇÿû�Þxã��× ïÆI6«3�£z}ï5n¦�O7z�tj�]íâ½.Öh�XVt�j8�qëq�Q1O�¶Y¤æ0«Ò�(zG\ø}Ld¥6º]�î�ïÉ�G�(Så©(óJ�������Ö­�Ûêªâ�
÷���2¨��VQRtû½�»]¥ç >	(/Vß�÷�I`»��ß)K9��ŶØ4ÜüoS¨<ϳ�Ø3xjE�SÈ}�©ä��ü9��p?Þ�]Ù�/^B�¤�¶@4�@K0ÁÞD¥Ì�´�¿Ø�ºÚ6¾�¸��(~u��uBH)ùåLv��é9±ü¶Ø­rRóÝÞ=Ñÿu�O¢òß���2��î:(Íj7�ÍæÍC£Å]D1´#ÖþCGDÅ¢«1|!úuµ~ûh
¤È.`�mÑÌíêè>Æó�꯵�Ç1ÍN�Cx�!ü¦�ã&�t(R0´óùÃ05�iaZsd�;7��5�zWUZ�eþÿsç×öv�®æ¥}à¯Ú�rÁõñ�µ§ýõÍFüGlm­­>Ä�¾Áåi¤k®z¬ç¦ò^�(���Ò*�U�>ìƵ�0BsC��f�ã½Ã·Gbç`×�}¼~w(>�í�âpïýá»Ý�¯ðq@¥v÷���÷¿ÿ�O�@?�»�T·¢© ìhll�J�ç�¨Û��R�g�Ê�PÈC �˵ÈA®0Ô�Ëi��ª!>6���µ!�¤@T��6É!¤#9d }Ò£Õø\ü��W�
Ê�ÕD¦e�¯,_@lh�uÙ,���P��ª��¨*ϳ\ýLíi8m5Êó�¢�ã<J1lÕ�ß��ä�¦¹=�½�D�b�uØ-�������Êj0��¤ð�x/Ü4�´Ì³$�Q.ÍMBH��YË¥�+�M1ÉR
I�4aA�Ã
�8���Ó*�fÀ1�ªvÀÍ�-i(KÔ�BtU�«f3��0|9��ÅÍRþ�`�o�q¸Òð=¿"
ä`3¤ÑXâàa»à��kÄ�1;�Ô}�}j7"Ø>ef
¹	Ã.
0¡á)ÎÕ�!Å*�jNe>DÐÝÍÕ?ö¨¹ÈÃ�7�ª�´�à�c�Ã�ËÂ@�������
�²�ÝÃÓ
ùOYµ$ºP��åK=�Ôá�ÒäR�*����?¬	�ت¢�7$>c! aY`µ#hm�"�â5irÚ4�±Ì1Koc¢ø�61ÉF�µäH¤�`�a%"��!E�)\É�Z����Ø Ê�¨od��i0\ 0ò�«±¶�)^í©�w���+,¢�¥s~�ÃQ%$�q�Màå�,4ÀÚ��pEZÄd�i�¢'�¾�E$�<�.¨wPÃht�MqE¦3!§»9�N�>ÀãZ�}í�=½dí] ��Ý��©H�ó©ßí�Y~± �fð�0&=��æD@¥¦�V��tº[�h��ä2R	�Ù�âÊ�jSdÀa¤Y)²zÁh7 �¢�/«7¦��VDÖ¨,qn!
�l5�.t@^EèÀ`EPíÀæ\�×9¦�Z¾�aJ²YÏQaWæê�¨x)��¤Xjr�¶ÑN�Ý{ãR�
â�¨`¿�Eq�m ÷�÷°®Â¦h¸P�fçjxî)��¬�æ�ô~䥢¡D.�Òh9�àß²ÜÜ��=̾4i`8ËÉB¢=�Ô� ±,!¡�jjLnÐâ�/êc£§â�ø�¢I>M=äf=v�^Ï�¹Äå�#�r�åÄ)H�êÆDæ2���¤�D¸�p�òI�MÀßÑ�®@�åq4¤I"ðæHKÔ�¤�:2�ݨ¿BU®çøÖ�oÊ��Y¯=K@-pf.µx °Ú����´%b eL�ª�ï¯C>ð�¢D­�AÓ�QÛE5�Ý¡��±;�»��é³Ô��5Dz|Á¬0£LÓÝ�³�o¨ V¦æ�ß�����)®7^î6Û�%Û§%
�ç{«�¡�L@�ó�q�£0��â#\Ë���ñQ¥�ú�¥À'ºt�B:����¢��Ü8�YÝå·�ÿ�N¸ø�`å�LÊ"ð§,k
�ó¢��ÂWá0çV�§�!Í�º��?Î|l­X[Ë'zà©���xÔFº��;¬
�å©Å	éKmF~$�ç¦&ye�Pï«áGèJ1UÃ*«
�ÞI�_ êË�udL.Y¨qJºß­·^Ã�¨¬��2\Êóe5\Z�á�}m»m$ðV�Ç' êÇI£Qq�È$ð����49 í·ã�°�ÿ¬���lv��½yºF�×�?VDk¡ø�Í*lÖ-Ý�ËJ�U<¹j^muf<1óµ²�YRx��¨B�g²âÈ.À5ø�-¼©,�2�ý@õ%£�B[#ÍÒe�y\àÃÛe°zò1:NÙ<JÊùr�K¸S`Ø]f´®¾0�kÿ��4Þ�Ô���"�/h:§ÎÁG�º@E`Ôi��£Û'�3Oµ�=Ñ��ï·ùf¾ÕÅd,/´Ø2��ná�Z÷�è}�J÷70:]�¨�<
.GiL$@°`�¨'¦ÜWoôÀ\�`çÑ¥$+Ï D~t�ÇhçÁ$ �P¿ü?ç�ðÀX= 
em���1=C�ð��V)]�§����¨�ºK£6L"�ôæ²^ç���ħ®Õ�©Ä5�(W$�q�ÚÇx4R�¹Ï�ünÑ�78K¥��Aý�Eb­zªÖ¬`:d�_���}6òêÈé&f8�f®�Å~�ão}¡�4�ò´��R���h�ákRrÚqïº	ËÚÖyV�ËD0ì�ÅvÁÅ£{ʾI¢YQ©�»�È1O�@1�¼³	�Zñ&�Gs�#^hWÛÁ�ºÁ��n�ñ��¥
`Ø�«s¢1��3ª%Å8�NÆô�g¬*��PDqô¯D�1ØFðÐ0�¥®Îk�±*Ø�Å¡ô#C¡Mc²�­©�@�*cÛÔôÑ
V�
	��ÐX�J�ø�-�ø�Ù�¹î6ó�~�&��+D�q¬5��G9Î�ð�x~7ºkÛ̳ݨÇ=Å�ì1â�豿�ê �¨´|Ó×z�x-tÔO÷r#ö�¦QÓæÀk��7Î�F?
ýw�êäÈBà>¨�ù�½ÇÂk�U�ei��®û��!�N½å¡×r.1?-0v³çÂ�w��5;W[�Ò
:��PÂÜì�hî�P-�$ÚM�gL���NÜtß8�Ñ�OS¥âå,7Ö���!7ÊÈ �Y�Òð��,qyé&.îÉâT]'Ú¨�JË�¿vüp¨��Þ�ï¿Ú[�á»*9O�ÄN·�&·×�/]�
h���ÊÒxy �ë�Á�F#ò1ý�Ã6²¢R�0Îë�ÑJ�4�w�º�Ü�®��v
·Ò��
`$2*Ð�ò£ôº��V0� Ñm�fdpt´ö²�}®*nÄṯÌkLæËu=���¤VÏà�9v3à"ü,��©��[Ï�riß �JqCRÈ�������æ£eìäÜ�M�ñ9p�Ñ°��8¡Ççì�¡þZ$³7Þd<°+m�|àC8ç�-�::Z¶HcÍk±y;mD£�þÎÑßñ9Ò�bP×�º�$�Lý��Âï�ùS�Þ��d:ª&Æl­q�Q,ìÿ�álê4"°	b��Z��¢U¸îMv@^5ù�	sݺE+��WAf+�ëÙ�h�¾¼¡@ º�>Ê��ShµÖ¬Ü��Þ�öZ����·V�Å-Ø�Nlbr�ç׸"~tÎ��Áæ½h�C`aµª6�[«�ó±5�ÕÂ2ÖSix�µ�Ù$gG¯�°¯ê¬À"4©Ö8hò
S¬�º¿�Ñ[ ±ñ�yÓ�ô�Y^�ëÚÐ�³ô±Åf �M½��}þ%®�6³�M�a���®#³úÈõ�²�+ÙÕ��_��;e�ÀAî�N#�ZQÁtPÈ�ä� ��oHtCl]p��¨h]"ÌW'Æ7iøä�É+9ôT<)^K�\�£�×��¾�^�x
ªÐ� �ªEÏ��e¤9K6¹½�!$¼^PcóÅ,cD���Y��£^2¿Ä�¾¾��4�sázâ¿����j�øcêOTÀ�à�NC
��6ÁåiÄ�¨vÇ�:¨�Â:��©]�Ï�i2ã¦g��)�)µ��]U�ë��¶±ø�ö'Ðe�Þi¿���Ö]�vÀ´ì��Õ.â�A�¦�ê�Æðemp{íû��Ä�nI0Î)oLð¤N�Ü����êL*r�òE��Ä<Þ?~³��Õ��÷�^�î�ü°÷vïà8�o÷�_ý�Xî|¿ÿfÿø'b¡×ûÇ�{G�>°£a¼ß9��ûðfçP¼ÿpøþÝÑ�϶¼Z�àÊ�à?�F�­:ÐÊ{�uv��˳i®Ð<§�ÇÀ]X�øÏi\/^ÊÑÆ¢���»kÔµ*H³�ÙPY7��º^g¥h¬¿ÐºèÌ2ï=�áÞ��+½QÑ@%´x¾�3¯�ó'-	�����
v��ài{¡�³�Uâ��/d�Êq¢Àú�Ê^`W»�Z(×F~nå÷.�
�ÓOÔ�:Bn�ñ�»na�,1�¡èÝ°+�´gmúÀ ��²DQÃ:"@C�M¢q=��µMJ�K� ­3.È�ÅA À°å¥�4`8¦��r�¨ÑÐ�s�¼1\�ó�9Îâv®ÆU㦣KÔ¬¬�©ø�Jõ`zzÕ��to\�7Xa·���v�e#L>ôb��0)gÓi�QB´	*D�s¶«�g£(�«Ô�74	¶d�à*�2¯O�nX�À8È�h 7�q��
¦G£KE�¤±Nß�	ÐD0É
�<KÀ�C±3¤�E �ѼØò��¨=¡øx�¦{]\���7.·�+tx�e��¥Hgm±�b®`·Å�ô	¨:Â�ö¾Q'¦��ÕÚoN|'')¦�¸���51¸�l�è(�Ù-+¨vÐòå¥�è�Ê�ö¯�Ñ ÖÁø1�¡'Ä®¤%�ÑÓ�ìúG�-iâ­�X�[/�P�W?FEêÔ(áK��[Eq�ÝE�<6Ð1aô�TÌú���å�h�[Ú�dî
×�ËxÔ�:�ò	i"c\[*:q®òÜ­�éÈ1èdðÊÑYå j°�7�̵±á:4G
8�Zc~æq£g6Z\��÷�vq^mK�£÷;ïßC�ýÿÝÆ!¤h�hÔ¹Xܦ�ï���]K�ëø����FQ�&�³:�©ÉÁ
/MT#p�|¬d2*�L� ì¬ô�¸J)�3�NN�¬â£È��íæ��H«j¯Ïó¤CÑÝÍÒG6_À�Q�ü÷=AÞ:¹©���À	`â[<´wàMÛÞÚ,ÊJ1�}~e�BÉ©g�@O@ŤÀ�*.­ã¤F�SYæ�à2´XÙí"3sj&c³´:�.e�VH
&�V\�ä(p�:x	ç�úʧN~A4�ñ�]�×�3ë®6<ã��Q><Ç�kf�·�x2�ëT��Þ�gc�õ���é¶`�ñÅÛ��¸ó¶`�I¸%åÔß��UîcG°�÷°#X|±ùív��¬ûØ�L�ÔM;��íäæ�ëÖK'¿­`�ÕW9üáw·�ÿ°¾±±¶pþC�mí!ÿÿ�\Íó�þüpþÃÃù�_zþ�ê�mÚ¬ç�ù@�UvÇS ^W%ø�ßá¶þ�æ4�·ý�¹�¬l�
��a�_%�öP�=zCº�/¼�]Þm�Ûëx���ùAòº@U¼Âì:²Ý¡�YéÂxµ�6è�¬Wö�Þ(Çû�Í�fs�"µò6º@oïÇãã÷ÄZ²(u �·Zâ@�`Êñ�mU½�Q×0
r×¼��!±,?äI÷C®B°ì
Ù}äóþ�$:��{ÔëÕ+âi�YUví¦G}vöØôÏ^0��ÿæ÷�P�É îöî
ÍTfhá(§á]8ÔÀ�pTw{�;�º¼c2ÃD�4ûíþD��cFÈ>³®FË~Èfõ�ý��7apÓfë* ð�Ís�·¡å0o4©�î�õYç�î�rÛAɾï>rÃD��Tiêíãü,d��¿±
jWJ¤�e��¡­ÚÁê4��Çû;É,���8vu1âNhyåm0TèøÕ{%¤f;�r®
ÀsoÄ4Ë��Ø�V#rÌs¦øÍ��Óå(Á 	¥öQöK��&Y�m8¥£W´¸î�kNã��>ì�7�%�H�'¸èø�é�³���Ð7«¦�ìÇ�ýãOÇûo÷@yMq­<Jéd�sÚ��3ÜL»V�ó{V# î¼Pŧ�wJ�óh�Üs�·Ø�Bl®6í¿õþjÿÁþû���;l�3�' X���Ö���9â7.�ÿ½�.�ý°÷æÝ�ádôµÚ¸Eþû���Mù_Ý|�ÿorýá�âr=ì�k�ñ�
U4GÏüÃ3Ît�ó�L�3°óM¥>VÚ��ÄY�MÕ�J¼��B·Â+¶�Å�Jò¡Ò*I��(�%ÚÚ8	K¿ä²÷�ë½UcZ��Èþ;Sg��x­®Øª³g�¹�«O¨È�)%ìb÷ì�¿�zº·³ûv�¸ÿÌ�I-�Ä\Â3m+�����YÓ@̤0gÎ�ú4�
ì�Y;����f¤d[Pz�nð�¯å�üE\�³Ëð�oî�×8®����F.U�kÄÖb{tÞ�9w�¼ñ÷û8Ä·û¸��L&¢.�£´dÁ�é��9<�À��íCÚYÄ�ìNÆàGV�´(WÐ�\FÇp��t�ïð�~�v��q·ò=Âì�.«ñV�0ªÅß�j¬]Q�à�Ój¹Ù¬Luv1å�Ã
zQLÓ¢ohÑì-¸p�lì]³[ãÙq5ÑØÒ¸µvf¡�tá×�Õ¯qM²4û4½��
»Ï\·Ù�ýõ�ýß__ßzÐÿßà*F�Û !˨&pCü�Ë���oð³ÜÖ>§}`ïy1�Êâ�N�+�·¿Iyù­]vúû�mÜ"ÿkOû�ñÿU¸��ÿopqô�3�ò²ó¢vu:d·h×Ð3WR\iÆì¼¹gý`à�,�4«
�;5�¡ªèd1î­Ö&�¦)P��ì��Ò]uRoN�¼i)À�ÈòB�t°A�]È´ã��Ðp��Jæ½yhø%Y�kè:è�¶ÂãÇ.õrûñck�Q¨×àù��Ê!&û�jë���nÊ�Ç�JÓbcð¬��Ñ�E&$÷=ÉÆjÈË�òj�¥:ïk��[�6lΫ�àBË6eÛ��¢i
­���Ñ�Ü%Z~m|VǦ]�ú�½c�LëP¼úÅKZ'Á�²��û�ã�£ºAçß	Â~a�¶÷¼Ã�P�"�d#<©�hÖéì²ùLvæ3ÌZ¡Óþ�Q$RNu¶�Û�Ãgyö1�g
��Ösø/à³�£©kÃÄÖ�ñôf1)Ä��e±¶ùÇ�îÄ~Öx´�Ò)εg�!�ä\{¶�ÒiεgOC>ѹöp+äS�ý��CÖü´k¤µáÌñ�Rs<Õy6Ã��æ|îµ�æ���aR�G5�´A�wì"!Á;)g¼»��¨�c¯9�±vôâ3�­ë¸6ü¯äÛ_Gÿ'jàé�¯ÓÆÍó��}k³yþ�üY}ú0ÿ��ëáû��ëÿ÷¶þ¿b5j»1Øn!���H®Põ×tb�6®�,©ô�<R�p°�Ö#õ�I��p_�Ò§¤�;LõÎ4)	Ü�?���¸ïJR�3ÍyèÐ;fp�£wÞ�Ψ�«��T©9���ä]���:6Læ1X¥`Eâ¤�v@©æX�J<¿K^�¸Ñç�h�#ü°�Ý'üJ�Ì�ø0<¤/VP��"¥7ëc~3�ÏSwNeK��#ðG#[&ÊØ8äÎ�+Þ�Çó;®¡.�å·ØP P]g]ñ¾�2Jz��ÕbT��Q�@Z+z¼h\Ñã����·�Yô¼ÅТçmÆ�½h3¸í�?ÞãÈñãÇto�ü}ý��¼·×�:Ôô5æ�¿»��Ƕò�Ì�®õ�¦��Ñ´h7�4=;&��W�|Jê¼��AÇt�8�Ò)-��e�më#;�·0Ì
��\ÃÖsn�sJ maNÝ0ù�o@��¡¨��ãøÕ<°�j�8�5O�w�'�/Í��#Í#��k8|/c\.ÐS�É&?áoÚ¨�éÉk"ЩK�2<Á½â×�Ä��ßóa£8�°n@�»�y��wíÑ��ùP¸�IÑ��ò�4¨UÒ�ý:ñ÷¯A��ål5\Û<�]­�zl����� �ø£;��¡5ÑSé�÷\ðùa#in`öƺ���UZ�±�x�]©I5ÑM4|�À(Mb¢õU¡Å«�Èæ<ù�Ài5�ð6P«;�<�@XdºjZoæ���yF��ea�\8À�R`�³Þµbð%Þ1C«ûÈ
�q^lCP�/Ú¼æ¦à4ß´yÐ��Ô|Õ¦Ü��6PWÛúÛRÀ�¡'. ·¹¬Õ¯�ï{GÛ�Õ�¸�-|��*�n÷
�FY�mÁ®× z�u�á�ý!�§�yØNôÈ�¶0]�)LXLïïÃ=©âl�ͺk�©Ñ��}Íq¦ÏZ�J�<å�lM>|���Á9[n!Â�i�³ö7¥�OD°®²ºÈþ���!Þ�ÕÕOÅK o ��[w D*Ç´[ÏäÄaF�)õ�TrÉx:ùÐ4�þ,óÌåÑÙTHü�D·m���.�ma*¯Ê]R8]¤Ý�XÆO@<�ÿ�{�À�6�ÞD¥�'�4(&h²ä
ºfY[�  õ�f�®Ï£������Ä�-`ûy¬ÛÕ�äºßYE%þ¢�m{º�;mtn¤=�ÓSg^�����YN´ypjÀ�áñ�gÖÑ�^��¡¹¥qÇ�;¥�¾Ù�Çj'YzÈV¶
F�³t�ÑÉá]�I��zt4��eK�¦�J/3<d2*�'�HÚ	É���Sýé·æ¼�f^ï,`<D�&B�¬¨���`v��X�è´ÞoÜu���¼¿�=�v��L+üÍgIQ?+tÍQb>A�ªÿICãÓY¼V�y�9}ü�[����ÌÏßåøæµî�pf���÷m�A�%^�÷Å�¿�+0¨Wà,íÖ
z�YKÕ�£ñó-F�í�\ Sj�Âl¸��ªÉ<J>á�ÏO���ÒOÚ¿µG�Ìh»n��Í�°�úä	IP¬rüä_�ç��¡ãí|ø\�Õ5]r¸')lªÇ^�òg�6gõ�1¥�ìbW×W0/_ø³6�ɵ�lóÁ/ñû��á"þô'ñû®�Àß��4\µÏÇhVhû46­Én`Öë2l]¤+[¾/óÙl�ÃØ�E{�¥YCt|(Ì�<IÊ�+"Óñ���ÜùÌ~ë}é�'M�vMO<"[a6®Û}�=�FÏ���Ûâ³^³lôà���ÔÐîþf�û��®�	Úç�[f�6'ñ®VïõÞ�gõ.8H·Û½
¯Ç�½¿pºúE�Õgd'Ò]m_�óh³íßØã¶�)°ÝöÐ�wß�3¿¼7nÉÌ»Ñ{Ptô��Ï��ý|¤î̶ù�üÜ�ÿ7Ù�_1ýëÖü¯­Åüß~�ë!ÿë[\¸Å_3MG�������½Ã
¶ÅËe`¹�%ÇÅéó�y4å�3m�öÓA"��³UªáB�DG´fJ�&Ad�Î¥þÜ�Ýü�N�¸r%�`q�M$��°-Úò7i
âüÍTFe±Ræ�·9�0³ó�g'�Ó¬À�fÌï�"���:fÿ��³/ó;6�D���+Ó�1go�i/?�$~[D¦CÅùv�2·-þÞ�ûOu�´Nuî¯wp£}�:àï�ø*ÓK�äÆS*°*&ñ�¿sâ2gbÃÓeC)ü�h>äã=\�×ÃU»þ�¹¿L¿����

@jonasfj
Copy link
Member

jonasfj commented Dec 2, 2024

Do you have any self signed certificates installed in /etc/ssl/certs/ca-certificates.crt, etc?

You could try: dart --root-certs-file=trusted-certificates.txt pub get

Especially, if you're running on a network where the admin has installed custom certificates on your machine.

I don't recall exactly how this works. If Dart loads from system certificates or if it just has a built-in list of certificates.

You could try dart --root-certs-file=/etc/ssl/certs/ca-certificates.crt pub get.

@jonasfj
Copy link
Member

jonasfj commented Dec 2, 2024

also try downloading an SDK from:
https://dart.dev/get-dart/archive

exact it and use it to, see if there it's an issue with your package manager. I would guess that your package manager just downloads the Dart SDK from the prebuilt tarballs, since it's not easy to get the SDK building.

@jonasfj
Copy link
Member

jonasfj commented Dec 2, 2024

note: if we find out what the issue is here, it'd be great to add a section to:
https://dart.dev/tools/pub/troubleshoot

@samirbilalmemon What kind of network are you on? Are you sitting at home? or on a corporate network that may have all sorts of security software causing issues.
Have you configured the PC yourself? or is it setup by IT with all sort of security software that could cause issues?
(did you install security software 🤣)

@samirbilalmemon
Copy link
Author

samirbilalmemon commented Dec 2, 2024

Thanks for the response.

I do not think I have any self signed certificates installed. This is a VM running on the iphone in the UTM SE app made from the arm64 generic image at archlinuxarm.org

My network is my home network so I do not have an admin at like a corporate or school setting.

I have tested trying to download sdk archives and extracting them instead of the pacman from ArchLinux and they also result in the same.

No security software or firewall settings have been messed around with, other than running the necessary pacman-key --init and pacman-key --populate archlinuxarm and pacman -Syu the system is pretty much a fresh install.

I will test dart --root-certs-file=/etc/ssl/certs/ca-certificates.crt pub get now and report back

@jonasfj
Copy link
Member

jonasfj commented Dec 2, 2024

This is a VM running on the iphone in the UTM SE app made from the arm64 generic image at archlinuxarm.org

You runnign a VM on your iphone, I'd call that unique environment 🤣

Not sure why or how that would cause certificate issues, but could be that the VM doesn't have raw socket access, so maybe the hypervisor is doing man-in-the-middle on all connections. Which for TLS connections will cause issues, unless a custom certificate is installed.
And perhaps the hypervisor is installing such a custom certificate in your VM without telling you.

I'm just guessing.

@samirbilalmemon
Copy link
Author

I just tested the --roots-certs-file argument and it still results in a TLS error trying to find package ...

I find it pretty interesting how wget and curl and openssl commands are able to work with TLS connections to pub.dev.

Does dart pub get have more strict security rules then curl and wget and openssl commands?

@jonasfj
Copy link
Member

jonasfj commented Dec 2, 2024

dart pub get just uses the Dart HTTP stack, which is built on top of BoringSSL.

So it's a different TLS stack.

My bet is that it's got to do with certificates, or something else funny that the hypervisor is doing when it's forwarding traffic.

@samirbilalmemon
Copy link
Author

I see, I would be happy to try out any suggestions you guys might have to get it to work.

Currently the only way I got packages to work in my environment was using wget to download them and then extracting them to the cache folder and then pointing to them in my pubspec.yaml but unfortunately given the number of dependencies packages can have it is just not feasible to do the manual labor.

@sigurdm
Copy link
Contributor

sigurdm commented Dec 2, 2024

What does your setup look like?

Could you aot-compile the dart binary so that it can run without access to the pub cache?

@samirbilalmemon
Copy link
Author

When you ask what my setup looks like, what information are you looking for? The image used to install Arch Linux? The commands done after the install? The model of the iPhone? Or like what information?

I do not know what aot-compile is and how to do it so I will look it up now and figure out what that means.

@samirbilalmemon
Copy link
Author

I looked up what aot-compile is and yes I have use dart compile exe command successfully on this environment to compile into standalone binary that does not need dependencies.

@jonasfj
Copy link
Member

jonasfj commented Dec 2, 2024

You could try another distro / architecture combination, to see if it's related to the hypervisor. Though this is a bit of a shot in the dark.

It could be that BoringSSL uses different instructions that behaves differently when emulated with the hypervisor you have. So trying a different architecture might yield a different result.

You can also see if there are other system certificate lists somewhere on the machine.

Augment the check_domain_access.dart script to dump more information.
Or try to run the check_domain_access.dart with --roots-certs-file.

@samirbilalmemon
Copy link
Author

samirbilalmemon commented Dec 2, 2024

I have tried the unnoficial dart-musl with alpine linux and it also yielded TLS error. How do I augment the check_domain_access.dart script to dump more information?

I will test running the check_domain_access.dart with --root-certs-file and report the result.

@samirbilalmemon
Copy link
Author

Here’s the result, the output has changed compared to the initial run without —root-certs-file that I did earlier.

dart —root-certs-file=/etc/ssl/certs/ca-certificates.crt check_domain_access.dart

Testing host resolves...
- pub.dev IPv4 resolve and connect succeeded: 1 / 1
- pub.dev IPv6 resolve and connect succeeded: 0 / 1
- pub.dartlang.org IPv4 resolve and connect succeeded: 1 / 1
- pub.dartlang.org IPv6 resolve and connect succeeded: 0 / 1
- storage.googleapis.com IPv4 resolve and connect succeeded: 10 / 10
- storage.googleapis.com IPv6 resolve and connect succeeded: 0 / 4
Testing one connection per request...
Unhandled exception:
TlsException: Failure trusting builtin roots (OS Error: 
	DECODE_ERROR(x_x509.c:155)
	ASN.1 encoding routines(pem_info.c:224)
	PEM routines(by_file.c:253), errno = 201326701)
#0      _SecurityContext._trustBuiltinRoots (dart:io-patch/secure_socket_patch.dart:287:37)
#1      new _SecurityContext (dart:io-patch/secure_socket_patch.dart:219:7)
#2      _SecurityContext.defaultContext (dart:io-patch/secure_socket_patch.dart:241:53)
#3      _SecurityContext.defaultContext (dart:io-patch/secure_socket_patch.dart)
#4      SecurityContext.defaultContext (dart:io-patch/secure_socket_patch.dart:205:29)
#5      _RawSecureSocket.connect (dart:io/secure_socket.dart:568:40)
#6      RawSecureSocket.secure (dart:io/secure_socket.dart:373:29)
#7      RawSecureSocket.startConnect.<anonymous closure>.<anonymous closure> (dart:io/secure_socket.dart:302:16)
<asynchronous suspension>
#8      SecureSocket.startConnect.<anonymous closure>.<anonymous closure> (dart:io/secure_socket.dart:84:32)
<asynchronous suspension>
#9      _ConnectionTarget.connect.<anonymous closure>.<anonymous closure> (dart:_http/http_impl.dart:2501:32)
<asynchronous suspension>
#10     _HttpClient._openUrl.<anonymous closure> (dart:_http/http_impl.dart:2791:15)
<asynchronous suspension>
#11     Future.timeout.<anonymous closure> (dart:async/future_impl.dart:963:15)
<asynchronous suspension>
#12     _checkUrlGetContent (file:///root/check_domain_access.dart:76:14)
<asynchronous suspension>
#13     _checkUrls (file:///root/check_domain_access.dart:69:5)
<asynchronous suspension>
#14     main (file:///root/check_domain_access.dart:14:3)
<asynchronous suspension>

@jonasfj
Copy link
Member

jonasfj commented Dec 5, 2024

So there is the possibility this is some sort of weird certificate thing, specifically that this issue is happening because Dart comes with its own set of built-in certificates (I don't actually remember it does, but I think it does).

It's also possible that this is some interaction between the VM special instructions or other thing that causes the certificate verification to fail. Basically, it could be a buggy VM.

It might be wise to see if it's possible to reproduce this issue with chrome inside VM?

Or if a differnet architecture for the VM has the same issue? Or if the same VM on a differnet machine has the same issue?

To be fair: I suspect that running a linux VM on iOS is an edge case, and it certainly at-least plausible that such VM has bugs.

@jonasfj
Copy link
Member

jonasfj commented Dec 5, 2024

Hmm, this is weird the original stack trace says:

FINE: Wrapped exception: HandshakeException: Handshake error in client (OS Error: 
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	DECODE_ERROR(x_x509.c:155)
    | 	ASN.1 encoding routines(pem_oth.c:83)
    | 	PEM routines(by_file.c:136)
    | 	CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:393))

Just wondering if it could be something like: utmapp/UTM#4924

Though I'm not sure how a bug in the VM would cause TLS errors.

@samirbilalmemon
Copy link
Author

The above tests happened on QEMU 7.2. It seems an update to the app was released 4 days ago. I went ahead and updated it and tested changing the CPU to the older 6.2 and the latest 9.1 and neither of them fix the TLS error. I am not sure if I should keep testing the different QEMU cpu available in the app or not.

@jonasfj
Copy link
Member

jonasfj commented Dec 6, 2024

Can reproduce this in another setting, what are the minimal reproduction instructions.

Say we start from an empty VM image.


For the record, it might also be worth searching for similar issues in the Dart SDK. THis isn't really a pub specific issue.

@samirbilalmemon
Copy link
Author

I usually prefer manually installing the image on archlinux arm website but to do it quickly right now I downloaded a fresh arch lnux prebuilt VM from UTM gallery and then used pacman -Sy dart and it continues to have a TLS error on pub get. I recall earlier I even used alpine linux and the unnoficial dart-musl which also gets TLS error. I have had trouble with it taking too long to manually install other linux distributions like debian and ubuntu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants