Index: samesite.py ================================================================== --- samesite.py +++ samesite.py @@ -1,6 +1,6 @@ -#!/usr/bin/env python3.1 +#!/usr/bin/env python3.2 import datetime, http.cookiejar, os, sys, shelve, spacemap, re, urllib.request class Config: __slots__ = frozenset(['_config', '_default', '_section', 'options', 'root']) @@ -83,11 +83,11 @@ 'Date', 'Expires', 'Referer', 'Server', 'Via', - 'X-Cache', 'X-Cache-Lookup', 'X-Powered-By' + 'X-Cache', 'X-Cache-Lookup', 'X-Powered-By', ]) block_size = 4096 import http.server @@ -140,11 +140,11 @@ 'Host', 'If-Modified-Since', 'If-Unmodified-Since', 'Referer', 'User-Agent', 'Via', - 'X-Forwarded-For', 'X-REMOVED', + 'X-Forwarded-For', 'X-Last-HR', 'X-Last-HTTP-Status-Code', 'X-REMOVED', 'X-Real-IP', 'X-Retry-Count', ]) print('===============[ {} request ]==='.format(self.command)) for header in self.headers: @@ -228,11 +228,11 @@ needed = None if '_parts' in record and record['_parts'] != None: if config['noparts'] != 'no' or requested_ranges == None or requested_ranges == spacemap.SpaceMap(): needed = record['_parts'] else: - needed = record['_parts'] | requested_ranges + needed = record['_parts'] & requested_ranges elif config['noparts'] =='no' and requested_ranges != None and requested_ranges != spacemap.SpaceMap(): needed = requested_ranges ranges = () print('Missing ranges: {}, requested ranges: {}, needed ranges: {}.'.format(record['_parts'], requested_ranges, needed)) if needed != None and len(needed) > 0: @@ -295,11 +295,14 @@ print('Reloading.') if os.access(temp_name, os.R_OK): os.unlink(temp_name) if os.access(file_name, os.R_OK): os.unlink(file_name) - new_record['_parts'] = spacemap.SpaceMap({0: int(new_record['Content-Length'])}) + if 'Content-Length' in new_record: + new_record['_parts'] = spacemap.SpaceMap({0: int(new_record['Content-Length'])}) + else: + new_record['_parts'] = spacemap.SpaceMap() print(new_record) # downloading file or segment if 'Content-Length' in new_record: if needed == None: @@ -306,12 +309,12 @@ needed = new_record['_parts'] else: if len(needed) > 1: print("Multipart requests currently not supported.") assert False, 'Skip this one for now.' - else: - assert False, 'No Content-Length or Content-Range header.' + #else: + #assert False, 'No Content-Length or Content-Range header.' new_record['_time'] = datetime.datetime.now() if self.command not in ('HEAD'): # file is created at temporary location and moved in place only when download completes if not os.access(temp_name, os.R_OK): @@ -410,11 +413,15 @@ if len(requested_ranges) > 0: requested_ranges.rewind() (start, end) = requested_ranges.pop() else: start = 0 - end = index[my_path]['Content-Length'] + # XXX ugly hack + if 'Content-Length' in index[my_path]: + end = index[my_path]['Content-Length'] + else: + end = 0 real_file.seek(start) if block_size > end - start: req_block_size = end - start else: req_block_size = block_size