Ticket #1493: twisted.web.static.patch

File twisted.web.static.patch, 3.9 KB (added by John-Mark Gurney, 16 years ago)
  • static.py

    old new  
    306306        #for content-length
    307307        fsize = size = self.getFileSize()
    308308
    309 #         request.setHeader('accept-ranges','bytes')
     309        request.setHeader('accept-ranges','bytes')
    310310
    311311        if self.type:
    312312            request.setHeader('content-type', self.type)
     
    325325        if request.setLastModified(self.getmtime()) is http.CACHED:
    326326            return ''
    327327
     328        trans = True
    328329# Commented out because it's totally broken. --jknight 11/29/04
    329 #         try:
    330 #             range = request.getHeader('range')
    331 #
    332 #             if range is not None:
    333 #                 # This is a request for partial data...
    334 #                 bytesrange = string.split(range, '=')
    335 #                 assert bytesrange[0] == 'bytes',\
    336 #                        "Syntactically invalid http range header!"
    337 #                 start, end = string.split(bytesrange[1],'-')
    338 #                 if start:
    339 #                     f.seek(int(start))
    340 #                 if end:
    341 #                     end = int(end)
    342 #                     size = end
    343 #                 else:
    344 #                     end = size
    345 #                 request.setResponseCode(http.PARTIAL_CONTENT)
    346 #                 request.setHeader('content-range',"bytes %s-%s/%s " % (
    347 #                     str(start), str(end), str(size)))
    348 #                 #content-length should be the actual size of the stuff we're
    349 #                 #sending, not the full size of the on-server entity.
    350 #                 fsize = end - int(start)
    351 #
    352 #             request.setHeader('content-length', str(fsize))
    353 #         except:
    354 #             traceback.print_exc(file=log.logfile)
     330# XXX - fixed? jmg 2/17/06
     331        try:
     332            range = request.getHeader('range')
     333
     334            tsize = size
     335            if range is not None:
     336                # This is a request for partial data...
     337                bytesrange = string.split(range, '=')
     338                assert bytesrange[0] == 'bytes',\
     339                       "Syntactically invalid http range header!"
     340                start, end = string.split(bytesrange[1],'-', 1)
     341                if start:
     342                    f.seek(int(start))
     343                    if end:
     344                        end = int(end)
     345                    else:
     346                        end = size - 1
     347                else:
     348                    lastbytes = int(end)
     349                    if size < lastbytes:
     350                        lastbytes = size
     351                    start = size - lastbytes
     352                    f.seek(start)
     353                    fsize = lastbytes
     354                    end = size - 1
     355                size = end + 1
     356                fsize = end - int(start) + 1
     357                # start is the byte offset to begin, and end is the byte offset
     358                # to end..  fsize is size to send, tsize is the real size of
     359                # the file, and size is the byte position to stop sending.
     360
     361                if fsize <= 0:
     362                    request.setResponseCode(http.REQUESTED_RANGE_NOT_SATISFIABLE)
     363                    fsize = tsize
     364                    trans = False
     365                else:
     366                    request.setResponseCode(http.PARTIAL_CONTENT)
     367                    request.setHeader('content-range',"bytes %s-%s/%s " % (
     368                        str(start), str(end), str(tsize)))
     369        except:
     370            traceback.print_exc(file=log.logfile)
    355371
    356372        request.setHeader('content-length', str(fsize))
    357         if request.method == 'HEAD':
     373        if request.method == 'HEAD' or trans == False:
     374            # pretend we're a HEAD request, so content-length
     375            # won't be overwritten.
     376            request.method = 'HEAD'
    358377            return ''
    359378
    360379        # return data
     380        # size is the byte position to stop sending, not how many bytes to send
    361381        FileTransfer(f, size, request)
    362382        # and make sure the connection doesn't get closed
    363383        return server.NOT_DONE_YET