| 1 | import messages, simplejson, urllib, sys |
|---|
| 2 | from pprint import pformat |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | printmessages = 0 |
|---|
| 6 | |
|---|
| 7 | def printMessage(message): |
|---|
| 8 | sys.stderr.write('\n') |
|---|
| 9 | sys.stderr.write('-'*30) |
|---|
| 10 | sys.stderr.write('\n\n') |
|---|
| 11 | sys.stderr.write(pformat(message.getData(1))+'\n') |
|---|
| 12 | |
|---|
| 13 | def printSection(header): |
|---|
| 14 | if printmessages: |
|---|
| 15 | out = """ |
|---|
| 16 | |
|---|
| 17 | #################################################################### |
|---|
| 18 | %s |
|---|
| 19 | #################################################################### |
|---|
| 20 | |
|---|
| 21 | """ % header |
|---|
| 22 | |
|---|
| 23 | sys.stderr.write(out) |
|---|
| 24 | |
|---|
| 25 | |
|---|
| 26 | def createMessage(data): |
|---|
| 27 | data = dict(simplejson.loads(str(data))) |
|---|
| 28 | header = data['header'] |
|---|
| 29 | klass = getattr(messages,header) |
|---|
| 30 | message = klass(data) |
|---|
| 31 | return message |
|---|
| 32 | |
|---|
| 33 | class Transport(object): |
|---|
| 34 | |
|---|
| 35 | def __call__(self,message): |
|---|
| 36 | return '' |
|---|
| 37 | |
|---|
| 38 | class HTTPTransport(object): |
|---|
| 39 | |
|---|
| 40 | def __init__(self,url): |
|---|
| 41 | self.url = url |
|---|
| 42 | |
|---|
| 43 | def __call__(self,message): |
|---|
| 44 | |
|---|
| 45 | if printmessages: |
|---|
| 46 | printMessage(message) |
|---|
| 47 | |
|---|
| 48 | response = urllib.urlopen(self.url,message.toString(True)) |
|---|
| 49 | reply = createMessage(response.read()) |
|---|
| 50 | |
|---|
| 51 | if printmessages: |
|---|
| 52 | printMessage(reply) |
|---|
| 53 | |
|---|
| 54 | return reply |
|---|
| 55 | |
|---|
| 56 | class TestingHTTPTransport(object): |
|---|
| 57 | |
|---|
| 58 | def __init__(self,port,**kwargs): |
|---|
| 59 | self.port = port |
|---|
| 60 | self.kwargs = kwargs |
|---|
| 61 | |
|---|
| 62 | def __call__(self,message): |
|---|
| 63 | import testutils |
|---|
| 64 | testutils.run_once(self.port,**self.kwargs) |
|---|
| 65 | transport = HTTPTransport('http://localhost:%s/' % self.port) |
|---|
| 66 | return transport(message) |
|---|
| 67 | |
|---|
| 68 | |
|---|
| 69 | class BTTransport(object): |
|---|
| 70 | |
|---|
| 71 | def __init__(self,socket): |
|---|
| 72 | self.stop = '\r\r+++STOP+++\r\r' |
|---|
| 73 | self.lenstop = len(self.stop) |
|---|
| 74 | self.socket = socket |
|---|
| 75 | |
|---|
| 76 | def __call__(self,message): |
|---|
| 77 | self.send(message) |
|---|
| 78 | return self.receive() |
|---|
| 79 | |
|---|
| 80 | def send(self,message): |
|---|
| 81 | self.socket.send(message.toString(True)+self.stop) |
|---|
| 82 | |
|---|
| 83 | def receive(self): |
|---|
| 84 | line='' |
|---|
| 85 | while not line.endswith(self.stop): |
|---|
| 86 | ch=self.socket.recv(1) |
|---|
| 87 | line += ch |
|---|
| 88 | |
|---|
| 89 | received = line[:-self.lenstop] |
|---|
| 90 | return createMessage(received) |
|---|
| 91 | |
|---|
| 92 | |
|---|
| 93 | class DirectTransport(object): |
|---|
| 94 | |
|---|
| 95 | def __init__(self,target,transport2=None): |
|---|
| 96 | self.target = target |
|---|
| 97 | self.transport2 = transport2 |
|---|
| 98 | |
|---|
| 99 | def __call__(self,message): |
|---|
| 100 | |
|---|
| 101 | if printmessages: |
|---|
| 102 | printMessage(message) |
|---|
| 103 | |
|---|
| 104 | if self.transport2: |
|---|
| 105 | response = self.target(message,self.transport2) |
|---|
| 106 | else: |
|---|
| 107 | response = self.target(message) |
|---|
| 108 | |
|---|
| 109 | if printmessages: |
|---|
| 110 | printMessage(response) |
|---|
| 111 | |
|---|
| 112 | return response |
|---|
| 113 | |
|---|
| 114 | class YieldTransport(object): |
|---|
| 115 | |
|---|
| 116 | def __init__(self,targetmethod,args): |
|---|
| 117 | self.args = args |
|---|
| 118 | self.targetmethod = targetmethod |
|---|
| 119 | self.nextarg = None |
|---|
| 120 | |
|---|
| 121 | def __call__(self,message): |
|---|
| 122 | gen = self.targetmethod(message) |
|---|
| 123 | response = None |
|---|
| 124 | for result in gen: |
|---|
| 125 | if result != None: |
|---|
| 126 | response = result |
|---|
| 127 | return response |
|---|
| 128 | |
|---|
| 129 | class TestTransport(object): |
|---|
| 130 | |
|---|
| 131 | def __init__(self, *args): |
|---|
| 132 | self.results = list(args) |
|---|
| 133 | self.debug = 0 |
|---|
| 134 | |
|---|
| 135 | def __call__(self,message): |
|---|
| 136 | if self.debug: |
|---|
| 137 | import pdb; pdb.set_trace() |
|---|
| 138 | result = self.results.pop(0) |
|---|
| 139 | |
|---|
| 140 | if type(result) == list or type(result) == tuple: |
|---|
| 141 | method = result[0] |
|---|
| 142 | args = list(result[1:]) |
|---|
| 143 | args.append(message) |
|---|
| 144 | return method(*args) |
|---|
| 145 | |
|---|
| 146 | elif not isinstance(result,messages.Message) and callable(result): |
|---|
| 147 | return result(message) |
|---|
| 148 | |
|---|
| 149 | else: |
|---|
| 150 | return result |
|---|