11#!/usr/bin/python
22
3+
34__author__ = 'macs'
45
5- from flask import Flask , request , Response
6+ from flask import Flask , request , Response , g
67from sys import argv
8+ from time import sleep
9+ import threading
710import random
811import json
12+ import requests
913
1014app = Flask (__name__ )
1115
1216# Default arguments
13- port = 7010
14- host = '0 .0.0.0 '
17+ port = 6500
18+ host = '127 .0.0.1 '
1519
1620# Arguments from command line
1721if len (argv ) > 1 :
2024
2125@app .route ('/sync/request' , methods = ['POST' ])
2226def treat_sync_request ():
23- global lastRequest , myResponse , cont
27+ global last_request , cont , delay
2428
25- my_result = {}
29+ app .logger .info ("Received sync request" )
30+ # Increase the number of requests
2631 cont += 1
27- lastRequest = request .data
28- jdata = json .loads (request .data )
29- my_result ["result" ] = 'action-' + jdata ['action' ] + ', extra-' + jdata ['extra' ]
30- resp = Response ()
31- return Response (response = json .dumps (my_result ), status = 200 , content_type = 'application/json' , headers = resp .headers )
32+
33+ # Store the last request
34+ last_request = request .data
35+ app .logger .info ('Request data received: ' + last_request )
36+
37+ # Set delay if needed
38+ if delay is not '' :
39+ app .logger .info ("Delay stated" )
40+ sleep (int (delay ))
41+ delay = ''
42+
43+ # Retrieve request information
44+ service = request .headers ['fiware-service' ]
45+ subservice = request .headers ['fiware-servicepath' ]
46+ button_id = json .loads (request .data )['button' ]
47+ headers = {'Accept' : 'application/json' , 'content-type' : 'application/json' , 'fiware-service' : service ,
48+ 'fiware-servicepath' : subservice }
49+
50+ # Generate sync response
51+ sync_response = {'externalId' : generate_uid (), 'buttonId' : button_id , 'details' : {}}
52+ sync_response ['details' ]['rgb' ] = '66CCDD'
53+ sync_response ['details' ]['t' ] = '2'
54+ app .logger .info ('Response sent: ' + json .dumps (sync_response ))
55+
56+ return Response (response = json .dumps (sync_response ), status = 200 , headers = headers )
3257
3358
3459@app .route ('/async/create' , methods = ['POST' ])
3560def treat_async_create ():
36- global asyncRequest
61+ global last_request
3762
38- uid = str (random .randint (1 , 999 ))
39- asyncRequest [uid ] = '{"state": "P"}'
40- print asyncRequest
41- myresp = '{"id": ' + uid + ', "details": {"rgb" : "66CCDD", "t": 2}}'
42- return Response (response = myresp , status = 200 , content_type = 'application/json' )
63+ app .logger .info ("Recived async create" )
64+ # Store the last request
65+ last_request = request .data
66+ app .logger .info ('Request data received: ' + last_request )
4367
68+ # Retrieve callback url and buttonId from request
69+ service = request .headers ['fiware-service' ]
70+ subservice = request .headers ['fiware-servicepath' ]
71+ url_callback = json .loads (request .data )['callback' ]
72+ button_id = json .loads (request .data )['button' ]
4473
45- @app .route ('/async/requests' , methods = ['POST' ,'GET' ])
46- def treat_async_request_all ():
47- global asyncRequest
74+ # Compose the async response
75+ async_response = {'externalId' : str (generate_uid ()), 'buttonId' : str (button_id ), 'details' : {}}
76+ async_response ['details' ]['rgb' ] = '66CCDD'
77+ async_response ['details' ]['t' ] = '2'
4878
49- return Response (response = str (asyncRequest ), status = 200 )
79+ # Invoke callback response
80+ t = threading .Thread (target = invoke_ca , args = (async_response , url_callback , service , subservice ))
81+ t .start ()
82+ return Response (response = 'Create Received OK' , status = 200 )
5083
5184
52- @ app . route ( '/async/request/<uid>' , methods = [ 'POST' , 'GET' ])
53- def treat_async_request ( uid ):
54- global asyncRequest
85+ def invoke_ca ( async_response , url_callback , service , subservice ):
86+ # Wait until request is finished
87+ sleep ( 3 )
5588
56- return Response (response = asyncRequest [uid ], status = 200 , content_type = 'application/json' )
89+ # Send data to urlCallback
90+ headers = {'Accept' : 'application/json' , 'content-type' : 'application/json' , 'fiware-service' : service ,
91+ 'fiware-servicepath' : subservice }
92+ app .logger .info ('Response sent to ' + url_callback + ' is: ' + json .dumps (async_response ))
93+ r = requests .post (url_callback , data = json .dumps (async_response ), headers = headers )
94+ return r
95+
96+
97+ def generate_uid ():
98+ uid = str (random .randint (1 , 9999999 ))
99+ app .logger .info ('Generated uid: ' + uid )
100+ return uid
57101
58102
59103@app .route ('/setResponseToError' , methods = ['GET' ])
@@ -72,12 +116,19 @@ def treat_set_response_to_ok():
72116 return Response (response = 'Simulator set to OK' , status = 200 )
73117
74118
119+ @app .route ('/setDelayToSync' , methods = ['GET' ])
120+ def treat_set_delay_to_sync ():
121+ global delay
122+
123+ delay = request .args .get ('delay' )
124+ return Response (response = 'Delay to next sync request set to ' + delay , status = 200 )
125+
126+
75127@app .route ('/last' , methods = ['GET' ])
76128def treat_last ():
77- global lastRequest
129+ global last_request
78130
79- resp_last = Response ()
80- return Response (response = lastRequest , status = 200 , content_type = 'application/json' , headers = resp_last .headers )
131+ return Response (response = last_request , status = 200 )
81132
82133
83134@app .route ('/count' , methods = ['GET' ])
@@ -88,19 +139,17 @@ def count():
88139
89140@app .route ('/reset' , methods = ['GET' ])
90141def reset ():
91- global lastRequest , asyncRequest , cont
92- lastRequest = ''
93- asyncRequest = {}
142+ global last_request , cont
143+ last_request = ''
94144 cont = 0
95145 return Response (status = 200 )
96146
97147
98148# Globals
99- lastRequest = ''
149+ last_request = ''
100150responseError = ''
101- myResponse = '{"details": {"rgb":"66CC00","t":2}}'
102151cont = 0
103- asyncRequest = {}
152+ delay = ''
104153
105154if __name__ == '__main__' :
106- app .run (host = host , port = port )
155+ app .run (host = host , port = port , debug = True )
0 commit comments