1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
###
#
# Copyright Alan Kennedy.
#
# You may contact the copyright holder at this uri:
#
# http://www.xhaus.com/contact/modjy
#
# The licence under which this code is released is the Apache License v2.0.
#
# The terms and conditions of this license are listed in a file contained
# in the distribution that also contained this file, under the name
# LICENSE.txt.
#
# You may also read a copy of the license at the following web address.
#
# http://modjy.xhaus.com/LICENSE.txt
#
###
#
# This code adapted from the socket._fileobject class
#
import jarray
class modjy_input_object(object):
def __init__(self, servlet_inputstream, bufsize=8192):
self.istream = servlet_inputstream
self.buffer_size = bufsize
self.buffer = ""
def istream_read(self, n):
data = jarray.zeros(n, 'b')
m = self.istream.read(data)
if m == -1: # indicates EOF has been reached, so we just return the empty string
return ""
elif m <= 0:
return ""
if m < n:
data = data[:m]
return data.tostring()
def read(self, size=-1):
data = self.buffer
if size < 0:
# Read until EOF
buffers = []
if data:
buffers.append(data)
self.buffer = ""
recv_size = self.buffer_size
while True:
data = self.istream_read(recv_size)
if not data:
break
buffers.append(data)
return "".join(buffers)
else:
# Read until size bytes or EOF seen, whichever comes first
buf_len = len(data)
if buf_len >= size:
self.buffer = data[size:]
return data[:size]
buffers = []
if data:
buffers.append(data)
self.buffer = ""
while True:
left = size - buf_len
recv_size = max(self.buffer_size, left)
data = self.istream_read(recv_size)
if not data:
break
buffers.append(data)
n = len(data)
if n >= left:
self.buffer = data[left:]
buffers[-1] = data[:left]
break
buf_len += n
return "".join(buffers)
def readline(self, size=-1):
data = self.buffer
if size < 0:
# Read until \n or EOF, whichever comes first
nl = data.find('\n')
if nl >= 0:
nl += 1
self.buffer = data[nl:]
return data[:nl]
buffers = []
if data:
buffers.append(data)
self.buffer = ""
while True:
data = self.istream_read(self.buffer_size)
if not data:
break
buffers.append(data)
nl = data.find('\n')
if nl >= 0:
nl += 1
self.buffer = data[nl:]
buffers[-1] = data[:nl]
break
return "".join(buffers)
else:
# Read until size bytes or \n or EOF seen, whichever comes first
nl = data.find('\n', 0, size)
if nl >= 0:
nl += 1
self.buffer = data[nl:]
return data[:nl]
buf_len = len(data)
if buf_len >= size:
self.buffer = data[size:]
return data[:size]
buffers = []
if data:
buffers.append(data)
self.buffer = ""
while True:
data = self.istream_read(self.buffer_size)
if not data:
break
buffers.append(data)
left = size - buf_len
nl = data.find('\n', 0, left)
if nl >= 0:
nl += 1
self.buffer = data[nl:]
buffers[-1] = data[:nl]
break
n = len(data)
if n >= left:
self.buffer = data[left:]
buffers[-1] = data[:left]
break
buf_len += n
return "".join(buffers)
def readlines(self, sizehint=0):
total = 0
list = []
while True:
line = self.readline()
if not line:
break
list.append(line)
total += len(line)
if sizehint and total >= sizehint:
break
return list
# Iterator protocols
def __iter__(self):
return self
def next(self):
line = self.readline()
if not line:
raise StopIteration
return line
|