Beispiel #1
0
 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
Beispiel #2
0
 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
Beispiel #3
0
 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
Beispiel #6
0
 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