|
7 | 7 | try:
|
8 | 8 | from urllib.parse import urlsplit, urlunsplit
|
9 | 9 | from urllib.request import Request, urlopen
|
| 10 | + from urllib.error import HTTPError |
10 | 11 | except ImportError:
|
11 | 12 | from urllib2 import Request, urlopen
|
| 13 | + from urllib2 import HTTPError |
12 | 14 | from urlparse import urlsplit, urlunsplit
|
13 | 15 |
|
14 | 16 | from .utils import force_link, ignore_missing_file, in_dir, TempDir, TempFile
|
@@ -121,13 +123,32 @@ def read_lfs_metadata(checkout_dir):
|
121 | 123 | def fetch_urls(lfs_url, lfs_auth_info, oid_list):
|
122 | 124 | """Fetch the URLs of the files from the Git LFS endpoint
|
123 | 125 | """
|
| 126 | + objects = [] |
124 | 127 | data = json.dumps({'operation': 'download', 'objects': oid_list})
|
125 | 128 | headers = dict(POST_HEADERS)
|
126 | 129 | headers.update(lfs_auth_info)
|
127 | 130 | 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 |
131 | 152 |
|
132 | 153 |
|
133 | 154 | def fetch(git_repo, checkout_dir=None, verbose=0):
|
|
0 commit comments