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 StringIO
|
||||||
import tempfile
|
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):
|
class TeeInput(object):
|
||||||
|
|
||||||
@ -33,10 +33,7 @@ class TeeInput(object):
|
|||||||
if len(buf) > 0:
|
if len(buf) > 0:
|
||||||
chunk, self.buf = parser.filter_body(buf)
|
chunk, self.buf = parser.filter_body(buf)
|
||||||
if chunk:
|
if chunk:
|
||||||
self.tmp.write(chunk)
|
fwrite(self.tmp, chunk)
|
||||||
self.tmp.flush()
|
|
||||||
if hasattr(self.tmp, 'fileno'):
|
|
||||||
os.fsync(self.tmp.fileno())
|
|
||||||
self._finalize()
|
self._finalize()
|
||||||
self.tmp.seek(0)
|
self.tmp.seek(0)
|
||||||
|
|
||||||
@ -45,23 +42,17 @@ class TeeInput(object):
|
|||||||
if self._len: return self._len
|
if self._len: return self._len
|
||||||
|
|
||||||
if self._is_socket:
|
if self._is_socket:
|
||||||
pos = self.tmp.tell()
|
|
||||||
while True:
|
while True:
|
||||||
self.tmp.seek(self._tmp_size())
|
|
||||||
if not self._tee(CHUNK_SIZE):
|
if not self._tee(CHUNK_SIZE):
|
||||||
break
|
break
|
||||||
self.tmp.seek(pos)
|
|
||||||
self._len = self._tmp_size()
|
self._len = self._tmp_size()
|
||||||
return self._len
|
return self._len
|
||||||
|
|
||||||
def seek(self, offset, whence=0):
|
def seek(self, offset, whence=0):
|
||||||
if self._is_socket:
|
if self._is_socket:
|
||||||
pos = self.tmp.tell()
|
|
||||||
while True:
|
while True:
|
||||||
self.tmp.seek(self._tmp_size())
|
|
||||||
if not self._tee(CHUNK_SIZE):
|
if not self._tee(CHUNK_SIZE):
|
||||||
break
|
break
|
||||||
self.tmp.seek(pos)
|
|
||||||
self.tmp.seek(offset, whence)
|
self.tmp.seek(offset, whence)
|
||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
@ -140,11 +131,7 @@ class TeeInput(object):
|
|||||||
while True:
|
while True:
|
||||||
chunk, self.buf = self.parser.filter_body(self.buf)
|
chunk, self.buf = self.parser.filter_body(self.buf)
|
||||||
if chunk:
|
if chunk:
|
||||||
self.tmp.write(chunk)
|
fwrite(self.tmp, chunk)
|
||||||
self.tmp.flush()
|
|
||||||
if hasattr(self.tmp, 'fileno'):
|
|
||||||
os.fsync(self.tmp.fileno())
|
|
||||||
self.tmp.seek(0, os.SEEK_END)
|
|
||||||
return chunk
|
return chunk
|
||||||
|
|
||||||
if self.parser.body_eof():
|
if self.parser.body_eof():
|
||||||
@ -163,14 +150,13 @@ class TeeInput(object):
|
|||||||
self._is_socket = False
|
self._is_socket = False
|
||||||
|
|
||||||
def _tmp_size(self):
|
def _tmp_size(self):
|
||||||
if isinstance(self.tmp, StringIO.StringIO):
|
return fsize(self.tmp)
|
||||||
return self.tmp.len
|
|
||||||
else:
|
|
||||||
return int(os.fstat(self.tmp.fileno())[6])
|
|
||||||
|
|
||||||
def _ensure_length(self, buf, length):
|
def _ensure_length(self, buf, length):
|
||||||
if not buf or not self._len:
|
if not buf or not self._len:
|
||||||
return buf
|
return buf
|
||||||
while len(buf) < length and self.len != self.tmp.tell():
|
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
|
return buf
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import os
|
|||||||
import resource
|
import resource
|
||||||
import select
|
import select
|
||||||
import socket
|
import socket
|
||||||
|
import StringIO
|
||||||
import textwrap
|
import textwrap
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@ -140,6 +141,23 @@ def write_error(sock, msg):
|
|||||||
%s
|
%s
|
||||||
""") % (len(html), html)
|
""") % (len(html), html)
|
||||||
write_nonblock(sock, http)
|
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):
|
def normalize_name(name):
|
||||||
return "-".join([w.lower().capitalize() for w in name.split("-")])
|
return "-".join([w.lower().capitalize() for w in name.split("-")])
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user