server.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Fri Aug 05 16:08:35 2016
  4. Model author: Yentl Van Tendeloo
  5. Model name: HTTP Server
  6. Model description:
  7. Example HTTP echo server.
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. import time
  11. import os
  12. import urllib
  13. import sys
  14. import json
  15. import sys
  16. # package "HTTP Server"
  17. class Echo(RuntimeClassBase):
  18. def __init__(self, controller, params):
  19. RuntimeClassBase.__init__(self, controller)
  20. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  21. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  22. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  23. self.semantics.priority = StatechartSemantics.SourceParent
  24. self.semantics.concurrency = StatechartSemantics.Single
  25. # build Statechart structure
  26. self.build_statechart_structure()
  27. # call user defined constructor
  28. Echo.user_defined_constructor(self, params)
  29. def user_defined_constructor(self, params):
  30. self.source = None
  31. def user_defined_destructor(self):
  32. pass
  33. # builds Statechart structure
  34. def build_statechart_structure(self):
  35. # state <root>
  36. self.states[""] = State(0, self)
  37. # state /init_server
  38. self.states["/init_server"] = State(1, self)
  39. self.states["/init_server"].setEnter(self._init_server_enter)
  40. # state /wait_for_requests
  41. self.states["/wait_for_requests"] = State(2, self)
  42. # state /wait_for_requests/wait
  43. self.states["/wait_for_requests/wait"] = State(3, self)
  44. # add children
  45. self.states[""].addChild(self.states["/init_server"])
  46. self.states[""].addChild(self.states["/wait_for_requests"])
  47. self.states["/wait_for_requests"].addChild(self.states["/wait_for_requests/wait"])
  48. self.states[""].fixTree()
  49. self.states[""].default_state = self.states["/init_server"]
  50. self.states["/wait_for_requests"].default_state = self.states["/wait_for_requests/wait"]
  51. # transition /init_server
  52. _init_server_0 = Transition(self, self.states["/init_server"], [self.states["/wait_for_requests"]])
  53. _init_server_0.setAction(self._init_server_0_exec)
  54. _init_server_0.setTrigger(Event("instance_created", None))
  55. self.states["/init_server"].addTransition(_init_server_0)
  56. # transition /wait_for_requests/wait
  57. _wait_for_requests_wait_0 = Transition(self, self.states["/wait_for_requests/wait"], [self.states["/wait_for_requests/wait"]])
  58. _wait_for_requests_wait_0.setAction(self._wait_for_requests_wait_0_exec)
  59. _wait_for_requests_wait_0.setTrigger(Event("HTTP_output", None))
  60. self.states["/wait_for_requests/wait"].addTransition(_wait_for_requests_wait_0)
  61. def _init_server_enter(self):
  62. self.big_step.outputEventOM(Event("create_instance", None, [self, 'to_server', 'Server', '', 8080]))
  63. def _init_server_0_exec(self, parameters):
  64. instancename = parameters[0]
  65. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  66. def _wait_for_requests_wait_0_exec(self, parameters):
  67. source = parameters[0]
  68. data = parameters[1]
  69. print("Got input: " + str(data))
  70. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'to_server/%s' % source, Event("HTTP_input", None, [data])]))
  71. def initializeStatechart(self):
  72. # enter default state
  73. states = self.states["/init_server"].getEffectiveTargetStates()
  74. self.updateConfiguration(states)
  75. for state in states:
  76. if state.enter:
  77. state.enter()
  78. class Server(RuntimeClassBase):
  79. def __init__(self, controller, address, port):
  80. RuntimeClassBase.__init__(self, controller)
  81. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  82. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  83. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  84. self.semantics.priority = StatechartSemantics.SourceParent
  85. self.semantics.concurrency = StatechartSemantics.Single
  86. # build Statechart structure
  87. self.build_statechart_structure()
  88. # call user defined constructor
  89. Server.user_defined_constructor(self, address, port)
  90. def user_defined_constructor(self, address, port):
  91. self.socket = None
  92. self.address = address
  93. self.port = port
  94. def user_defined_destructor(self):
  95. pass
  96. # builds Statechart structure
  97. def build_statechart_structure(self):
  98. # state <root>
  99. self.states[""] = State(0, self)
  100. # state /main
  101. self.states["/main"] = ParallelState(1, self)
  102. # state /main/forward
  103. self.states["/main/forward"] = State(2, self)
  104. # state /main/forward/forward
  105. self.states["/main/forward/forward"] = State(3, self)
  106. # state /main/server
  107. self.states["/main/server"] = State(4, self)
  108. # state /main/server/init
  109. self.states["/main/server/init"] = State(5, self)
  110. self.states["/main/server/init"].setEnter(self._main_server_init_enter)
  111. # state /main/server/binding
  112. self.states["/main/server/binding"] = State(6, self)
  113. self.states["/main/server/binding"].setEnter(self._main_server_binding_enter)
  114. # state /main/server/listening
  115. self.states["/main/server/listening"] = State(7, self)
  116. self.states["/main/server/listening"].setEnter(self._main_server_listening_enter)
  117. # state /main/server/accepting
  118. self.states["/main/server/accepting"] = State(8, self)
  119. self.states["/main/server/accepting"].setEnter(self._main_server_accepting_enter)
  120. self.states["/main/server/accepting"].setExit(self._main_server_accepting_exit)
  121. # state /main/close_socket
  122. self.states["/main/close_socket"] = State(9, self)
  123. # state /main/close_socket/close
  124. self.states["/main/close_socket/close"] = State(10, self)
  125. # add children
  126. self.states[""].addChild(self.states["/main"])
  127. self.states["/main"].addChild(self.states["/main/forward"])
  128. self.states["/main"].addChild(self.states["/main/server"])
  129. self.states["/main"].addChild(self.states["/main/close_socket"])
  130. self.states["/main/forward"].addChild(self.states["/main/forward/forward"])
  131. self.states["/main/server"].addChild(self.states["/main/server/init"])
  132. self.states["/main/server"].addChild(self.states["/main/server/binding"])
  133. self.states["/main/server"].addChild(self.states["/main/server/listening"])
  134. self.states["/main/server"].addChild(self.states["/main/server/accepting"])
  135. self.states["/main/close_socket"].addChild(self.states["/main/close_socket/close"])
  136. self.states[""].fixTree()
  137. self.states[""].default_state = self.states["/main"]
  138. self.states["/main/forward"].default_state = self.states["/main/forward/forward"]
  139. self.states["/main/server"].default_state = self.states["/main/server/init"]
  140. self.states["/main/close_socket"].default_state = self.states["/main/close_socket/close"]
  141. # transition /main/forward/forward
  142. _main_forward_forward_0 = Transition(self, self.states["/main/forward/forward"], [self.states["/main/forward/forward"]])
  143. _main_forward_forward_0.setAction(self._main_forward_forward_0_exec)
  144. _main_forward_forward_0.setTrigger(Event("HTTP_output", None))
  145. self.states["/main/forward/forward"].addTransition(_main_forward_forward_0)
  146. # transition /main/server/init
  147. _main_server_init_0 = Transition(self, self.states["/main/server/init"], [self.states["/main/server/binding"]])
  148. _main_server_init_0.setAction(self._main_server_init_0_exec)
  149. _main_server_init_0.setTrigger(Event("created_socket", "socket_in"))
  150. self.states["/main/server/init"].addTransition(_main_server_init_0)
  151. # transition /main/server/binding
  152. _main_server_binding_0 = Transition(self, self.states["/main/server/binding"], [self.states["/main/server/listening"]])
  153. _main_server_binding_0.setTrigger(Event("bound_socket", "socket_in"))
  154. _main_server_binding_0.setGuard(self._main_server_binding_0_guard)
  155. self.states["/main/server/binding"].addTransition(_main_server_binding_0)
  156. # transition /main/server/listening
  157. _main_server_listening_0 = Transition(self, self.states["/main/server/listening"], [self.states["/main/server/accepting"]])
  158. _main_server_listening_0.setAction(self._main_server_listening_0_exec)
  159. _main_server_listening_0.setTrigger(Event("listened_socket", "socket_in"))
  160. _main_server_listening_0.setGuard(self._main_server_listening_0_guard)
  161. self.states["/main/server/listening"].addTransition(_main_server_listening_0)
  162. # transition /main/server/accepting
  163. _main_server_accepting_0 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  164. _main_server_accepting_0.setAction(self._main_server_accepting_0_exec)
  165. _main_server_accepting_0.setTrigger(Event("accepted_socket", "socket_in"))
  166. self.states["/main/server/accepting"].addTransition(_main_server_accepting_0)
  167. _main_server_accepting_1 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  168. _main_server_accepting_1.setAction(self._main_server_accepting_1_exec)
  169. _main_server_accepting_1.setTrigger(Event("instance_created", None))
  170. self.states["/main/server/accepting"].addTransition(_main_server_accepting_1)
  171. _main_server_accepting_2 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  172. _main_server_accepting_2.setTrigger(Event("_0after"))
  173. self.states["/main/server/accepting"].addTransition(_main_server_accepting_2)
  174. # transition /main/close_socket/close
  175. _main_close_socket_close_0 = Transition(self, self.states["/main/close_socket/close"], [self.states["/main/close_socket/close"]])
  176. _main_close_socket_close_0.setAction(self._main_close_socket_close_0_exec)
  177. _main_close_socket_close_0.setTrigger(Event("close_socket", None))
  178. self.states["/main/close_socket/close"].addTransition(_main_close_socket_close_0)
  179. def _main_server_init_enter(self):
  180. self.big_step.outputEvent(Event("create_socket", "socket_out", []))
  181. def _main_server_binding_enter(self):
  182. self.big_step.outputEvent(Event("bind_socket", "socket_out", [self.socket, (self.address, self.port)]))
  183. def _main_server_listening_enter(self):
  184. self.big_step.outputEvent(Event("listen_socket", "socket_out", [self.socket]))
  185. def _main_server_accepting_enter(self):
  186. self.addTimer(0, 1.0)
  187. def _main_server_accepting_exit(self):
  188. self.removeTimer(0)
  189. def _main_forward_forward_0_exec(self, parameters):
  190. association_name = parameters[0]
  191. data = parameters[1]
  192. print("Forward")
  193. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [association_name, data])]))
  194. def _main_server_init_0_exec(self, parameters):
  195. socket = parameters[0]
  196. self.socket = socket
  197. def _main_server_binding_0_guard(self, parameters):
  198. socket = parameters[0]
  199. return self.socket == socket
  200. def _main_server_listening_0_exec(self, parameters):
  201. socket = parameters[0]
  202. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  203. def _main_server_listening_0_guard(self, parameters):
  204. socket = parameters[0]
  205. return self.socket == socket
  206. def _main_server_accepting_0_exec(self, parameters):
  207. socket = parameters[0]
  208. connected_socket = parameters[1]
  209. self.big_step.outputEventOM(Event("create_instance", None, [self, 'sockets', 'Socket', connected_socket]))
  210. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  211. def _main_server_accepting_1_exec(self, parameters):
  212. instancename = parameters[0]
  213. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  214. self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_association_name", None, [instancename])]))
  215. def _main_close_socket_close_0_exec(self, parameters):
  216. association_name = parameters[0]
  217. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  218. def initializeStatechart(self):
  219. # enter default state
  220. states = self.states["/main"].getEffectiveTargetStates()
  221. self.updateConfiguration(states)
  222. for state in states:
  223. if state.enter:
  224. state.enter()
  225. class Socket(RuntimeClassBase):
  226. def __init__(self, controller, my_socket):
  227. RuntimeClassBase.__init__(self, controller)
  228. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  229. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  230. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  231. self.semantics.priority = StatechartSemantics.SourceParent
  232. self.semantics.concurrency = StatechartSemantics.Single
  233. # build Statechart structure
  234. self.build_statechart_structure()
  235. # call user defined constructor
  236. Socket.user_defined_constructor(self, my_socket)
  237. def user_defined_constructor(self, my_socket):
  238. self.socket = my_socket
  239. self.received_data = ""
  240. self.send_data = ""
  241. self.closed = False
  242. self.association_name = None
  243. def user_defined_destructor(self):
  244. pass
  245. # builds Statechart structure
  246. def build_statechart_structure(self):
  247. # state <root>
  248. self.states[""] = State(0, self)
  249. # state /init
  250. self.states["/init"] = State(1, self)
  251. # state /connected
  252. self.states["/connected"] = ParallelState(2, self)
  253. # state /connected/listening
  254. self.states["/connected/listening"] = State(3, self)
  255. # state /connected/listening/listen
  256. self.states["/connected/listening/listen"] = State(4, self)
  257. self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
  258. # state /connected/listening/closed
  259. self.states["/connected/listening/closed"] = State(5, self)
  260. self.states["/connected/listening/closed"].setEnter(self._connected_listening_closed_enter)
  261. # state /connected/sending
  262. self.states["/connected/sending"] = State(6, self)
  263. # state /connected/sending/waiting_for_data
  264. self.states["/connected/sending/waiting_for_data"] = State(7, self)
  265. # state /connected/sending/transferring
  266. self.states["/connected/sending/transferring"] = State(8, self)
  267. # state /connected/queueing
  268. self.states["/connected/queueing"] = State(9, self)
  269. # state /connected/queueing/queueing
  270. self.states["/connected/queueing/queueing"] = State(10, self)
  271. # state /connected/parsing
  272. self.states["/connected/parsing"] = State(11, self)
  273. # state /connected/parsing/wait_for_header
  274. self.states["/connected/parsing/wait_for_header"] = State(12, self)
  275. # state /connected/parsing/closing
  276. self.states["/connected/parsing/closing"] = State(13, self)
  277. self.states["/connected/parsing/closing"].setEnter(self._connected_parsing_closing_enter)
  278. self.states["/connected/parsing/closing"].setExit(self._connected_parsing_closing_exit)
  279. # state /connected/parsing/wait_for_payload
  280. self.states["/connected/parsing/wait_for_payload"] = State(14, self)
  281. # state /close
  282. self.states["/close"] = State(15, self)
  283. self.states["/close"].setEnter(self._close_enter)
  284. # add children
  285. self.states[""].addChild(self.states["/init"])
  286. self.states[""].addChild(self.states["/connected"])
  287. self.states[""].addChild(self.states["/close"])
  288. self.states["/connected"].addChild(self.states["/connected/listening"])
  289. self.states["/connected"].addChild(self.states["/connected/sending"])
  290. self.states["/connected"].addChild(self.states["/connected/queueing"])
  291. self.states["/connected"].addChild(self.states["/connected/parsing"])
  292. self.states["/connected/listening"].addChild(self.states["/connected/listening/listen"])
  293. self.states["/connected/listening"].addChild(self.states["/connected/listening/closed"])
  294. self.states["/connected/sending"].addChild(self.states["/connected/sending/waiting_for_data"])
  295. self.states["/connected/sending"].addChild(self.states["/connected/sending/transferring"])
  296. self.states["/connected/queueing"].addChild(self.states["/connected/queueing/queueing"])
  297. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_header"])
  298. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/closing"])
  299. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
  300. self.states[""].fixTree()
  301. self.states[""].default_state = self.states["/init"]
  302. self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
  303. self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
  304. self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
  305. self.states["/connected/parsing"].default_state = self.states["/connected/parsing/wait_for_header"]
  306. # transition /init
  307. _init_0 = Transition(self, self.states["/init"], [self.states["/connected"]])
  308. _init_0.setAction(self._init_0_exec)
  309. _init_0.setTrigger(Event("set_association_name", None))
  310. self.states["/init"].addTransition(_init_0)
  311. # transition /connected/listening/listen
  312. _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
  313. _connected_listening_listen_0.setAction(self._connected_listening_listen_0_exec)
  314. _connected_listening_listen_0.setTrigger(Event("received_socket", "socket_in"))
  315. _connected_listening_listen_0.setGuard(self._connected_listening_listen_0_guard)
  316. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_0)
  317. _connected_listening_listen_1 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/closed"]])
  318. _connected_listening_listen_1.setAction(self._connected_listening_listen_1_exec)
  319. _connected_listening_listen_1.setTrigger(Event("received_socket", "socket_in"))
  320. _connected_listening_listen_1.setGuard(self._connected_listening_listen_1_guard)
  321. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_1)
  322. # transition /connected/sending/waiting_for_data
  323. _connected_sending_waiting_for_data_0 = Transition(self, self.states["/connected/sending/waiting_for_data"], [self.states["/connected/sending/transferring"]])
  324. _connected_sending_waiting_for_data_0.setAction(self._connected_sending_waiting_for_data_0_exec)
  325. _connected_sending_waiting_for_data_0.setTrigger(None)
  326. _connected_sending_waiting_for_data_0.setGuard(self._connected_sending_waiting_for_data_0_guard)
  327. self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
  328. # transition /connected/sending/transferring
  329. _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
  330. _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
  331. _connected_sending_transferring_0.setTrigger(Event("sent_socket", "socket_in"))
  332. _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
  333. self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
  334. # transition /connected/queueing/queueing
  335. _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
  336. _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
  337. _connected_queueing_queueing_0.setTrigger(Event("HTTP_input", None))
  338. self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
  339. # transition /connected/parsing/wait_for_header
  340. _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
  341. _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
  342. _connected_parsing_wait_for_header_0.setTrigger(None)
  343. _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
  344. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
  345. _connected_parsing_wait_for_header_1 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/closing"]])
  346. _connected_parsing_wait_for_header_1.setTrigger(None)
  347. _connected_parsing_wait_for_header_1.setGuard(self._connected_parsing_wait_for_header_1_guard)
  348. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_1)
  349. # transition /connected/parsing/closing
  350. _connected_parsing_closing_0 = Transition(self, self.states["/connected/parsing/closing"], [self.states["/connected/parsing/closing"]])
  351. _connected_parsing_closing_0.setAction(self._connected_parsing_closing_0_exec)
  352. _connected_parsing_closing_0.setTrigger(Event("_0after"))
  353. self.states["/connected/parsing/closing"].addTransition(_connected_parsing_closing_0)
  354. # transition /connected/parsing/wait_for_payload
  355. _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
  356. _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
  357. _connected_parsing_wait_for_payload_0.setTrigger(None)
  358. _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
  359. self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
  360. # transition /connected
  361. _connected_0 = Transition(self, self.states["/connected"], [self.states["/close"]])
  362. _connected_0.setTrigger(Event("close", None))
  363. self.states["/connected"].addTransition(_connected_0)
  364. def _connected_listening_listen_enter(self):
  365. self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
  366. def _connected_listening_closed_enter(self):
  367. self.closed = True
  368. def _connected_parsing_closing_enter(self):
  369. self.addTimer(0, 0.0)
  370. def _connected_parsing_closing_exit(self):
  371. self.removeTimer(0)
  372. def _close_enter(self):
  373. self.big_step.outputEvent(Event("close_socket", "socket_out", [self.socket]))
  374. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
  375. def _init_0_exec(self, parameters):
  376. association_name = parameters[0]
  377. self.association_name = association_name
  378. def _connected_listening_listen_0_exec(self, parameters):
  379. socket = parameters[0]
  380. data = parameters[1]
  381. self.received_data += data
  382. self.raiseInternalEvent(Event("received_data", None, []))
  383. def _connected_listening_listen_0_guard(self, parameters):
  384. socket = parameters[0]
  385. data = parameters[1]
  386. return (self.socket == socket) and (len(data) > 0)
  387. def _connected_listening_listen_1_exec(self, parameters):
  388. socket = parameters[0]
  389. data = parameters[1]
  390. self.raiseInternalEvent(Event("received_data", None, []))
  391. def _connected_listening_listen_1_guard(self, parameters):
  392. socket = parameters[0]
  393. data = parameters[1]
  394. return (self.socket == socket) and (len(data) == 0)
  395. def _connected_sending_waiting_for_data_0_exec(self, parameters):
  396. self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
  397. def _connected_sending_waiting_for_data_0_guard(self, parameters):
  398. return len(self.send_data) > 0
  399. def _connected_sending_transferring_0_exec(self, parameters):
  400. socket = parameters[0]
  401. sent_bytes = parameters[1]
  402. self.send_data = self.send_data[sent_bytes:]
  403. def _connected_sending_transferring_0_guard(self, parameters):
  404. socket = parameters[0]
  405. sent_bytes = parameters[1]
  406. return self.socket == socket
  407. def _connected_queueing_queueing_0_exec(self, parameters):
  408. data = parameters[0]
  409. #post_data = "&".join(["%s=%s" % (urllib.quote(k), urllib.quote(v)) for k, v in data.iteritems()])
  410. #post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
  411. post_data = data
  412. self.send_data += "HTTP/1.0 200 OK\r\n"
  413. self.send_data += "Content-Length: %s\r\n" % len(post_data)
  414. self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
  415. self.send_data += "\r\n"
  416. self.send_data += str(post_data)
  417. def _connected_parsing_wait_for_header_0_exec(self, parameters):
  418. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  419. header = header.lower()
  420. if "content-length" in header:
  421. _, after = header.split("content-length:", 1)
  422. after = after.split("\r\n", 1)[0]
  423. after = after.strip()
  424. self.length = int(after)
  425. else:
  426. self.length = float('inf')
  427. def _connected_parsing_wait_for_header_0_guard(self, parameters):
  428. return '\r\n\r\n' in self.received_data and self.received_data.startswith('POST')
  429. def _connected_parsing_wait_for_header_1_guard(self, parameters):
  430. return self.closed and len(self.received_data) == 0
  431. def _connected_parsing_closing_0_exec(self, parameters):
  432. self.raiseInternalEvent(Event("close", None, []))
  433. def _connected_parsing_wait_for_payload_0_exec(self, parameters):
  434. if self.length == float('inf'):
  435. data = self.received_data
  436. self.received_data = ""
  437. else:
  438. data = self.received_data[:self.length]
  439. self.received_data = self.received_data[self.length:]
  440. print("Got data: " + str(data))
  441. # We support POST data only, so everything is in the data
  442. #try:
  443. # params = dict([p.split('=') for p in data.split('&')])
  444. # data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  445. #except:
  446. # data = {}
  447. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
  448. def _connected_parsing_wait_for_payload_0_guard(self, parameters):
  449. return len(self.received_data) >= self.length or self.closed
  450. def initializeStatechart(self):
  451. # enter default state
  452. states = self.states["/init"].getEffectiveTargetStates()
  453. self.updateConfiguration(states)
  454. for state in states:
  455. if state.enter:
  456. state.enter()
  457. class ObjectManager(ObjectManagerBase):
  458. def __init__(self, controller):
  459. ObjectManagerBase.__init__(self, controller)
  460. def instantiate(self, class_name, construct_params):
  461. if class_name == "Echo":
  462. instance = Echo(self.controller, construct_params[0])
  463. instance.associations = {}
  464. instance.associations["to_server"] = Association("Server", 1, 1)
  465. elif class_name == "Server":
  466. instance = Server(self.controller, construct_params[0], construct_params[1])
  467. instance.associations = {}
  468. instance.associations["sockets"] = Association("Socket", 0, -1)
  469. instance.associations["parent"] = Association("Echo", 1, 1)
  470. elif class_name == "Socket":
  471. instance = Socket(self.controller, construct_params[0])
  472. instance.associations = {}
  473. instance.associations["parent"] = Association("Server", 1, 1)
  474. else:
  475. raise Exception("Cannot instantiate class " + class_name)
  476. return instance
  477. class Controller(ThreadsControllerBase):
  478. def __init__(self, params, keep_running = None):
  479. if keep_running == None: keep_running = True
  480. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running)
  481. self.addInputPort("socket_in")
  482. self.addOutputPort("socket_out")
  483. self.object_manager.createInstance("Echo", [params])