forked from platformio/platformio-core
Set default timeout for http requests // Resolve #3623
This commit is contained in:
@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
DEFAULT_REQUESTS_TIMEOUT = (10, None) # (connect, read)
|
||||||
|
|
||||||
VERSION = (4, 4, "0a8")
|
VERSION = (4, 4, "0a8")
|
||||||
__version__ = ".".join([str(s) for s in VERSION])
|
__version__ = ".".join([str(s) for s in VERSION])
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ from __future__ import absolute_import
|
|||||||
import codecs
|
import codecs
|
||||||
import getpass
|
import getpass
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import socket
|
import socket
|
||||||
@ -25,9 +26,7 @@ from os import environ, getenv, listdir, remove
|
|||||||
from os.path import dirname, isdir, isfile, join, realpath
|
from os.path import dirname, isdir, isfile, join, realpath
|
||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
import requests
|
from platformio import __version__, exception, fs, proc, util
|
||||||
|
|
||||||
from platformio import __version__, exception, fs, proc
|
|
||||||
from platformio.compat import WINDOWS, dump_json_to_unicode, hashlib_encode_data
|
from platformio.compat import WINDOWS, dump_json_to_unicode, hashlib_encode_data
|
||||||
from platformio.package.lockfile import LockFile
|
from platformio.package.lockfile import LockFile
|
||||||
from platformio.project.helpers import (
|
from platformio.project.helpers import (
|
||||||
@ -403,16 +402,14 @@ def get_cid():
|
|||||||
uid = getenv("C9_UID")
|
uid = getenv("C9_UID")
|
||||||
elif getenv("CHE_API", getenv("CHE_API_ENDPOINT")):
|
elif getenv("CHE_API", getenv("CHE_API_ENDPOINT")):
|
||||||
try:
|
try:
|
||||||
uid = (
|
uid = json.loads(
|
||||||
requests.get(
|
util.fetch_remote_content(
|
||||||
"{api}/user?token={token}".format(
|
"{api}/user?token={token}".format(
|
||||||
api=getenv("CHE_API", getenv("CHE_API_ENDPOINT")),
|
api=getenv("CHE_API", getenv("CHE_API_ENDPOINT")),
|
||||||
token=getenv("USER_TOKEN"),
|
token=getenv("USER_TOKEN"),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.json()
|
).get("id")
|
||||||
.get("id")
|
|
||||||
)
|
|
||||||
except: # pylint: disable=bare-except
|
except: # pylint: disable=bare-except
|
||||||
pass
|
pass
|
||||||
if not uid:
|
if not uid:
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
import requests.adapters
|
import requests.adapters
|
||||||
from requests.packages.urllib3.util.retry import Retry # pylint:disable=import-error
|
from requests.packages.urllib3.util.retry import Retry # pylint:disable=import-error
|
||||||
|
|
||||||
from platformio import app, util
|
from platformio import DEFAULT_REQUESTS_TIMEOUT, app, util
|
||||||
from platformio.exception import PlatformioException
|
from platformio.exception import PlatformioException
|
||||||
|
|
||||||
|
|
||||||
@ -58,6 +58,11 @@ class HTTPClient(object):
|
|||||||
# check Internet before and resolve issue with 60 seconds timeout
|
# check Internet before and resolve issue with 60 seconds timeout
|
||||||
# print(self, method, path, kwargs)
|
# print(self, method, path, kwargs)
|
||||||
util.internet_on(raise_exception=True)
|
util.internet_on(raise_exception=True)
|
||||||
|
|
||||||
|
# set default timeout
|
||||||
|
if "timeout" not in kwargs:
|
||||||
|
kwargs["timeout"] = DEFAULT_REQUESTS_TIMEOUT
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return getattr(self._session, method)(self.base_url + path, **kwargs)
|
return getattr(self._session, method)(self.base_url + path, **kwargs)
|
||||||
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
|
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
|
||||||
|
@ -22,7 +22,7 @@ from functools import cmp_to_key
|
|||||||
import click
|
import click
|
||||||
from twisted.internet import defer # pylint: disable=import-error
|
from twisted.internet import defer # pylint: disable=import-error
|
||||||
|
|
||||||
from platformio import app, fs, util
|
from platformio import DEFAULT_REQUESTS_TIMEOUT, app, fs, util
|
||||||
from platformio.commands.home import helpers
|
from platformio.commands.home import helpers
|
||||||
from platformio.compat import PY2, get_filesystem_encoding, glob_recursive
|
from platformio.compat import PY2, get_filesystem_encoding, glob_recursive
|
||||||
|
|
||||||
@ -51,9 +51,13 @@ class OSRPC(object):
|
|||||||
|
|
||||||
session = helpers.requests_session()
|
session = helpers.requests_session()
|
||||||
if data:
|
if data:
|
||||||
r = yield session.post(uri, data=data, headers=headers)
|
r = yield session.post(
|
||||||
|
uri, data=data, headers=headers, timeout=DEFAULT_REQUESTS_TIMEOUT
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
r = yield session.get(uri, headers=headers)
|
r = yield session.get(
|
||||||
|
uri, headers=headers, timeout=DEFAULT_REQUESTS_TIMEOUT
|
||||||
|
)
|
||||||
|
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
result = r.text
|
result = r.text
|
||||||
|
@ -12,14 +12,14 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
import click
|
import click
|
||||||
import requests
|
|
||||||
|
|
||||||
from platformio import VERSION, __version__, app, exception
|
from platformio import VERSION, __version__, app, exception, util
|
||||||
from platformio.compat import WINDOWS
|
from platformio.compat import WINDOWS
|
||||||
from platformio.proc import exec_command, get_pythonexe_path
|
from platformio.proc import exec_command, get_pythonexe_path
|
||||||
from platformio.project.helpers import get_project_cache_dir
|
from platformio.project.helpers import get_project_cache_dir
|
||||||
@ -130,13 +130,11 @@ def get_latest_version():
|
|||||||
|
|
||||||
def get_develop_latest_version():
|
def get_develop_latest_version():
|
||||||
version = None
|
version = None
|
||||||
r = requests.get(
|
content = util.fetch_remote_content(
|
||||||
"https://raw.githubusercontent.com/platformio/platformio"
|
"https://raw.githubusercontent.com/platformio/platformio"
|
||||||
"/develop/platformio/__init__.py",
|
"/develop/platformio/__init__.py"
|
||||||
headers={"User-Agent": app.get_user_agent()},
|
|
||||||
)
|
)
|
||||||
r.raise_for_status()
|
for line in content.split("\n"):
|
||||||
for line in r.text.split("\n"):
|
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if not line.startswith("VERSION"):
|
if not line.startswith("VERSION"):
|
||||||
continue
|
continue
|
||||||
@ -152,9 +150,5 @@ def get_develop_latest_version():
|
|||||||
|
|
||||||
|
|
||||||
def get_pypi_latest_version():
|
def get_pypi_latest_version():
|
||||||
r = requests.get(
|
content = util.fetch_remote_content("https://pypi.org/pypi/platformio/json")
|
||||||
"https://pypi.org/pypi/platformio/json",
|
return json.loads(content)["info"]["version"]
|
||||||
headers={"User-Agent": app.get_user_agent()},
|
|
||||||
)
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.json()["info"]["version"]
|
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
import io
|
import io
|
||||||
import math
|
import math
|
||||||
import sys
|
|
||||||
from email.utils import parsedate_tz
|
from email.utils import parsedate_tz
|
||||||
from os.path import getsize, join
|
from os.path import getsize, join
|
||||||
from time import mktime
|
from time import mktime
|
||||||
@ -22,7 +21,7 @@ from time import mktime
|
|||||||
import click
|
import click
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from platformio import app, fs, util
|
from platformio import DEFAULT_REQUESTS_TIMEOUT, app, fs, util
|
||||||
from platformio.package.exception import PackageException
|
from platformio.package.exception import PackageException
|
||||||
|
|
||||||
|
|
||||||
@ -34,7 +33,7 @@ class FileDownloader(object):
|
|||||||
url,
|
url,
|
||||||
stream=True,
|
stream=True,
|
||||||
headers={"User-Agent": app.get_user_agent()},
|
headers={"User-Agent": app.get_user_agent()},
|
||||||
verify=sys.version_info >= (2, 7, 9),
|
timeout=DEFAULT_REQUESTS_TIMEOUT,
|
||||||
)
|
)
|
||||||
if self._request.status_code != 200:
|
if self._request.status_code != 200:
|
||||||
raise PackageException(
|
raise PackageException(
|
||||||
|
@ -19,8 +19,6 @@ import os
|
|||||||
import re
|
import re
|
||||||
import tarfile
|
import tarfile
|
||||||
|
|
||||||
import requests
|
|
||||||
|
|
||||||
from platformio import util
|
from platformio import util
|
||||||
from platformio.compat import get_object_members, string_types
|
from platformio.compat import get_object_members, string_types
|
||||||
from platformio.package.exception import ManifestParserError, UnknownManifestError
|
from platformio.package.exception import ManifestParserError, UnknownManifestError
|
||||||
@ -108,10 +106,9 @@ class ManifestParserFactory(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def new_from_url(remote_url):
|
def new_from_url(remote_url):
|
||||||
r = requests.get(remote_url)
|
content = util.fetch_remote_content(remote_url)
|
||||||
r.raise_for_status()
|
|
||||||
return ManifestParserFactory.new(
|
return ManifestParserFactory.new(
|
||||||
r.text,
|
content,
|
||||||
ManifestFileType.from_uri(remote_url) or ManifestFileType.LIBRARY_JSON,
|
ManifestFileType.from_uri(remote_url) or ManifestFileType.LIBRARY_JSON,
|
||||||
remote_url,
|
remote_url,
|
||||||
)
|
)
|
||||||
|
@ -14,11 +14,14 @@
|
|||||||
|
|
||||||
# pylint: disable=too-many-ancestors
|
# pylint: disable=too-many-ancestors
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
import marshmallow
|
import marshmallow
|
||||||
import requests
|
import requests
|
||||||
import semantic_version
|
import semantic_version
|
||||||
from marshmallow import Schema, ValidationError, fields, validate, validates
|
from marshmallow import Schema, ValidationError, fields, validate, validates
|
||||||
|
|
||||||
|
from platformio import util
|
||||||
from platformio.package.exception import ManifestValidationError
|
from platformio.package.exception import ManifestValidationError
|
||||||
from platformio.util import memoized
|
from platformio.util import memoized
|
||||||
|
|
||||||
@ -248,9 +251,9 @@ class ManifestSchema(BaseSchema):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
@memoized(expire="1h")
|
@memoized(expire="1h")
|
||||||
def load_spdx_licenses():
|
def load_spdx_licenses():
|
||||||
r = requests.get(
|
version = "3.10"
|
||||||
|
spdx_data_url = (
|
||||||
"https://raw.githubusercontent.com/spdx/license-list-data"
|
"https://raw.githubusercontent.com/spdx/license-list-data"
|
||||||
"/v3.10/json/licenses.json"
|
"/v%s/json/licenses.json" % version
|
||||||
)
|
)
|
||||||
r.raise_for_status()
|
return json.loads(util.fetch_remote_content(spdx_data_url))
|
||||||
return r.json()
|
|
||||||
|
@ -29,7 +29,7 @@ from glob import glob
|
|||||||
import click
|
import click
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from platformio import __apiurl__, __version__, exception
|
from platformio import DEFAULT_REQUESTS_TIMEOUT, __apiurl__, __version__, exception
|
||||||
from platformio.commands import PlatformioCLI
|
from platformio.commands import PlatformioCLI
|
||||||
from platformio.compat import PY2, WINDOWS
|
from platformio.compat import PY2, WINDOWS
|
||||||
from platformio.fs import cd # pylint: disable=unused-import
|
from platformio.fs import cd # pylint: disable=unused-import
|
||||||
@ -303,10 +303,16 @@ def _get_api_result(
|
|||||||
headers=headers,
|
headers=headers,
|
||||||
auth=auth,
|
auth=auth,
|
||||||
verify=verify_ssl,
|
verify=verify_ssl,
|
||||||
|
timeout=DEFAULT_REQUESTS_TIMEOUT,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
r = _api_request_session().get(
|
r = _api_request_session().get(
|
||||||
url, params=params, headers=headers, auth=auth, verify=verify_ssl
|
url,
|
||||||
|
params=params,
|
||||||
|
headers=headers,
|
||||||
|
auth=auth,
|
||||||
|
verify=verify_ssl,
|
||||||
|
timeout=DEFAULT_REQUESTS_TIMEOUT,
|
||||||
)
|
)
|
||||||
result = r.json()
|
result = r.json()
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
@ -398,6 +404,22 @@ def internet_on(raise_exception=False):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_remote_content(*args, **kwargs):
|
||||||
|
# pylint: disable=import-outside-toplevel
|
||||||
|
from platformio.app import get_user_agent
|
||||||
|
|
||||||
|
kwargs["headers"] = kwargs.get("headers", {})
|
||||||
|
if "User-Agent" not in kwargs["headers"]:
|
||||||
|
kwargs["headers"]["User-Agent"] = get_user_agent()
|
||||||
|
|
||||||
|
if "timeout" not in kwargs:
|
||||||
|
kwargs["timeout"] = DEFAULT_REQUESTS_TIMEOUT
|
||||||
|
|
||||||
|
r = requests.get(*args, **kwargs)
|
||||||
|
r.raise_for_status()
|
||||||
|
return r.text
|
||||||
|
|
||||||
|
|
||||||
def pepver_to_semver(pepver):
|
def pepver_to_semver(pepver):
|
||||||
return re.sub(r"(\.\d+)\.?(dev|a|b|rc|post)", r"\1-\2.", pepver, 1)
|
return re.sub(r"(\.\d+)\.?(dev|a|b|rc|post)", r"\1-\2.", pepver, 1)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user