33
44import requests
55
6+ __all__ = ['RemoteIOError' , 'RemoteZip' ]
7+
68
79class OutOfBound (Exception ):
810 pass
@@ -18,7 +20,6 @@ def __init__(self, buffer, offset, size, stream):
1820 self .offset = offset
1921 self .size = size
2022 self .position = offset
21- self .position_oob = False
2223 self .stream = stream
2324
2425 def __repr__ (self ):
@@ -49,14 +50,11 @@ def seek(self, offset, whence):
4950 relative_position = self .position - self .offset
5051
5152 if relative_position < 0 or relative_position >= self .size :
52- self .position_oob = True
5353 raise OutOfBound ("Position out of buffer bound" )
5454
55- self .position_oob = False
5655 if self .stream :
5756 buff_pos = self .buffer .tell ()
5857 if relative_position < buff_pos :
59- self .position_oob = True
6058 raise OutOfBound ("Negative seek not supported" )
6159
6260 skip_bytes = relative_position - buff_pos
@@ -76,6 +74,7 @@ def __init__(self, fetch_fun, initial_buffer_size=64*1024):
7674 self .buffer = None
7775 self .file_size = None
7876 self .position = None
77+ self ._seek_succeeded = False
7978 self .member_pos2size = None
8079
8180 def set_pos2size (self , pos2size ):
@@ -85,16 +84,15 @@ def read(self, size=0):
8584 if size == 0 :
8685 size = self .file_size - self .buffer .position
8786
88- if self .buffer . position_oob :
87+ if not self ._seek_succeeded :
8988 if self .member_pos2size is None :
9089 fetch_size = size
9190 stream = False
9291 else :
9392 fetch_size = self .member_pos2size [self .buffer .position ]
94- if fetch_size is None :
95- fetch_size = self .file_size - self .buffer .position
9693 stream = True
9794
95+ self ._seek_succeeded = True
9896 self .buffer .close ()
9997 self .buffer = self .fetch_fun ((self .buffer .position , self .buffer .position + fetch_size - 1 ), stream = stream )
10098
@@ -107,8 +105,11 @@ def seek(self, offset, whence=0):
107105 self .file_size = self .buffer .size + self .buffer .position
108106
109107 try :
110- return self .buffer .seek (offset , whence )
108+ pos = self .buffer .seek (offset , whence )
109+ self ._seek_succeeded = True
110+ return pos
111111 except OutOfBound :
112+ self ._seek_succeeded = False
112113 return self .buffer .position # we ignore the issue here, we will check if buffer is fine during read
113114
114115 def tell (self ):
@@ -134,7 +135,7 @@ def get_position2size(self):
134135 if len (ilist ) == 0 :
135136 return {}
136137
137- position2size = {ilist [- 1 ].header_offset : None }
138+ position2size = {ilist [- 1 ].header_offset : self . start_dir - ilist [ - 1 ]. header_offset }
138139 for i in range (len (ilist ) - 1 ):
139140 m1 , m2 = ilist [i : i + 2 ]
140141 position2size [m1 .header_offset ] = m2 .header_offset - m1 .header_offset
0 commit comments