合并pr:#1025

This commit is contained in:
ziyue
2021-08-12 16:07:31 +08:00
parent 30b139eaf0
commit 4dbe0a1d3e
26 changed files with 303 additions and 283 deletions

View File

@@ -90,7 +90,7 @@ static HttpApi toApi(const function<void(API_ARGS_MAP_ASYNC)> &cb) {
//参数解析成map
auto args = getAllArgs(parser);
cb(sender, parser.getHeader(), headerOut, args, val, invoker);
cb(sender, headerOut, HttpAllArgs<decltype(args)>(parser, args), val, invoker);
};
}
@@ -107,26 +107,24 @@ static HttpApi toApi(const function<void(API_ARGS_JSON_ASYNC)> &cb) {
HttpSession::KeyValue headerOut;
headerOut["Content-Type"] = string("application/json; charset=") + charSet;
Json::Value out;
out["code"] = API::Success;
Json::Value val;
val["code"] = API::Success;
if (parser["Content-Type"].find("application/json") == string::npos) {
throw InvalidArgsException("该接口只支持json格式的请求");
}
//参数解析成json对象然后处理
Json::Value in;
Json::Value args;
Json::Reader reader;
reader.parse(parser.Content(), in);
reader.parse(parser.Content(), args);
//参数解析成map
auto urlArgs = getAllArgs(parser);
cb(sender, parser.getHeader(), headerOut, in, urlArgs, out, invoker);
cb(sender, headerOut, HttpAllArgs<decltype(args)>(parser, args), val, invoker);
};
}
static HttpApi toApi(const function<void(API_ARGS_JSON)> &cb) {
return toApi([cb](API_ARGS_JSON_ASYNC) {
cb(API_ARGS_JSON_VALUE);
cb(API_ARGS_VALUE);
invoker(200, headerOut, val.toStyledString());
});
}
@@ -140,7 +138,7 @@ static HttpApi toApi(const function<void(API_ARGS_STRING_ASYNC)> &cb) {
Json::Value val;
val["code"] = API::Success;
cb(sender, parser.getHeader(), headerOut, parser, val, invoker);
cb(sender, headerOut, HttpAllArgs<string>(parser, (string &)parser.Content()), val, invoker);
};
}
@@ -230,19 +228,18 @@ static inline void addHttpListener(){
size = body->remainSize();
}
const std::string& content = parser.Content();
if (size && size < 4 * 1024) {
string contentOut = body->readData(size)->toString();
DebugL << "\r\n# request:\r\n" << parser.Method() << " " << parser.FullUrl() << "\r\n"
<< "# content:\r\n" << (content.size() > 4 * 1024 ? content.substr(0, 4 * 1024) : content) << "\r\n"
<< "# response:\r\n"
<< contentOut << "\r\n";
<< "# content:\r\n" << parser.Content() << "\r\n"
<< "# response:\r\n"
<< contentOut << "\r\n";
invoker(code, headerOut, contentOut);
} else {
DebugL << "\r\n# request:\r\n" << parser.Method() << " " << parser.FullUrl() << "\r\n"
<< "# content:\r\n" << (content.size() > 4 * 1024 ? content.substr(0, 4 * 1024) : content) << "\r\n"
<< "# response size:"
<< size << "\r\n";
<< "# content:\r\n" << parser.Content() << "\r\n"
<< "# response size:"
<< size << "\r\n";
invoker(code, headerOut, body);
}
};
@@ -279,8 +276,8 @@ static recursive_mutex s_ffmpegMapMtx;
#if defined(ENABLE_RTPPROXY)
//rtp服务器列表
/*static*/ unordered_map<string, RtpServer::Ptr> s_rtpServerMap;
/*static*/ recursive_mutex s_rtpServerMapMtx;
static unordered_map<string, RtpServer::Ptr> s_rtpServerMap;
static recursive_mutex s_rtpServerMapMtx;
#endif
static inline string getProxyKey(const string &vhost, const string &app, const string &stream) {
@@ -412,7 +409,7 @@ void installWebApi() {
CHECK_SECRET();
auto &ini = mINI::Instance();
int changed = API::Success;
for (auto &pr : allArgs) {
for (auto &pr : allArgs.getArgs()) {
if (ini.find(pr.first) == ini.end()) {
#if 1
//没有这个key
@@ -564,7 +561,7 @@ void installWebApi() {
CHECK_SECRET();
Value jsession;
uint16_t local_port = allArgs["local_port"].as<uint16_t>();
string &peer_ip = allArgs["peer_ip"];
string peer_ip = allArgs["peer_ip"];
SessionMap::Instance().for_each_session([&](const string &id,const Session::Ptr &session){
if(local_port != 0 && local_port != session->get_local_port()){
@@ -602,7 +599,7 @@ void installWebApi() {
api_regist("/index/api/kick_sessions",[](API_ARGS_MAP){
CHECK_SECRET();
uint16_t local_port = allArgs["local_port"].as<uint16_t>();
string &peer_ip = allArgs["peer_ip"];
string peer_ip = allArgs["peer_ip"];
size_t count_hit = 0;
list<Session::Ptr> session_list;
@@ -859,7 +856,7 @@ void installWebApi() {
//测试url http://127.0.0.1/index/api/downloadBin
api_regist("/index/api/downloadBin",[](API_ARGS_MAP_ASYNC){
CHECK_SECRET();
invoker.responseFile(headerIn,StrCaseMap(),exePath());
invoker.responseFile(allArgs.getParser().getHeader(),StrCaseMap(),exePath());
});
#if defined(ENABLE_RTPPROXY)
@@ -935,56 +932,21 @@ void installWebApi() {
api_regist("/index/api/startSendRtp",[](API_ARGS_MAP_ASYNC){
CHECK_SECRET();
CHECK_ARGS("vhost", "app", "stream", "ssrc", "dst_url", "dst_port", "is_udp");
bool isAsync = false;
if (checkArgs(allArgs, "is_async"))
isAsync = allArgs["is_async"];
if (isAsync)
{
MediaInfo info = {};
info._vhost = allArgs["vhost"];
info._app = allArgs["app"];
info._streamid = allArgs["stream"];
info._schema = RTSP_SCHEMA;
auto session = static_cast<TcpSession*>(&sender);
auto session_ptr = session->shared_from_this();
MediaSource::findAsync(info, session_ptr, [=](const MediaSource::Ptr& src_in) mutable {
if (!src_in) {
val["code"] = API::OtherFailed;
val["msg"] = "该媒体流不存在";
invoker(200, headerOut, val.toStyledString());
return;
}
auto src = dynamic_pointer_cast<RtspMediaSource>(src_in);
//src_port为空时则随机本地端口
src->startSendRtp(allArgs["dst_url"], allArgs["dst_port"], allArgs["ssrc"], allArgs["is_udp"], allArgs["src_port"], [val, headerOut, invoker](uint16_t local_port, const SockException& ex) mutable {
if (ex) {
val["code"] = API::OtherFailed;
val["msg"] = ex.what();
}
val["local_port"] = local_port;
invoker(200, headerOut, val.toStyledString());
});
});
auto src = MediaSource::find(allArgs["vhost"], allArgs["app"], allArgs["stream"]);
if (!src) {
throw ApiRetException("该媒体流不存在", API::OtherFailed);
}
else
{
auto src = MediaSource::find(allArgs["vhost"], allArgs["app"], allArgs["stream"]);
if (!src) {
throw ApiRetException("该媒体流不存在", API::OtherFailed);
//src_port为空时则随机本地端口
src->startSendRtp(allArgs["dst_url"], allArgs["dst_port"], allArgs["ssrc"], allArgs["is_udp"], allArgs["src_port"], [val, headerOut, invoker](uint16_t local_port, const SockException &ex) mutable{
if (ex) {
val["code"] = API::OtherFailed;
val["msg"] = ex.what();
}
//src_port为空时则随机本地端口
src->startSendRtp(allArgs["dst_url"], allArgs["dst_port"], allArgs["ssrc"], allArgs["is_udp"], allArgs["src_port"], [val, headerOut, invoker](uint16_t local_port, const SockException& ex) mutable {
if (ex) {
val["code"] = API::OtherFailed;
val["msg"] = ex.what();
}
val["local_port"] = local_port;
invoker(200, headerOut, val.toStyledString());
});
}
val["local_port"] = local_port;
invoker(200, headerOut, val.toStyledString());
});
});
api_regist("/index/api/stopSendRtp",[](API_ARGS_MAP){
@@ -1149,7 +1111,7 @@ void installWebApi() {
//截图存在,且未过期,那么返回之
res_old_snap = true;
responseSnap(path, headerIn, invoker);
responseSnap(path, allArgs.getParser().getHeader(), invoker);
//中断遍历
return false;
});
@@ -1171,7 +1133,7 @@ void installWebApi() {
//启动FFmpeg进程开始截图生成临时文件截图成功后替换为正式文件
auto new_snap_tmp = new_snap + ".tmp";
FFmpegSnap::makeSnap(allArgs["url"], new_snap_tmp, allArgs["timeout_sec"], [invoker, headerIn, new_snap, new_snap_tmp](bool success) {
FFmpegSnap::makeSnap(allArgs["url"], new_snap_tmp, allArgs["timeout_sec"], [invoker, allArgs, new_snap, new_snap_tmp](bool success) {
if (!success) {
//生成截图失败,可能残留空文件
File::delete_file(new_snap_tmp.data());
@@ -1180,7 +1142,7 @@ void installWebApi() {
File::delete_file(new_snap.data());
rename(new_snap_tmp.data(), new_snap.data());
}
responseSnap(new_snap, headerIn, invoker);
responseSnap(new_snap, allArgs.getParser().getHeader(), invoker);
});
});
@@ -1217,9 +1179,9 @@ void installWebApi() {
api_regist("/index/api/webrtc",[](API_ARGS_STRING_ASYNC){
CHECK_ARGS("app", "stream");
auto offer_sdp = allArgs.Content();
auto type = allArgs.getUrlArgs()["type"];
MediaInfo info(StrPrinter << "rtc://" << headerIn["Host"] << "/" << allArgs.getUrlArgs()["app"] << "/" << allArgs.getUrlArgs()["stream"] << "?" << allArgs.Params());
auto offer_sdp = allArgs.getArgs();
auto type = allArgs["type"];
MediaInfo info(StrPrinter << "rtc://" << allArgs["Host"] << "/" << allArgs["app"] << "/" << allArgs["stream"] << "?" << allArgs.getParser().Params());
//设置返回类型
headerOut["Content-Type"] = HttpFileManager::getContentType(".json");