1
- import os
2
1
import json
3
2
import hashlib
3
+ from http import HTTPStatus
4
4
import logging
5
- from urllib .parse import urlparse
6
5
import mimetypes
6
+ import os
7
+ from urllib .parse import urlparse
7
8
8
9
import furl
9
10
import aiohttp
10
11
from aiohttp .errors import ContentEncodingError
11
12
12
13
from waterbutler .core import streams
13
14
14
- from mfr .core import exceptions
15
- from mfr .core import provider
16
- from mfr .core .utils import sizeof_fmt
17
- from mfr .providers .osf import settings
18
- from mfr .settings import MAX_FILE_SIZE_TO_RENDER
19
- from mfr .core .exceptions import TooBigToRenderError
15
+ from mfr import settings as mfr_settings
16
+ from mfr .core import exceptions as mfr_exceptions
17
+ from mfr .core import provider , utils
18
+ from mfr .providers .osf import settings as provider_settings
20
19
21
20
logger = logging .getLogger (__name__ )
22
21
@@ -74,14 +73,14 @@ async def metadata(self):
74
73
response_reason = metadata_response .reason
75
74
response_headers = metadata_response .headers
76
75
await metadata_response .release ()
77
- if response_code != 200 :
78
- raise exceptions .MetadataError (
76
+ if response_code != HTTPStatus . OK :
77
+ raise mfr_exceptions .MetadataError (
79
78
'Failed to fetch file metadata from WaterButler. Received response: ' ,
80
79
'code {} {}' .format (str (response_code ), str (response_reason )),
81
80
metadata_url = download_url ,
82
81
response = response_reason ,
83
82
provider = self .NAME ,
84
- code = 400
83
+ code = HTTPStatus . BAD_REQUEST
85
84
)
86
85
87
86
try :
@@ -104,12 +103,12 @@ async def metadata(self):
104
103
name , ext = os .path .splitext (metadata ['data' ]['name' ])
105
104
size = metadata ['data' ]['size' ]
106
105
107
- max_file_size = MAX_FILE_SIZE_TO_RENDER .get (ext )
106
+ max_file_size = mfr_settings . MAX_FILE_SIZE_TO_RENDER .get (ext )
108
107
if max_file_size and size and int (size ) > max_file_size :
109
- raise TooBigToRenderError (
108
+ raise mfr_exceptions . TooBigToRenderError (
110
109
"This file with extension '{ext}' exceeds the size limit of {max_size} and will not "
111
110
"be rendered. To view this file download it and view it "
112
- "offline." .format (ext = ext , max_size = sizeof_fmt (max_file_size )),
111
+ "offline." .format (ext = ext , max_size = utils . sizeof_fmt (max_file_size )),
113
112
requested_size = int (size ), maximum_size = max_file_size ,
114
113
)
115
114
@@ -121,40 +120,38 @@ async def metadata(self):
121
120
unique_key = hashlib .sha256 ((metadata ['data' ]['etag' ] + cleaned_url .url ).encode ('utf-8' )).hexdigest ()
122
121
123
122
is_public = False
124
-
125
- if 'public_file' in cleaned_url .args :
126
- if cleaned_url .args ['public_file' ] not in ['0' , '1' ]:
127
- raise exceptions .QueryParameterError (
128
- 'The `public_file` query paramter should either `0`, `1`, or unused. Instead '
129
- 'got {}' .format (cleaned_url .args ['public_file' ]),
123
+ public_file = cleaned_url .args .get ('public_file' , None )
124
+ if public_file :
125
+ if public_file not in ['True' , 'False' ]:
126
+ raise mfr_exceptions .QueryParameterError (
127
+ 'Invalid value for query parameter `public_file`: {}' .format (cleaned_url .args ['public_file' ]),
130
128
url = download_url ,
131
129
provider = self .NAME ,
132
- code = 400 ,
130
+ code = HTTPStatus . BAD_REQUEST ,
133
131
)
134
-
135
- is_public = cleaned_url .args ['public_file' ] == '1'
132
+ is_public = public_file == 'True'
136
133
137
134
return provider .ProviderMetadata (name , ext , content_type ,
138
135
unique_key , download_url , is_public = is_public )
139
136
140
137
async def download (self ):
141
138
"""Download file from WaterButler, returning stream."""
142
139
download_url = await self ._fetch_download_url ()
143
- headers = {settings .MFR_IDENTIFYING_HEADER : '1' }
140
+ headers = {provider_settings .MFR_IDENTIFYING_HEADER : '1' }
144
141
response = await self ._make_request ('GET' , download_url , allow_redirects = False , headers = headers )
145
142
146
- if response .status >= 400 :
143
+ if response .status >= HTTPStatus . BAD_REQUEST :
147
144
resp_text = await response .text ()
148
145
logger .error ('Unable to download file: ({}) {}' .format (response .status , resp_text ))
149
- raise exceptions .DownloadError (
146
+ raise mfr_exceptions .DownloadError (
150
147
'Unable to download the requested file, please try again later.' ,
151
148
download_url = download_url ,
152
149
response = resp_text ,
153
150
provider = self .NAME ,
154
151
)
155
152
156
153
self .metrics .add ('download.saw_redirect' , False )
157
- if response .status in (302 , 301 ):
154
+ if response .status in (HTTPStatus . MOVED_PERMANENTLY , HTTPStatus . FOUND ):
158
155
await response .release ()
159
156
response = await aiohttp .request ('GET' , response .headers ['location' ])
160
157
self .metrics .add ('download.saw_redirect' , True )
@@ -186,8 +183,8 @@ async def _fetch_download_url(self):
186
183
)
187
184
await request .release ()
188
185
189
- if request .status != 302 :
190
- raise exceptions .MetadataError (
186
+ if request .status != HTTPStatus . FOUND :
187
+ raise mfr_exceptions .MetadataError (
191
188
request .reason ,
192
189
metadata_url = self .url ,
193
190
provider = self .NAME ,
0 commit comments