@@ -1011,6 +1011,60 @@ def upload_file_to_pysftp_string(data, url):
10111011 return False
10121012 return upload_file_to_sftp_string (data , url )
10131013
1014+ def decoded_stream (resp ):
1015+ # resp can be urllib response or anything file-like with headers
1016+ enc = None
1017+ try :
1018+ enc = resp .headers .get ("Content-Encoding" )
1019+ except Exception :
1020+ pass
1021+
1022+ if not enc :
1023+ return resp
1024+
1025+ enc = enc .lower ().strip ()
1026+
1027+ if enc == "gzip" :
1028+ return gzip .GzipFile (fileobj = resp )
1029+ if enc == "deflate" :
1030+ # deflate is ambiguous; try zlib header first, then raw deflate
1031+ data = resp .read ()
1032+ try :
1033+ return io .BytesIO (zlib .decompress (data ))
1034+ except zlib .error :
1035+ return io .BytesIO (zlib .decompress (data , - zlib .MAX_WBITS ))
1036+
1037+ # br requires brotli package; zstd requires zstandard package.
1038+ # If you need these, handle here.
1039+ return resp
1040+
1041+ def decoded_stream (resp ):
1042+ # resp can be urllib response or anything file-like with headers
1043+ enc = None
1044+ try :
1045+ enc = resp .headers .get ("Content-Encoding" )
1046+ except Exception :
1047+ pass
1048+
1049+ if not enc :
1050+ return resp
1051+
1052+ enc = enc .lower ().strip ()
1053+
1054+ if enc == "gzip" :
1055+ return gzip .GzipFile (fileobj = resp )
1056+ if enc == "deflate" :
1057+ # deflate is ambiguous; try zlib header first, then raw deflate
1058+ data = resp .read ()
1059+ try :
1060+ return io .BytesIO (zlib .decompress (data ))
1061+ except zlib .error :
1062+ return io .BytesIO (zlib .decompress (data , - zlib .MAX_WBITS ))
1063+
1064+ # br requires brotli package; zstd requires zstandard package.
1065+ # If you need these, handle here.
1066+ return resp
1067+
10141068# --------------------------
10151069# HTTP helpers (download only)
10161070# --------------------------
@@ -1103,7 +1157,8 @@ def download_file_from_http_file(url, headers=None, usehttp=__use_http_lib__):
11031157 else :
11041158 opener = build_opener ()
11051159 resp = opener .open (req )
1106- shutil .copyfileobj (resp , httpfile )
1160+ resp2 = decoded_stream (resp )
1161+ shutil .copyfileobj (resp2 , httpfile )
11071162
11081163 try :
11091164 httpfile .seek (0 , 0 )
0 commit comments