Set default timeout for http requests // Resolve #3623

This commit is contained in:
Ivan Kravets
2020-08-16 20:21:30 +03:00
parent 67e6d177b4
commit 808852f4cc
9 changed files with 62 additions and 39 deletions

View File

@ -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])

View File

@ -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:

View File

@ -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:

View File

@ -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

View File

@ -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"]

View File

@ -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(

View File

@ -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,
) )

View File

@ -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()

View File

@ -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)