def send_contribute(): """ SEND THE contribute.json """ try: record_request(flask.request, None, flask.request.get_data(), None) return Response(CONTRIBUTE, status=200) except Exception as e: Log.error("Could not return contribute.json", cause=e)
def _default(path): record_request(flask.request, None, flask.request.get_data(), None) return Response( unicode2utf8(OVERVIEW), status=200, headers={ "Content-Type": "text/html" } )
def send_favicon(): with RegisterThread(): try: record_request(flask.request, None, flask.request.get_data(), None) content, status, mimetype = _read_file("favicon.ico") return Response(content, status=status, headers={"Content-Type": "image/x-icon"}) except Exception as e: Log.error("Could not get file {{file}}", file="favicon.ico", cause=e)
def download(filename): """ DOWNLOAD FILE CONTENTS :param filename: URL PATH :return: Response OBJECT WITH FILE CONTENT """ try: record_request(flask.request, None, flask.request.get_data(), None) content, status, mimetype = _read_file(filename) return Response(content, status=status, headers={"Content-Type": mimetype}) except Exception, e: Log.error("Could not get file {{file}}", file=filename, cause=e)
def _send_error(active_data_timer, body, e): record_request(flask.request, None, body, e) Log.warning("Could not process\n{{body}}", body=body.decode("latin1"), cause=e) e = e.__data__() e.meta.timing.total = active_data_timer.duration.seconds # REMOVE TRACES, BECAUSE NICER TO HUMANS # def remove_trace(e): # e.trace = e.trace[0:1:] # for c in listwrap(e.cause): # remove_trace(c) # remove_trace(e) return Response(convert.unicode2utf8(convert.value2json(e)), status=400)
def query(path): with CProfiler(): try: with Timer("total duration") as query_timer: preamble_timer = Timer("preamble") with preamble_timer: if flask.request.headers.get("content-length", "") in ["", "0"]: # ASSUME A BROWSER HIT THIS POINT, SEND text/html RESPONSE BACK return Response(BLANK, status=400, headers={"Content-Type": "text/html"}) elif int(flask.request.headers["content-length"] ) > QUERY_SIZE_LIMIT: Log.error("Query is too large") request_body = flask.request.get_data().strip() text = convert.utf82unicode(request_body) text = replace_vars(text, flask.request.args) data = convert.json2value(text) record_request(flask.request, data, None, None) if data.meta.testing: _test_mode_wait(data) translate_timer = Timer("translate") with translate_timer: if data.sql: data = parse_sql(data.sql) frum = wrap_from(data['from']) result = jx.run(data, frum=frum) if isinstance( result, Container ): #TODO: REMOVE THIS CHECK, jx SHOULD ALWAYS RETURN Containers result = result.format(data.format) save_timer = Timer("save") with save_timer: if data.meta.save: try: result.meta.saved_as = save_query.query_finder.save( data) except Exception, e: Log.warning("Unexpected save problem", cause=e) result.meta.timing.preamble = Math.round( preamble_timer.duration.seconds, digits=4) result.meta.timing.translate = Math.round( translate_timer.duration.seconds, digits=4) result.meta.timing.save = Math.round( save_timer.duration.seconds, digits=4) result.meta.timing.total = "{{TOTAL_TIME}}" # TIMING PLACEHOLDER with Timer("jsonification") as json_timer: response_data = convert.unicode2utf8( convert.value2json(result)) with Timer("post timer"): # IMPORTANT: WE WANT TO TIME OF THE JSON SERIALIZATION, AND HAVE IT IN THE JSON ITSELF. # WE CHEAT BY DOING A (HOPEFULLY FAST) STRING REPLACEMENT AT THE VERY END timing_replacement = b'"total": ' + str(Math.round(query_timer.duration.seconds, digits=4)) +\ b', "jsonification": ' + str(Math.round(json_timer.duration.seconds, digits=4)) response_data = response_data.replace( b'"total": "{{TOTAL_TIME}}"', timing_replacement) Log.note("Response is {{num}} bytes in {{duration}}", num=len(response_data), duration=query_timer.duration) return Response( response_data, status=200, headers={"Content-Type": result.meta.content_type}) except Exception, e: e = Except.wrap(e) return _send_error(query_timer, request_body, e)
def sql_query(path): query_timer = Timer("total duration") request_body = None try: with query_timer: preamble_timer = Timer("preamble", silent=True) with preamble_timer: if flask.request.headers.get("content-length", "") in ["", "0"]: # ASSUME A BROWSER HIT THIS POINT, SEND text/html RESPONSE BACK return Response(BLANK, status=400, headers={"Content-Type": "text/html"}) elif int(flask.request.headers["content-length"] ) > QUERY_SIZE_LIMIT: Log.error("Query is too large") request_body = flask.request.get_data().strip() text = request_body.decode('utf8') data = json2value(text) record_request(flask.request, data, None, None) sql_translate_timer = Timer("sql translate", silent=True) with sql_translate_timer: if not data.sql: Log.error("Expecting a `sql` parameter") jx_query = parse_sql(data.sql) if jx_query['from'] != None: if data.meta.testing: test_mode_wait(jx_query, MAIN_THREAD.please_stop) frum = find_container(jx_query['from'], after=None) else: frum = None result = jx.run(jx_query, container=frum) if isinstance( result, Container ): # TODO: REMOVE THIS CHECK, jx SHOULD ALWAYS RETURN Containers result = result.format(jx_query.format) result.meta.jx_query = jx_query save_timer = Timer("save") with save_timer: if data.meta.save: try: result.meta.saved_as = save_query.query_finder.save( data) except Exception as e: Log.warning("Unexpected save problem", cause=e) result.meta.timing.preamble = mo_math.round( preamble_timer.duration.seconds, digits=4) result.meta.timing.sql_translate = mo_math.round( sql_translate_timer.duration.seconds, digits=4) result.meta.timing.save = mo_math.round( save_timer.duration.seconds, digits=4) result.meta.timing.total = "{{TOTAL_TIME}}" # TIMING PLACEHOLDER with Timer("jsonification", silent=True) as json_timer: response_data = value2json(result).encode('utf8') with Timer("post timer", silent=True): # IMPORTANT: WE WANT TO TIME OF THE JSON SERIALIZATION, AND HAVE IT IN THE JSON ITSELF. # WE CHEAT BY DOING A (HOPEFULLY FAST) STRING REPLACEMENT AT THE VERY END timing_replacement = b'"total": ' + str(mo_math.round(query_timer.duration.seconds, digits=4)) +\ b', "jsonification": ' + str(mo_math.round(json_timer.duration.seconds, digits=4)) response_data = response_data.replace(b'"total":"{{TOTAL_TIME}}"', timing_replacement) Log.note("Response is {{num}} bytes in {{duration}}", num=len(response_data), duration=query_timer.duration) return Response(response_data, status=200, headers={"Content-Type": result.meta.content_type}) except Exception as e: e = Except.wrap(e) return send_error(query_timer, request_body, e)