80
80
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
81
81
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
82
82
# OF THIS SOFTWARE.
83
+ from __future__ import print_function
83
84
84
- import httplib
85
+ try :
86
+ import http .client as httplib
87
+ except ImportError :
88
+ import httplib
85
89
import re
86
90
import socket
87
- import urllib
88
- import xmlrpclib
91
+ import sys
92
+ try :
93
+ import urllib .parse as urlparser
94
+ except ImportError :
95
+ import urllib as urlparser
96
+
97
+ try :
98
+ import xmlrpc .client as xmlrpclib
99
+ except :
100
+ import xmlrpclib
101
+
89
102
import errno
90
103
91
104
@@ -96,7 +109,7 @@ def request(self, host, handler, request_body, verbose=0):
96
109
for i in (0 , 1 ):
97
110
try :
98
111
return self .single_request (host , handler , request_body , verbose )
99
- except socket .error , e :
112
+ except socket .error as e :
100
113
if i or e .errno not in (errno .ECONNRESET , errno .ECONNABORTED , errno .EPIPE ):
101
114
raise
102
115
except httplib .BadStatusLine : #close after we sent request
@@ -106,15 +119,15 @@ def request(self, host, handler, request_body, verbose=0):
106
119
def single_request (self , host , handler , request_body , verbose = 0 ):
107
120
# Add SCGI headers to the request.
108
121
headers = {'CONTENT_LENGTH' : str (len (request_body )), 'SCGI' : '1' }
109
- header = '\x00 ' .join (('%s\x00 %s' % item for item in headers .iteritems ())) + '\x00 '
122
+ header = '\x00 ' .join (('%s\x00 %s' % item for item in headers .items ())) + '\x00 '
110
123
header = '%d:%s' % (len (header ), header )
111
124
request_body = '%s,%s' % (header , request_body )
112
125
113
126
sock = None
114
127
115
128
try :
116
129
if host :
117
- host , port = urllib .splitport (host )
130
+ host , port = urlparser .splitport (host )
118
131
addrinfo = socket .getaddrinfo (host , int (port ), socket .AF_INET ,
119
132
socket .SOCK_STREAM )
120
133
sock = socket .socket (* addrinfo [0 ][:3 ])
@@ -125,7 +138,10 @@ def single_request(self, host, handler, request_body, verbose=0):
125
138
126
139
self .verbose = verbose
127
140
128
- sock .send (request_body )
141
+ if sys .version_info [0 ] > 2 :
142
+ sock .send (bytes (request_body , "utf-8" ))
143
+ else :
144
+ sock .send (request_body )
129
145
return self .parse_response (sock .makefile ())
130
146
finally :
131
147
if sock :
@@ -142,11 +158,17 @@ def parse_response(self, response):
142
158
response_body += data
143
159
144
160
# Remove SCGI headers from the response.
145
- response_header , response_body = re .split (r'\n\s*?\n' , response_body ,
146
- maxsplit = 1 )
147
161
148
162
if self .verbose :
149
- print 'body:' , repr (response_body )
163
+ print ('body:' , repr (response_body ))
164
+
165
+ try :
166
+ response_header , response_body = re .split (r'\n\s*?\n' , response_body ,
167
+ maxsplit = 1 )
168
+ except ValueError :
169
+ print ("error in response: %s" , response_body )
170
+ p .close ()
171
+ u .close ()
150
172
151
173
p .feed (response_body )
152
174
p .close ()
@@ -157,10 +179,10 @@ def parse_response(self, response):
157
179
class SCGIServerProxy (xmlrpclib .ServerProxy ):
158
180
def __init__ (self , uri , transport = None , encoding = None , verbose = False ,
159
181
allow_none = False , use_datetime = False ):
160
- type , uri = urllib .splittype (uri )
182
+ type , uri = urlparser .splittype (uri )
161
183
if type not in ('scgi' ):
162
184
raise IOError ('unsupported XML-RPC protocol' )
163
- self .__host , self .__handler = urllib .splithost (uri )
185
+ self .__host , self .__handler = urlparser .splithost (uri )
164
186
if not self .__handler :
165
187
self .__handler = '/'
166
188
0 commit comments