def events_post(): sub_secret = flask.request.args.get('sub_secret', None) if sub_secret != config.withings_creds['sub_secret']: logging.warning( 'WithingsEvent: Invalid sub_secret: Provided %s, expected %s' % (sub_secret, config.withings_creds['sub_secret']) ) # Events come POSTED in the form: # logging.info('Received Event: Headers:\n%s\nBody:\n%s', # flask.request.headers, flask.request.get_data()) # Headers: # X-Google-Apps-Metadata: domain=gmail.com,host=*.bikebuds.cc # X-Appengine-Citylatlong: 0.000000,0.000000 # X-Cloud-Trace-Context: \ # 501952e8e74efe98b012acc24be99669/717376932886432083;o=1 # X-Appengine-Default-Namespace: gmail.com # Content-Length: 63 # X-Appengine-Region: ? # User-Agent: GuzzleHttp/6.2.1 curl/7.58.0 PHP/7.2.15-0ubuntu0.18.04.1 # Host: www.bikebuds.cc # X-Appengine-City: ? # X-Appengine-Country: FR # Content-Type: application/x-www-form-urlencoded # Body: # userid=17012450&startdate=1532017199&enddate=1532017200&appli=1 # event_data = { # 'userid': 17012450, # 'startdate': 1532017199, # 'enddate': 1532017200, # 'appli': 1, # } event_data = None try: event_data = flask.request.form.to_dict() except Exception: logging.error('WithingsEvent: Failed form data: %s', flask.request.form) service_key = None try: if 'service_key' in flask.request.args: service_key = Key.from_legacy_urlsafe(flask.request.args.get('service_key')) else: logging.debug( 'WithingsEvent: service_key missing in callbackurl %s', flask.request.url, ) except binascii.Error: # In older code we accidentally registered with poorly constructed # callbackurls, ignore these. logging.debug( 'WithingsEvent: Invalid event from bad callbackurl %s', flask.request.url ) except Exception: logging.exception( 'WithingsEvent: Failed service_key: %s', flask.request.args.get('service_key'), ) if event_data is None or service_key is None: sub_event_failure = SubscriptionEvent.to_entity( { 'url': flask.request.url, 'event_data': event_data, 'failure': True, 'date': datetime.datetime.utcnow(), }, parent=service_key, ) logging.error('WithingsEvent: failure: %s', sub_event_failure) return responses.OK_SUB_EVENT_FAILED # We can proess this entity. event_entity = SubscriptionEvent.to_entity( { 'url': flask.request.url, 'event_data': event_data, 'failure': False, 'date': datetime.datetime.utcnow(), }, name=SubscriptionEvent.hash_name(*sorted(event_data.values())), parent=service_key, ) logging.debug( 'WithingsEvent: Processing: %s from url: %s', event_entity.key, flask.request.url, ) try: task_util.process_event(service_key, event_entity) logging.info('WithingsEvent: Queued: %s', event_entity.key) except AlreadyExists: logging.info('WithingsEvent: Duplicate: %s', event_entity.key) return responses.OK