just make sure we write at the end everywhere

This commit is contained in:
benoitc 2010-02-28 14:59:54 +01:00
parent d1011ff301
commit 05d4673972
2 changed files with 25 additions and 21 deletions

View File

@ -15,7 +15,7 @@ import os
import StringIO
import tempfile
from gunicorn.util import MAX_BODY, CHUNK_SIZE, read_partial
from gunicorn.util import MAX_BODY, CHUNK_SIZE, read_partial, fsize, fwrite
class TeeInput(object):
@ -33,10 +33,7 @@ class TeeInput(object):
if len(buf) > 0:
chunk, self.buf = parser.filter_body(buf)
if chunk:
self.tmp.write(chunk)
self.tmp.flush()
if hasattr(self.tmp, 'fileno'):
os.fsync(self.tmp.fileno())
fwrite(self.tmp, chunk)
self._finalize()
self.tmp.seek(0)
@ -45,23 +42,17 @@ class TeeInput(object):
if self._len: return self._len
if self._is_socket:
pos = self.tmp.tell()
while True:
self.tmp.seek(self._tmp_size())
if not self._tee(CHUNK_SIZE):
break
self.tmp.seek(pos)
self._len = self._tmp_size()
return self._len
def seek(self, offset, whence=0):
if self._is_socket:
pos = self.tmp.tell()
while True:
self.tmp.seek(self._tmp_size())
if not self._tee(CHUNK_SIZE):
break
self.tmp.seek(pos)
self.tmp.seek(offset, whence)
def flush(self):
@ -140,11 +131,7 @@ class TeeInput(object):
while True:
chunk, self.buf = self.parser.filter_body(self.buf)
if chunk:
self.tmp.write(chunk)
self.tmp.flush()
if hasattr(self.tmp, 'fileno'):
os.fsync(self.tmp.fileno())
self.tmp.seek(0, os.SEEK_END)
fwrite(self.tmp, chunk)
return chunk
if self.parser.body_eof():
@ -163,14 +150,13 @@ class TeeInput(object):
self._is_socket = False
def _tmp_size(self):
if isinstance(self.tmp, StringIO.StringIO):
return self.tmp.len
else:
return int(os.fstat(self.tmp.fileno())[6])
return fsize(self.tmp)
def _ensure_length(self, buf, length):
if not buf or not self._len:
return buf
while len(buf) < length and self.len != self.tmp.tell():
buf += self._tee(length - len(buf))
data = self._tee(length - len(buf))
if not data: break
buf += data
return buf

View File

@ -10,6 +10,7 @@ import os
import resource
import select
import socket
import StringIO
import textwrap
import time
@ -140,6 +141,23 @@ def write_error(sock, msg):
%s
""") % (len(html), html)
write_nonblock(sock, http)
def fwrite(f, data):
pos = f.tell()
f.seek(fsize(f))
f.write(data)
f.flush()
if hasattr(f, 'fileno'):
os.fsync(f.fileno())
f.seek(0, os.SEEK_END)
f.seek(pos)
def fsize(f):
if isinstance(f, StringIO.StringIO):
return f.len
else:
return int(os.fstat(f.fileno())[6])
def normalize_name(name):
return "-".join([w.lower().capitalize() for w in name.split("-")])