server.py 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Thu Aug 04 13:29:22 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.trigger = 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.setGuard(self._connected_sending_waiting_for_data_0_guard)
  326. self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
  327. # transition /connected/sending/transferring
  328. _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
  329. _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
  330. _connected_sending_transferring_0.trigger = Event("sent_socket", "socket_in")
  331. _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
  332. self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
  333. # transition /connected/queueing/queueing
  334. _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
  335. _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
  336. _connected_queueing_queueing_0.trigger = Event("HTTP_input", None)
  337. self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
  338. # transition /connected/parsing/wait_for_header
  339. _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
  340. _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
  341. _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
  342. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
  343. _connected_parsing_wait_for_header_1 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/closing"]])
  344. _connected_parsing_wait_for_header_1.setGuard(self._connected_parsing_wait_for_header_1_guard)
  345. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_1)
  346. # transition /connected/parsing/closing
  347. _connected_parsing_closing_0 = Transition(self, self.states["/connected/parsing/closing"], [self.states["/connected/parsing/closing"]])
  348. _connected_parsing_closing_0.setAction(self._connected_parsing_closing_0_exec)
  349. _connected_parsing_closing_0.trigger = Event("_0after")
  350. self.states["/connected/parsing/closing"].addTransition(_connected_parsing_closing_0)
  351. # transition /connected/parsing/wait_for_payload
  352. _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
  353. _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
  354. _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
  355. self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
  356. # transition /connected
  357. _connected_0 = Transition(self, self.states["/connected"], [self.states["/close"]])
  358. _connected_0.trigger = Event("close", None)
  359. self.states["/connected"].addTransition(_connected_0)
  360. def _connected_listening_listen_enter(self):
  361. self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
  362. def _connected_listening_closed_enter(self):
  363. self.closed = True
  364. def _connected_parsing_closing_enter(self):
  365. self.addTimer(0, 0.0)
  366. def _connected_parsing_closing_exit(self):
  367. self.removeTimer(0)
  368. def _close_enter(self):
  369. self.big_step.outputEvent(Event("close_socket", "socket_out", [self.socket]))
  370. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
  371. def _init_0_exec(self, parameters):
  372. association_name = parameters[0]
  373. self.association_name = association_name
  374. def _connected_listening_listen_0_exec(self, parameters):
  375. socket = parameters[0]
  376. data = parameters[1]
  377. self.received_data += data
  378. self.raiseInternalEvent(Event("received_data", None, []))
  379. def _connected_listening_listen_0_guard(self, parameters):
  380. socket = parameters[0]
  381. data = parameters[1]
  382. return (self.socket == socket) and (len(data) > 0)
  383. def _connected_listening_listen_1_exec(self, parameters):
  384. socket = parameters[0]
  385. data = parameters[1]
  386. self.raiseInternalEvent(Event("received_data", None, []))
  387. def _connected_listening_listen_1_guard(self, parameters):
  388. socket = parameters[0]
  389. data = parameters[1]
  390. return (self.socket == socket) and (len(data) == 0)
  391. def _connected_sending_waiting_for_data_0_exec(self, parameters):
  392. self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
  393. def _connected_sending_waiting_for_data_0_guard(self, parameters):
  394. return len(self.send_data) > 0
  395. def _connected_sending_transferring_0_exec(self, parameters):
  396. socket = parameters[0]
  397. sent_bytes = parameters[1]
  398. self.send_data = self.send_data[sent_bytes:]
  399. def _connected_sending_transferring_0_guard(self, parameters):
  400. socket = parameters[0]
  401. sent_bytes = parameters[1]
  402. return self.socket == socket
  403. def _connected_queueing_queueing_0_exec(self, parameters):
  404. data = parameters[0]
  405. #post_data = "&".join(["%s=%s" % (urllib.quote(k), urllib.quote(v)) for k, v in data.iteritems()])
  406. #post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
  407. post_data = data
  408. self.send_data += "HTTP/1.0 200 OK\r\n"
  409. self.send_data += "Content-Length: %s\r\n" % len(post_data)
  410. self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
  411. self.send_data += "\r\n"
  412. self.send_data += str(post_data)
  413. def _connected_parsing_wait_for_header_0_exec(self, parameters):
  414. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  415. header = header.lower()
  416. if "content-length" in header:
  417. _, after = header.split("content-length:", 1)
  418. after = after.split("\r\n", 1)[0]
  419. after = after.strip()
  420. self.length = int(after)
  421. else:
  422. self.length = float('inf')
  423. def _connected_parsing_wait_for_header_0_guard(self, parameters):
  424. return '\r\n\r\n' in self.received_data and self.received_data.startswith('POST')
  425. def _connected_parsing_wait_for_header_1_guard(self, parameters):
  426. return self.closed and len(self.received_data) == 0
  427. def _connected_parsing_closing_0_exec(self, parameters):
  428. self.raiseInternalEvent(Event("close", None, []))
  429. def _connected_parsing_wait_for_payload_0_exec(self, parameters):
  430. if self.length == float('inf'):
  431. data = self.received_data
  432. self.received_data = ""
  433. else:
  434. data = self.received_data[:self.length]
  435. self.received_data = self.received_data[self.length:]
  436. print("Got data: " + str(data))
  437. # We support POST data only, so everything is in the data
  438. #try:
  439. # params = dict([p.split('=') for p in data.split('&')])
  440. # data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  441. #except:
  442. # data = {}
  443. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
  444. def _connected_parsing_wait_for_payload_0_guard(self, parameters):
  445. return len(self.received_data) >= self.length or self.closed
  446. def initializeStatechart(self):
  447. # enter default state
  448. states = self.states["/init"].getEffectiveTargetStates()
  449. self.updateConfiguration(states)
  450. for state in states:
  451. if state.enter:
  452. state.enter()
  453. class ObjectManager(ObjectManagerBase):
  454. def __init__(self, controller):
  455. ObjectManagerBase.__init__(self, controller)
  456. def instantiate(self, class_name, construct_params):
  457. if class_name == "Echo":
  458. instance = Echo(self.controller, construct_params[0])
  459. instance.associations = {}
  460. instance.associations["to_server"] = Association("Server", 1, 1)
  461. elif class_name == "Server":
  462. instance = Server(self.controller, construct_params[0], construct_params[1])
  463. instance.associations = {}
  464. instance.associations["sockets"] = Association("Socket", 0, -1)
  465. instance.associations["parent"] = Association("Echo", 1, 1)
  466. elif class_name == "Socket":
  467. instance = Socket(self.controller, construct_params[0])
  468. instance.associations = {}
  469. instance.associations["parent"] = Association("Server", 1, 1)
  470. else:
  471. raise Exception("Cannot instantiate class " + class_name)
  472. return instance
  473. class Controller(ThreadsControllerBase):
  474. def __init__(self, params, keep_running = None):
  475. if keep_running == None: keep_running = True
  476. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running)
  477. self.addInputPort("socket_in")
  478. self.addOutputPort("socket_out")
  479. self.object_manager.createInstance("Echo", [params])