def __call__(self, env, start_response):
try:
query_dict = urllib.parse.parse_qs(env['QUERY_STRING'])
# use the ?segment= query string variable or the host string to figure out which sqlite database to talk to.
segment_id = query_dict.get('segment', env.get('HTTP_HOST', "").split("."))[0]
logging.info('Connecting to Rethinkdb on: %s' % settings['RETHINKDB_HOSTS'])
segment = trough.sync.Segment(segment_id=segment_id, size=0, rethinker=self.rethinker, services=self.services, registry=self.registry)
content_length = int(env.get('CONTENT_LENGTH', 0))
query = env.get('wsgi.input').read(content_length)
write_lock = segment.retrieve_write_lock()
if write_lock and write_lock['node'] != settings['HOSTNAME']:
logging.info('Found write lock for {segment}. Proxying {query} to {host}'.format(segment=segment.id, query=query, host=write_lock['node']))
return self.proxy_for_write_host(write_lock['node'], segment, query, start_response)
## # enforce that we are querying the correct database, send an explicit hostname.
## write_url = "http://{node}:{port}/?segment={segment}".format(node=node, segment=segment.id, port=settings['READ_PORT'])
## with requests.post(write_url, stream=True, data=query) as r:
## status_line = '{status_code} {reason}'.format(status_code=r.status_code, reason=r.reason)
## headers = [("Content-Type", r.headers['Content-Type'],)]
## start_response(status_line, headers)
## return r.iter_content()
cursor = self.execute_query(segment, query)
start_response('200 OK', [('Content-Type','application/json')])
return self.sql_result_json_iter(cursor)
except Exception as e:
logging.error('500 Server Error due to exception', exc_info=True)
start_response('500 Server Error', [('Content-Type', 'text/plain')])
return [('500 Server Error: %s\n' % str(e)).encode('utf-8')]
评论列表
文章目录