diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 608d779c2..7c9980aeb 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -213,48 +213,56 @@ int SrsApiConfigsLogs::do_process_request(SrsSocket* skt, SrsHttpMessage* req) { int ret = ERROR_SUCCESS; - if (req->is_http_put()) { - srs_trace("http api PUT logs, req is: %s", req->body().c_str()); + // HTTP GET + if (req->is_http_get()) { + std::stringstream ss; + ss << JOBJECT_START + << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT + << JFIELD_ORG("data", JOBJECT_START) + << JFIELD_STR("tank", (_srs_config->get_log_tank_file()? "file":"console")) << JFIELD_CONT + << JFIELD_STR("level", _srs_config->get_log_level()) << JFIELD_CONT + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT + << JFIELD_STR("file", _srs_config->get_log_file()) + << JOBJECT_END + << JOBJECT_END; - SrsJsonAny* json = SrsJsonAny::loads(req->body_raw()); - SrsAutoFree(SrsJsonAny, json); - - if (json->is_object()) { - SrsJsonObject* o = json->to_object(); - SrsJsonAny* prop = NULL; - if ((prop = o->ensure_property_string("file")) != NULL && _srs_config->set_log_file(prop->to_str())) { - if ((ret = _srs_config->force_reload_log_file()) != ERROR_SUCCESS) { - return response_error(skt, req, ret, "reload log file failed"); - } - srs_warn("http api reload log file to %s", prop->to_str().c_str()); - } - if ((prop = o->ensure_property_string("tank")) != NULL && _srs_config->set_log_tank(prop->to_str())) { - if ((ret = _srs_config->force_reload_log_tank()) != ERROR_SUCCESS) { - return response_error(skt, req, ret, "reload log tank failed"); - } - srs_warn("http api reload log tank to %s", prop->to_str().c_str()); - } - if ((prop = o->ensure_property_string("level")) != NULL && _srs_config->set_log_level(prop->to_str())) { - if ((ret = _srs_config->force_reload_log_level()) != ERROR_SUCCESS) { - return response_error(skt, req, ret, "reload log level failed"); - } - srs_warn("http api reload log level to %s", prop->to_str().c_str()); - } - } + return res_json(skt, req, ss.str()); } - std::stringstream ss; - ss << JOBJECT_START - << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT - << JFIELD_ORG("data", JOBJECT_START) - << JFIELD_STR("tank", (_srs_config->get_log_tank_file()? "file":"console")) << JFIELD_CONT - << JFIELD_STR("level", _srs_config->get_log_level()) << JFIELD_CONT - << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT - << JFIELD_STR("file", _srs_config->get_log_file()) - << JOBJECT_END - << JOBJECT_END; + // HTTP PUT + srs_trace("http api PUT logs, req is: %s", req->body().c_str()); - return res_json(skt, req, ss.str()); + SrsJsonAny* json = SrsJsonAny::loads(req->body_raw()); + SrsAutoFree(SrsJsonAny, json); + + if (!json) { + return response_error(skt, req, ERROR_HTTP_API_LOGS, "invalid PUT json"); + } else if (!json->is_object()) { + return response_error(skt, req, ERROR_HTTP_API_LOGS, "invalid PUT json logs params"); + } + + SrsJsonObject* o = json->to_object(); + SrsJsonAny* prop = NULL; + if ((prop = o->ensure_property_string("file")) != NULL && _srs_config->set_log_file(prop->to_str())) { + if ((ret = _srs_config->force_reload_log_file()) != ERROR_SUCCESS) { + return response_error(skt, req, ret, "reload log file failed"); + } + srs_warn("http api reload log file to %s", prop->to_str().c_str()); + } + if ((prop = o->ensure_property_string("tank")) != NULL && _srs_config->set_log_tank(prop->to_str())) { + if ((ret = _srs_config->force_reload_log_tank()) != ERROR_SUCCESS) { + return response_error(skt, req, ret, "reload log tank failed"); + } + srs_warn("http api reload log tank to %s", prop->to_str().c_str()); + } + if ((prop = o->ensure_property_string("level")) != NULL && _srs_config->set_log_level(prop->to_str())) { + if ((ret = _srs_config->force_reload_log_level()) != ERROR_SUCCESS) { + return response_error(skt, req, ret, "reload log level failed"); + } + srs_warn("http api reload log level to %s", prop->to_str().c_str()); + } + + return response_error(skt, req, ret, "PUT logs success."); } SrsApiVersion::SrsApiVersion() diff --git a/trunk/src/app/srs_app_json.cpp b/trunk/src/app/srs_app_json.cpp index 557d23bee..8e8cfdfdf 100644 --- a/trunk/src/app/srs_app_json.cpp +++ b/trunk/src/app/srs_app_json.cpp @@ -306,6 +306,10 @@ SrsJsonArray* SrsJsonAny::array() #ifdef SRS_JSON_USE_NXJSON SrsJsonAny* srs_json_parse_tree_nx_json(const nx_json* node) { + if (!node) { + return NULL; + } + switch (node->type) { case NX_JSON_NULL: return SrsJsonAny::null(); @@ -338,6 +342,7 @@ SrsJsonAny* srs_json_parse_tree_nx_json(const nx_json* node) return arr; } } + return NULL; } @@ -352,8 +357,13 @@ SrsJsonAny* SrsJsonAny::loads(char* str) } const nx_json* o = nx_json_parse(str, 0); + SrsJsonAny* json = srs_json_parse_tree_nx_json(o); - nx_json_free(o); + + if (o) { + nx_json_free(o); + } + return json; } #endif @@ -529,7 +539,7 @@ extern "C" { // redefine NX_JSON_REPORT_ERROR to use custom error reporting #ifndef NX_JSON_REPORT_ERROR -#define NX_JSON_REPORT_ERROR(msg, p) srs_error("NXJSON PARSE ERROR (%d): " msg " at %s\n", __LINE__, p) +#define NX_JSON_REPORT_ERROR(msg, p) srs_warn("NXJSON PARSE ERROR (%d): " msg " at %s", __LINE__, p) #endif #define IS_WHITESPACE(c) ((unsigned char)(c)<=(unsigned char)' ') diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 1676dd465..0ffbd80b4 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR "0" #define VERSION_MINOR "9" -#define VERSION_REVISION "103" +#define VERSION_REVISION "104" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "srs" diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 4279b6bc8..1a1a800fc 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -183,6 +183,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_HTTP_HANDLER_INVALID 804 #define ERROR_HTTP_OPEN_FILE 805 #define ERROR_HTTP_READ_FILE 806 +#define ERROR_HTTP_API_LOGS 807 // system control message, // not an error, but special control logic.