Beispiel #1
0
    def _perform_request(self, _, request, session):
        request.setHeader('content-type', 'application/stratum')
        request.setHeader('server', settings.USER_AGENT)
        request.setHeader('x-session-timeout', session.sessionTimeout)
        request.setHeader('access-control-allow-origin',
                          '*')  # Allow access from any other domain

        # Update client's IP address
        session.transport.peer = request.getHost()

        # Although it isn't intuitive at all, request.getHeader reads request headers,
        # but request.setHeader (few lines above) writes response headers...
        if 'application/stratum' not in request.getHeader('content-type'):
            session.transport.write("%s\n" % json.dumps({
                'id':
                None,
                'result':
                None,
                'error':
                (-1,
                 "Content-type must be 'application/stratum'. See http://stratum.bitcoin.cz for more info.",
                 "")
            }))
            self._finish(None, request, session.transport, session.lock)
            return

        if not session.protocol:
            # Build a "protocol connection"
            proto = Protocol()
            proto.transport = session.transport
            proto.factory = self
            proto.connectionMade()
            session.protocol = proto
        else:
            proto = session.protocol

        # Update callback URL if presented
        callback_url = request.getHeader('x-callback-url')
        if callback_url != None:
            if callback_url == '':
                # Blank value of callback URL switches HTTP Push back to HTTP Poll
                session.transport.push_url = None
            else:
                session.transport.push_url = callback_url

        data = request.content.read()
        if data:
            counter = RequestCounter()
            counter.on_finish.addCallback(self._finish, request,
                                          session.transport, session.lock)
            proto.dataReceived(data, request_counter=counter)
        else:
            # Ping message (empty request) of HTTP Polling
            self._finish(None, request, session.transport, session.lock)
Beispiel #2
0
class Client(Protocol):
    def __init__(self):
        self.engine = Engine()
        self.engine.print_traceback = True
        self.proto = FitnesseProtocol(self)

    def ack(self):
        self.ack_received = True

    def connectionMade(self):
        self.socketToken = sys.argv[4]
        request = "GET /?responder=socketCatcher&ticket=%s HTTP/1.1\r\n\r\n" % self.socketToken
        bytes = request.encode("UTF-8")
        self.transport.write(bytes)

    def dataReceived(self, data):
        self.proto.dataReceived(data)

    def content(self, data):
        self.doc = Document(data)
        self.doc.visit_tables(self)

    def on_table(self, table):
        fixture = self.engine.process(table, throw=False)
        self.write_table(table)

    def on_comment(self, node):
        html = str(node.toxml())
        self.transport.write(util.format_10_digit_number(len(html) + 1))
        self.transport.write(html)
        self.transport.write('\n')
    
    def done(self):
        self.transport.loseConnection()
        
    def write_table(self, table):
        html = str(table.toxml()) # Fixme : str() workaround for 'Data must not be unicode'
        self.transport.write(util.format_10_digit_number(len(html) + 1))
        self.transport.write(html)
        self.transport.write('\n')
        
    def write_number(self, number):
        self.transport.write(util.format_10_digit_number(number))

    def report(self):
        summary = self.engine.summary

        # 0 right, 0 wrong, 0 ignored, 0 exceptions
        self.write_number(0)
        self.write_number(summary.right)
        self.write_number(summary.wrong)
        self.write_number(summary.ignored)
        self.write_number(summary.exceptions)
        summary.reset()
    def _perform_request(self, _, request, session):
        request.setHeader('content-type', 'application/stratum')
        request.setHeader('server', settings.USER_AGENT)
        request.setHeader('x-session-timeout', session.sessionTimeout)
        request.setHeader('access-control-allow-origin', '*') # Allow access from any other domain
          
        # Update client's IP address     
        session.transport.peer = request.getHost()
 
        # Although it isn't intuitive at all, request.getHeader reads request headers,
        # but request.setHeader (few lines above) writes response headers...
        if 'application/stratum' not in request.getHeader('content-type'):
            session.transport.write("%s\n" % json.dumps({'id': None, 'result': None, 'error': (-1, "Content-type must be 'application/stratum'. See http://stratum.bitcoin.cz for more info.", "")}))
            self._finish(None, request, session.transport, session.lock)
            return
        
        if not session.protocol:            
            # Build a "protocol connection"
            proto = Protocol()
            proto.transport = session.transport
            proto.factory = self
            proto.connectionMade()
            session.protocol = proto
        else:
            proto = session.protocol
 
        # Update callback URL if presented
        callback_url = request.getHeader('x-callback-url')
        if callback_url != None:
            if callback_url == '':
                # Blank value of callback URL switches HTTP Push back to HTTP Poll
                session.transport.push_url = None
            else:
                session.transport.push_url = callback_url 
                  
        data = request.content.read()
        if data:
            counter = RequestCounter()
            counter.on_finish.addCallback(self._finish, request, session.transport, session.lock)
            proto.dataReceived(data, request_counter=counter)
        else:
            # Ping message (empty request) of HTTP Polling
            self._finish(None, request, session.transport, session.lock) 
 def onMessage(self, msg, is_binary):
     Protocol.dataReceived(self, msg)
Beispiel #5
0
 def onMessage(self, msg, is_binary):
     Protocol.dataReceived(self, msg)
Beispiel #6
0
class TestProtocol(unittest.TestCase):
    def setUp(self):
        self.proto = Protocol(self)
        self.pages = 0
    
    def ack(self):
        self.ack_received = True

    def content(self, content):
        self.data = content
        self.pages += 1

    def done(self):
        self.done_received = True

    def test_ack(self):
        self.proto.dataReceived('0000000000')
        self.assert_(self.ack_received)

    def test_length_and_content_in_seperate_blocks(self):
        self.proto.dataReceived('0000000000')
        self.proto.dataReceived('0000000004')
        self.proto.dataReceived('abcd')
        self.proto.dataReceived('0000000000')
        self.assertEqual(self.pages, 1)
        self.assert_(self.done_received)

    def test_if_protocol_reads_correct_length(self):
        '''this reproduced a bug'''
        self.proto.dataReceived('0000000000')
        self.proto.dataReceived('0000000004')
        self.proto.dataReceived('ab')
        self.proto.dataReceived('cd0000000000')
        self.assertEqual(self.pages, 1)
        self.assert_(self.done_received)
        self.assertEqual(self.data, 'abcd')

    def test_length_and_content_in_same_block(self):
        self.proto.dataReceived('0000000000')
        self.proto.dataReceived('0000000004abcd')
        self.proto.dataReceived('0000000000')
        self.assertEqual(self.pages, 1)
        self.assert_(self.done_received)

    def test_suite_of_2_pages(self):
        self.proto.dataReceived('0000000000')
        self.proto.dataReceived('0000000004')
        self.proto.dataReceived('abcd')
        self.assertEqual(self.data, 'abcd')
        self.proto.dataReceived('0000000004')
        self.proto.dataReceived('abcd')
        self.assertEqual(self.data, 'abcd')
        self.proto.dataReceived('0000000000')
        self.assertEqual(self.pages, 2)
        self.assert_(self.done_received)