File: modjy_input.py

package info (click to toggle)
jython 2.7.2%2Brepack1-3
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 62,676 kB
  • sloc: python: 640,908; java: 306,458; xml: 1,984; sh: 522; ansic: 126; makefile: 76
file content (167 lines) | stat: -rw-r--r-- 4,920 bytes parent folder | download | duplicates (3)
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