mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
just make sure we write at the end everywhere
This commit is contained in:
parent
d1011ff301
commit
05d4673972
@ -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
|
||||
|
||||
@ -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("-")])
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user