Skip to content

Commit e810b70

Browse files
swistakmChangaco
authored andcommitted
Handle too big requests by recursively splitting requests on HTTP 413 responses. (#7)
1 parent 288ce3b commit e810b70

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

git_lfs/__init__.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
try:
88
from urllib.parse import urlsplit, urlunsplit
99
from urllib.request import Request, urlopen
10+
from urllib.error import HTTPError
1011
except ImportError:
1112
from urllib2 import Request, urlopen
13+
from urllib2 import HTTPError
1214
from urlparse import urlsplit, urlunsplit
1315

1416
from .utils import force_link, ignore_missing_file, in_dir, TempDir, TempFile
@@ -121,13 +123,32 @@ def read_lfs_metadata(checkout_dir):
121123
def fetch_urls(lfs_url, lfs_auth_info, oid_list):
122124
"""Fetch the URLs of the files from the Git LFS endpoint
123125
"""
126+
objects = []
124127
data = json.dumps({'operation': 'download', 'objects': oid_list})
125128
headers = dict(POST_HEADERS)
126129
headers.update(lfs_auth_info)
127130
req = Request(lfs_url+'/objects/batch', data.encode('ascii'), headers)
128-
resp = json.loads(urlopen(req).read().decode('ascii'))
129-
assert 'objects' in resp, resp
130-
return resp['objects']
131+
132+
try:
133+
resp = json.loads(urlopen(req).read().decode('ascii'))
134+
assert 'objects' in resp, resp
135+
objects.extend(resp['objects'])
136+
137+
except HTTPError as err:
138+
if err.code != 413:
139+
raise
140+
141+
# It is possible for remote server to respond with 413 Request Entity
142+
# Too Large. If that happens try to request for two sets of oids so
143+
# request is smaller.
144+
objects.extend(
145+
fetch_urls(lfs_url, lfs_auth_info, oid_list[:len(oid_list) // 2])
146+
)
147+
objects.extend(
148+
fetch_urls(lfs_url, lfs_auth_info, oid_list[len(oid_list) // 2:])
149+
)
150+
151+
return objects
131152

132153

133154
def fetch(git_repo, checkout_dir=None, verbose=0):

0 commit comments

Comments
 (0)