int WebSession::Recv() { m_content = NULL; m_contentLength = 0; int r = socket_select_read(m_sock, SERVER_TIMEOUT); if(r <= 0) return 0==r ? ERROR_RECV_TIMEOUT : r; r = http_server_recv(m_http); if(r < 0) return r; void* url = url_parse(http_server_get_path(m_http)); for(int i=0; i<url_getparam_count(url); i++) { const char *name, *value; if(0 != url_getparam(url, i, &name, &value)) continue; m_params.insert(std::make_pair(std::string(name), std::string(value))); } m_path.assign(url_getpath(url)); url_free(url); http_server_get_content(m_http, &m_content, &m_contentLength); if(m_contentLength > 0 && m_contentLength < 2*1024) { printf("%s\n", (const char*)m_content); } return 0; }
static int hls_server_onhttp(void* http, void* session, const char* method, const char* path) { // decode request uri void* url = url_parse(path); std::string s = url_getpath(url); url_free(url); path = s.c_str(); if (0 == strncmp(path, "/live/", 6)) { std::vector<std::string> paths; Split(path + 6, "/", paths); if (strendswith(path, ".m3u8") && 1 == paths.size()) { std::string app = paths[0].substr(0, paths[0].length() - 5); if (s_playlists.find(app) == s_playlists.end()) { hls_playlist_t* playlist = new hls_playlist_t(); playlist->file = app; playlist->m3u8 = hls_m3u8_create(HLS_LIVE_NUM); playlist->hls = hls_media_create(HLS_DURATION * 1000, hls_handler, playlist); playlist->i = 0; s_playlists[app] = playlist; thread_create(&playlist->t, hls_server_worker, playlist); } return hls_server_m3u8(session, app); } else if (strendswith(path, ".ts") && 2 == paths.size()) { if (s_playlists.find(paths[0]) != s_playlists.end()) { return hls_server_ts(session, paths[0], paths[1]); } } } else if (0 == strncmp(path, "/vod/", 5)) { if (path_testfile(path+5)) { return hls_server_reply_file(session, path + 5); } } return hls_server_reply(session, 404, ""); }