def _build_header_producer(self): if self._header_producer is None: self._headers_built.set() headers = self.headers.to_strings() headers.insert(0, self._build_requestline()) headers += [cookie.output() for cookie in self._cookies] headers = string.join(headers + ['\r\n'], '\r\n') self._header_producer = SimpleProducer(headers) return self._header_producer
def _build_body_producer(self): if self._body_producer is None: outgoing_producer = self.data if self.has_header('content-length'): outgoing_producer = SimpleProducer(outgoing_producer) encoding = self.get_header('content-encoding', '') if encoding.lower() == 'chunked': outgoing_producer = StreamingProducer(outgoing_producer) outgoing_producer = ChunkedProducer(outgoing_producer) self._body_producer = outgoing_producer return self._body_producer
def transport(self, datastream, target): targeturl = _TargetURL(target) contenttype = getattr(datastream, "mimetype", self.content_type) header = "POST %s HTTP/1.1\r\n" % targeturl.get_url() header += "Host: %s:%s\r\n" % (targeturl.get_server(), targeturl.get_port()) header += "Content-Type: %s\r\n" % contenttype header += "Connection: close\r\n" if isinstance(datastream, str): header += "Content-Length: %s\r\n" % len(datastream) producer = SimpleProducer(datastream) elif self.chunked_data: producer = ChunkedProducer(StreamingProducer(datastream)) header += "Transfer-Encoding: chunked\r\n" else: if not isinstance(datastream, StringIO.StringIO): self.msglog("Reading data for transport") buffer = StringIO.StringIO() read = datastream.read(1024) while read: buffer.write(read) read = datastream.read(1024) else: buffer = datastream buffer.seek(0) producer = StreamingProducer(buffer) header += "Content-Length: %s\r\n" % buffer.len self.msglog("Data read, going to transport %s bytes" % buffer.len) header += "\r\n" s = socket.safety_socket(self.timeout, socket.AF_INET, socket.SOCK_STREAM) self.msglog("Going to connect to server") s.connect((targeturl.get_server(), targeturl.get_port())) self.msglog("Going to write to server") data = header # Doing output polls to make sure that we do not hang while data: try: data = data[s.send(data) :] except ETimeout: s.close() tp = msglog.types.WARN msglog.log( "broadway.mpx.service.data.http_post_transporter", tp, "HTTP Post transport failed. Send Timed out.", ) raise if not data: data = producer.more() self.msglog("Going to read from server") response = StringIO.StringIO() # Doing input polls to make sure we dont hang. loop = 1 while loop: try: data = s.recv(1024) except ETimeout: s.close() tp = msglog.types.WARN msglog.log( "broadway.mpx.service.data.http_post_transporter", tp, "HTTP Post transport failed. Receive Timed out.", ) raise loop = len(data) response.write(data) s.close() self.msglog("Done reading from server") response.seek(0) headers = string.split(response.read(), "\r\n\r\n") while headers: header = headers.pop(0) if string.split(header, "\r\n")[0].find(" 200 ") >= 0: break else: response.seek(0) raise TypeError('Error response from %s: "%s"' % (response.read(), targeturl.get_target())) return
def transport(self, data): # ******************************** # *** WARNING WILL ROBINSON!!! *** # Construct the header as a single TCP/IP "message". Some (all?) # webservers close the connection if the header is not recieved # in a single call to recv() on their socket. header = 'POST %s HTTP/1.1\r\n' % self._url header += 'Host: %s:%s\r\n' % (self._server, self._port) header += 'Content-Type: %s\r\n' % self.content_type if self.user: header += 'Authorization: Basic %s\r\n' % \ self._build_base64string(self.user, self.password) header += 'Connection: close\r\n' if type(data) == type(''): header += 'Content-Length: %s\r\n' % len(data) producer = SimpleProducer(data) elif self.chunked_data: producer = ChunkedProducer(StreamingProducer(data)) header += 'Transfer-Encoding: chunked\r\n' else: self.msglog('Reading data for transport') buffer = StringIO.StringIO() read = data.read(1024) while read: buffer.write(read) read = data.read(1024) buffer.seek(0) producer = StreamingProducer(buffer) header += 'Content-Length: %s\r\n' % buffer.len self.msglog('Data read, going to transport %s bytes' % buffer.len) header += '\r\n' s = self._get_ready_socket() self.msglog('Going to write to server') data = header # Doing output polls to make sure that we do not hang while data: try: data = data[s.send(data):] except ETimeout: s.close() tp = msglog.types.WARN msglog.log('broadway.mpx.service.data.http_post_transporter', tp, 'HTTP Post transport failed. Send Timed out.') raise if not data: data = producer.more() self.msglog('Going to read from server') response = StringIO.StringIO() # Doing input polls to make sure we dont hang. loop = 1 data = '' while loop: try: data = s.recv(1024) except ETimeout: s.close() print len(data) print data tp = msglog.types.WARN msglog.log('broadway.mpx.service.data.http_post_transporter', tp, 'HTTP Post transport failed. Receive Timed out.') raise except: # @fixme - there's an issue with recv()'ing from SafetySockets and the other # end closing. See Roundup issue 33. See if we have enough to data to ack # the POST. response.write(data) if response.len == 0: # we got nothing - raise so that we retry. msglog.exception() raise break loop = len(data) response.write(data) s.close() self.msglog('Done reading from server') response.seek(0) headers = string.split(response.read(), '\r\n\r\n') while headers: header = headers.pop(0) if string.split(header, '\r\n')[0].find(' 200 ') >= 0: break else: response.seek(0) raise ETransporter(('Error response from %s: "%s"') % (response.read(), self.post_url)) self.msglog('Received valid response from server') return
def transport(self, data): # ******************************** # *** WARNING WILL ROBINSON!!! *** # Construct the header as a single TCP/IP "message". Some (all?) # webservers close the connection if the header is not recieved # in a single call to recv() on their socket. header = 'POST %s HTTP/1.1\r\n' % self._url header += 'Host: %s:%s\r\n' % (self._server,self._port) header += 'Content-Type: %s\r\n' % self.content_type if self.user: header += 'Authorization: Basic %s\r\n' % \ self._build_base64string(self.user, self.password) header += 'Connection: close\r\n' if type(data) == type(''): header += 'Content-Length: %s\r\n' % len(data) producer = SimpleProducer(data) elif self.chunked_data: producer = ChunkedProducer(StreamingProducer(data)) header += 'Transfer-Encoding: chunked\r\n' else: self.msglog('Reading data for transport') buffer = StringIO.StringIO() read = data.read(1024) while read: buffer.write(read) read = data.read(1024) buffer.seek(0) producer = StreamingProducer(buffer) header += 'Content-Length: %s\r\n' % buffer.len self.msglog('Data read, going to transport %s bytes' % buffer.len) header += '\r\n' s = self._get_ready_socket() self.msglog('Going to write to server') data = header # Doing output polls to make sure that we do not hang while data: try: data = data[s.send(data):] except ETimeout: s.close() tp = msglog.types.WARN msglog.log('broadway.mpx.service.data.http_post_transporter', tp,'HTTP Post transport failed. Send Timed out.') raise if not data: data = producer.more() self.msglog('Going to read from server') response = StringIO.StringIO() # Doing input polls to make sure we dont hang. loop = 1 data = '' while loop: try: data = s.recv(1024) except ETimeout: s.close() print len(data) print data tp = msglog.types.WARN msglog.log('broadway.mpx.service.data.http_post_transporter', tp,'HTTP Post transport failed. Receive Timed out.') raise except: # @fixme - there's an issue with recv()'ing from SafetySockets and the other # end closing. See Roundup issue 33. See if we have enough to data to ack # the POST. response.write(data) if response.len == 0: # we got nothing - raise so that we retry. msglog.exception() raise break loop = len(data) response.write(data) s.close() self.msglog('Done reading from server') response.seek(0) headers = string.split(response.read(),'\r\n\r\n') while headers: header = headers.pop(0) if string.split(header,'\r\n')[0].find(' 200 ') >= 0: break else: response.seek(0) raise ETransporter(('Error response from %s: "%s"') % (response.read(), self.post_url)) self.msglog('Received valid response from server') return
def transport(self, datastream, target): targeturl = _TargetURL(target) contenttype = getattr(datastream, 'mimetype', self.content_type) header = 'POST %s HTTP/1.1\r\n' % targeturl.get_url() header += 'Host: %s:%s\r\n' % (targeturl.get_server(), targeturl.get_port()) header += 'Content-Type: %s\r\n' % contenttype header += 'Connection: close\r\n' if isinstance(datastream, str): header += 'Content-Length: %s\r\n' % len(datastream) producer = SimpleProducer(datastream) elif self.chunked_data: producer = ChunkedProducer(StreamingProducer(datastream)) header += 'Transfer-Encoding: chunked\r\n' else: if not isinstance(datastream, StringIO.StringIO): self.msglog('Reading data for transport') buffer = StringIO.StringIO() read = datastream.read(1024) while read: buffer.write(read) read = datastream.read(1024) else: buffer = datastream buffer.seek(0) producer = StreamingProducer(buffer) header += 'Content-Length: %s\r\n' % buffer.len self.msglog('Data read, going to transport %s bytes' % buffer.len) header += '\r\n' s = socket.safety_socket(self.timeout, socket.AF_INET, socket.SOCK_STREAM) self.msglog('Going to connect to server') s.connect((targeturl.get_server(), targeturl.get_port())) self.msglog('Going to write to server') data = header # Doing output polls to make sure that we do not hang while data: try: data = data[s.send(data):] except ETimeout: s.close() tp = msglog.types.WARN msglog.log('broadway.mpx.service.data.http_post_transporter', tp, 'HTTP Post transport failed. Send Timed out.') raise if not data: data = producer.more() self.msglog('Going to read from server') response = StringIO.StringIO() # Doing input polls to make sure we dont hang. loop = 1 while loop: try: data = s.recv(1024) except ETimeout: s.close() tp = msglog.types.WARN msglog.log('broadway.mpx.service.data.http_post_transporter', tp, 'HTTP Post transport failed. Receive Timed out.') raise loop = len(data) response.write(data) s.close() self.msglog('Done reading from server') response.seek(0) headers = string.split(response.read(), '\r\n\r\n') while headers: header = headers.pop(0) if string.split(header, '\r\n')[0].find(' 200 ') >= 0: break else: response.seek(0) raise TypeError('Error response from %s: "%s"' % (response.read(), targeturl.get_target())) return