# -*- coding: utf-8 -*- import logging from tornado import escape from tornado.web import HTTPError # HTTP status code HTTP_OK = 200 ERROR_BAD_REQUEST = 400 ERROR_UNAUTHORIZED = 401 ERROR_FORBIDDEN = 403 ERROR_NOT_FOUND = 404 ERROR_METHOD_NOT_ALLOWED = 405 ERROR_INTERNAL_SERVER_ERROR = 500 # Custom error code ERROR_WARNING = 1001 ERROR_DEPRECATED = 1002 ERROR_MAINTAINING = 1003 ERROR_UNKNOWN_ERROR = 9999 ERROR_LICENSE_NOT_ACTIVE = 9000 ERROR_LICENSE_EXPIRE_ATALL = 9003 class HTTPAPIError(HTTPError): """API error handling exception API server always returns formatted JSON to client even there is an internal server error. """ def __init__(self, status_code=ERROR_UNKNOWN_ERROR, message=None, error=None, data=None, log_message=None, *args): assert isinstance(data, dict) or data is None message = message if message else "" assert isinstance(message, str) super(HTTPAPIError, self).__init__(int(status_code), log_message, *args) self.error = error if error else \ _error_types.get(self.status_code, _unknow_error) self.message = message self.data = data if data is not None else {} def __str__(self): err = {"meta": {"code": self.status_code, "error": self.error}} if self.data: err["data"] = self.data if self.message: err["meta"]["message"] = self.message return escape.json_encode(err) # default errors _unknow_error = "unknow_error" _error_types = {400: "bad_request", 401: "unauthorized", 403: "forbidden", 404: "not_found", 405: "method_not_allowed", 500: "internal_server_error", 1001: "warning", 1002: "deprecated", 1003: "maintaining", 9000: "license_not_active", 9003: "license_expire_at_all", 9999: _unknow_error}