Enable default request timeout of 300 seconds (#870)
Sets a default request timeout of 300 seconds to fix Instaloader hanging indefinitely when used on an unstable internet connection without using --request-timeout, such as in #810.
This commit is contained in:
parent
b57bbe2af0
commit
1c2e226630
@ -238,10 +238,13 @@ How to Download
|
|||||||
|
|
||||||
.. option:: --request-timeout N
|
.. option:: --request-timeout N
|
||||||
|
|
||||||
Seconds to wait before timing out a connection request.
|
Seconds to wait before timing out a connection request. Defaults to 300.
|
||||||
|
|
||||||
.. versionadded:: 4.3
|
.. versionadded:: 4.3
|
||||||
|
|
||||||
|
.. versionchanged:: 4.6
|
||||||
|
Enabled this option by default with a timeout of 300 seconds.
|
||||||
|
|
||||||
Miscellaneous Options
|
Miscellaneous Options
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -366,8 +366,8 @@ def main():
|
|||||||
'connection fails, it can be manually skipped by hitting CTRL+C. Set this to 0 to retry '
|
'connection fails, it can be manually skipped by hitting CTRL+C. Set this to 0 to retry '
|
||||||
'infinitely.')
|
'infinitely.')
|
||||||
g_how.add_argument('--commit-mode', action='store_true', help=SUPPRESS)
|
g_how.add_argument('--commit-mode', action='store_true', help=SUPPRESS)
|
||||||
g_how.add_argument('--request-timeout', metavar='N', type=float,
|
g_how.add_argument('--request-timeout', metavar='N', type=float, default=300.0,
|
||||||
help='seconds to wait before timing out a connection request')
|
help='Seconds to wait before timing out a connection request. Defaults to 300.')
|
||||||
|
|
||||||
g_misc = parser.add_argument_group('Miscellaneous Options')
|
g_misc = parser.add_argument_group('Miscellaneous Options')
|
||||||
g_misc.add_argument('-q', '--quiet', action='store_true',
|
g_misc.add_argument('-q', '--quiet', action='store_true',
|
||||||
|
@ -179,7 +179,7 @@ class Instaloader:
|
|||||||
post_metadata_txt_pattern: str = None,
|
post_metadata_txt_pattern: str = None,
|
||||||
storyitem_metadata_txt_pattern: str = None,
|
storyitem_metadata_txt_pattern: str = None,
|
||||||
max_connection_attempts: int = 3,
|
max_connection_attempts: int = 3,
|
||||||
request_timeout: Optional[float] = None,
|
request_timeout: float = 300.0,
|
||||||
rate_controller: Optional[Callable[[InstaloaderContext], RateController]] = None,
|
rate_controller: Optional[Callable[[InstaloaderContext], RateController]] = None,
|
||||||
resume_prefix: Optional[str] = "iterator",
|
resume_prefix: Optional[str] = "iterator",
|
||||||
check_resume_bbd: bool = True):
|
check_resume_bbd: bool = True):
|
||||||
|
@ -25,10 +25,9 @@ def copy_session(session: requests.Session, request_timeout: Optional[float] = N
|
|||||||
new = requests.Session()
|
new = requests.Session()
|
||||||
new.cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies))
|
new.cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies))
|
||||||
new.headers = session.headers.copy()
|
new.headers = session.headers.copy()
|
||||||
if request_timeout is not None:
|
# Override default timeout behavior.
|
||||||
# Override default timeout behavior.
|
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
||||||
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
new.request = partial(new.request, timeout=request_timeout) # type: ignore
|
||||||
new.request = partial(new.request, timeout=request_timeout) # type: ignore
|
|
||||||
return new
|
return new
|
||||||
|
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ class InstaloaderContext:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, sleep: bool = True, quiet: bool = False, user_agent: Optional[str] = None,
|
def __init__(self, sleep: bool = True, quiet: bool = False, user_agent: Optional[str] = None,
|
||||||
max_connection_attempts: int = 3, request_timeout: Optional[float] = None,
|
max_connection_attempts: int = 3, request_timeout: float = 300.0,
|
||||||
rate_controller: Optional[Callable[["InstaloaderContext"], "RateController"]] = None):
|
rate_controller: Optional[Callable[["InstaloaderContext"], "RateController"]] = None):
|
||||||
|
|
||||||
self.user_agent = user_agent if user_agent is not None else default_user_agent()
|
self.user_agent = user_agent if user_agent is not None else default_user_agent()
|
||||||
@ -161,10 +160,9 @@ class InstaloaderContext:
|
|||||||
'ig_vw': '1920', 'csrftoken': '',
|
'ig_vw': '1920', 'csrftoken': '',
|
||||||
's_network': '', 'ds_user_id': ''})
|
's_network': '', 'ds_user_id': ''})
|
||||||
session.headers.update(self._default_http_header(empty_session_only=True))
|
session.headers.update(self._default_http_header(empty_session_only=True))
|
||||||
if self.request_timeout is not None:
|
# Override default timeout behavior.
|
||||||
# Override default timeout behavior.
|
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
||||||
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
session.request = partial(session.request, timeout=self.request_timeout) # type: ignore
|
||||||
session.request = partial(session.request, timeout=self.request_timeout) # type: ignore
|
|
||||||
return session
|
return session
|
||||||
|
|
||||||
def save_session_to_file(self, sessionfile):
|
def save_session_to_file(self, sessionfile):
|
||||||
@ -177,10 +175,9 @@ class InstaloaderContext:
|
|||||||
session.cookies = requests.utils.cookiejar_from_dict(pickle.load(sessionfile))
|
session.cookies = requests.utils.cookiejar_from_dict(pickle.load(sessionfile))
|
||||||
session.headers.update(self._default_http_header())
|
session.headers.update(self._default_http_header())
|
||||||
session.headers.update({'X-CSRFToken': session.cookies.get_dict()['csrftoken']})
|
session.headers.update({'X-CSRFToken': session.cookies.get_dict()['csrftoken']})
|
||||||
if self.request_timeout is not None:
|
# Override default timeout behavior.
|
||||||
# Override default timeout behavior.
|
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
||||||
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
session.request = partial(session.request, timeout=self.request_timeout) # type: ignore
|
||||||
session.request = partial(session.request, timeout=self.request_timeout) # type: ignore
|
|
||||||
self._session = session
|
self._session = session
|
||||||
self.username = username
|
self.username = username
|
||||||
|
|
||||||
@ -206,10 +203,9 @@ class InstaloaderContext:
|
|||||||
'ig_vw': '1920', 'ig_cb': '1', 'csrftoken': '',
|
'ig_vw': '1920', 'ig_cb': '1', 'csrftoken': '',
|
||||||
's_network': '', 'ds_user_id': ''})
|
's_network': '', 'ds_user_id': ''})
|
||||||
session.headers.update(self._default_http_header())
|
session.headers.update(self._default_http_header())
|
||||||
if self.request_timeout is not None:
|
# Override default timeout behavior.
|
||||||
# Override default timeout behavior.
|
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
||||||
# Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427
|
session.request = partial(session.request, timeout=self.request_timeout) # type: ignore
|
||||||
session.request = partial(session.request, timeout=self.request_timeout) # type: ignore
|
|
||||||
session.get('https://www.instagram.com/web/__mid/')
|
session.get('https://www.instagram.com/web/__mid/')
|
||||||
csrf_token = session.cookies.get_dict()['csrftoken']
|
csrf_token = session.cookies.get_dict()['csrftoken']
|
||||||
session.headers.update({'X-CSRFToken': csrf_token})
|
session.headers.update({'X-CSRFToken': csrf_token})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user