'Set up the response for Range headers that specify a single range.
This method checks if the request is satisfiable and sets the response
code and Content-Type and Content-Length headers appropriately.  The
return value, which is a little complicated, indicates which parts of
the resource to return and the boundaries that should separate the
parts.
In detail, the return value is a tuple rangeInfo C{rangeInfo} is a
list of 3-tuples C{(partSeparator, partOffset, partSize)}.  The
response to this request should be, for each element of C{rangeInfo},
C{partSeparator} followed by C{partSize} bytes of the resource
starting at C{partOffset}.  Each C{partSeparator} includes the
MIME-style boundary and the part-specific Content-type and
Content-range headers.  It is convenient to return the separator as a
concrete string from this method, because this method needs to compute
the number of bytes that will make up the response to be able to set
the Content-Length header of the response accurately.
@param request: The Request object.
@param byteRanges: A list of C{(start, end)} values as specified by
the header.  For each range, at most one of C{start} and C{end}
may be L{None}.
@return: See above.'

def _doMultipleRangeRequest(self, request, byteRanges):

    matchingRangeFound = False
    rangeInfo = []
    contentLength = 0
    boundary = networkString(('%x%x' % (int((time.time() * 1000000)), os.getpid())))
    if self.type:
        contentType = self.type
    else:
        contentType = 'bytes'
    for (start, end) in byteRanges:
        (partOffset, partSize) = self._rangeToOffsetAndSize(start, end)
        if (partOffset == partSize == 0):
            continue
        contentLength += partSize
        matchingRangeFound = True
        partContentRange = self._contentRange(partOffset, partSize)
        partSeparator = networkString(('\r\n--%s\r\nContent-type:    %s\r\nContent-range:    %s\r\n\r\n' % (nativeString(boundary), nativeString(contentType), nativeString(partContentRange))))
        contentLength += len(partSeparator)
        rangeInfo.append((partSeparator, partOffset, partSize))
    if (not matchingRangeFound):
        request.setResponseCode(http.REQUESTED_RANGE_NOT_SATISFIABLE)
        request.setHeader('content-length', '0')
        request.setHeader('content-range', networkString(('bytes    */%d' % (self.getFileSize(),))))
        return ([], '')
    finalBoundary = (('\r\n--' + boundary) + '--\r\n')
    rangeInfo.append((finalBoundary, 0, 0))
    request.setResponseCode(http.PARTIAL_CONTENT)
    request.setHeader('content-type', networkString(('multipart/byteranges;    boundary="%s"' % (nativeString(boundary),))))
    request.setHeader('content-length', intToBytes((contentLength + len(finalBoundary))))
    return rangeInfo
