1- import os
21import json
32import hashlib
3+ from http import HTTPStatus
44import logging
5- from urllib .parse import urlparse
65import mimetypes
6+ import os
7+ from urllib .parse import urlparse
78
89import furl
910import aiohttp
1011from aiohttp .errors import ContentEncodingError
1112
1213from waterbutler .core import streams
1314
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 core_exceptions
17+ from mfr .core import provider , utils
18+ from mfr .providers .osf import settings as provider_settings
2019
2120logger = logging .getLogger (__name__ )
2221
@@ -74,14 +73,14 @@ async def metadata(self):
7473 response_reason = metadata_response .reason
7574 response_headers = metadata_response .headers
7675 await metadata_response .release ()
77- if response_code != 200 :
78- raise exceptions .MetadataError (
76+ if response_code != HTTPStatus . OK :
77+ raise core_exceptions .MetadataError (
7978 'Failed to fetch file metadata from WaterButler. Received response: ' ,
8079 'code {} {}' .format (str (response_code ), str (response_reason )),
8180 metadata_url = download_url ,
8281 response = response_reason ,
8382 provider = self .NAME ,
84- code = 400
83+ code = HTTPStatus . BAD_REQUEST
8584 )
8685
8786 try :
@@ -104,12 +103,12 @@ async def metadata(self):
104103 name , ext = os .path .splitext (metadata ['data' ]['name' ])
105104 size = metadata ['data' ]['size' ]
106105
107- max_file_size = MAX_FILE_SIZE_TO_RENDER .get (ext )
106+ max_file_size = mfr_settings . MAX_FILE_SIZE_TO_RENDER .get (ext )
108107 if max_file_size and size and int (size ) > max_file_size :
109- raise TooBigToRenderError (
108+ raise core_exceptions . TooBigToRenderError (
110109 "This file with extension '{ext}' exceeds the size limit of {max_size} and will not "
111110 "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 )),
113112 requested_size = int (size ), maximum_size = max_file_size ,
114113 )
115114
@@ -121,40 +120,38 @@ async def metadata(self):
121120 unique_key = hashlib .sha256 ((metadata ['data' ]['etag' ] + cleaned_url .url ).encode ('utf-8' )).hexdigest ()
122121
123122 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 core_exceptions .QueryParameterError (
127+ 'Invalid value for query parameter `public_file`: {}' .format (cleaned_url .args ['public_file' ]),
130128 url = download_url ,
131129 provider = self .NAME ,
132- code = 400 ,
130+ code = HTTPStatus . BAD_REQUEST ,
133131 )
134-
135- is_public = cleaned_url .args ['public_file' ] == '1'
132+ is_public = public_file == 'True'
136133
137134 return provider .ProviderMetadata (name , ext , content_type ,
138135 unique_key , download_url , is_public = is_public )
139136
140137 async def download (self ):
141138 """Download file from WaterButler, returning stream."""
142139 download_url = await self ._fetch_download_url ()
143- headers = {settings .MFR_IDENTIFYING_HEADER : '1' }
140+ headers = {provider_settings .MFR_IDENTIFYING_HEADER : '1' }
144141 response = await self ._make_request ('GET' , download_url , allow_redirects = False , headers = headers )
145142
146- if response .status >= 400 :
143+ if response .status >= HTTPStatus . BAD_REQUEST :
147144 resp_text = await response .text ()
148145 logger .error ('Unable to download file: ({}) {}' .format (response .status , resp_text ))
149- raise exceptions .DownloadError (
146+ raise core_exceptions .DownloadError (
150147 'Unable to download the requested file, please try again later.' ,
151148 download_url = download_url ,
152149 response = resp_text ,
153150 provider = self .NAME ,
154151 )
155152
156153 self .metrics .add ('download.saw_redirect' , False )
157- if response .status in (302 , 301 ):
154+ if response .status in (HTTPStatus . MOVED_PERMANENTLY , HTTPStatus . FOUND ):
158155 await response .release ()
159156 response = await aiohttp .request ('GET' , response .headers ['location' ])
160157 self .metrics .add ('download.saw_redirect' , True )
@@ -186,8 +183,8 @@ async def _fetch_download_url(self):
186183 )
187184 await request .release ()
188185
189- if request .status != 302 :
190- raise exceptions .MetadataError (
186+ if request .status != HTTPStatus . FOUND :
187+ raise core_exceptions .MetadataError (
191188 request .reason ,
192189 metadata_url = self .url ,
193190 provider = self .NAME ,
0 commit comments