1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

refine http stream server

This commit is contained in:
winlin 2014-05-23 14:26:11 +08:00
parent 9eedf1ac40
commit 6fba0db9b5
2 changed files with 104 additions and 86 deletions

View file

@ -164,6 +164,71 @@ int SrsHttpVhost::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
std::string fullpath = get_request_file(req);
if (srs_string_ends_with(fullpath, ".ts")) {
return response_ts_file(skt, req, fullpath);
} else {
return response_regular_file(skt, req, fullpath);
}
return ret;
}
int SrsHttpVhost::response_regular_file(SrsSocket* skt, SrsHttpMessage* req, string fullpath)
{
int ret = ERROR_SUCCESS;
// TODO: FIXME: refine the file stream.
int fd = ::open(fullpath.c_str(), O_RDONLY);
if (fd < 0) {
ret = ERROR_HTTP_OPEN_FILE;
srs_warn("open file %s failed, ret=%d", fullpath.c_str(), ret);
return ret;
}
int64_t length = (int64_t)::lseek(fd, 0, SEEK_END);
::lseek(fd, 0, SEEK_SET);
char* buf = new char[length];
SrsAutoFree(char, buf);
// TODO: FIXME: use st_read.
if (::read(fd, buf, length) < 0) {
::close(fd);
ret = ERROR_HTTP_READ_FILE;
srs_warn("read file %s failed, ret=%d", fullpath.c_str(), ret);
return ret;
}
::close(fd);
std::string str;
str.append(buf, length);
if (srs_string_ends_with(fullpath, ".ts")) {
return res_mpegts(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".m3u8")) {
return res_m3u8(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".xml")) {
return res_xml(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".js")) {
return res_javascript(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".json")) {
return res_json(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".swf")) {
return res_swf(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".css")) {
return res_css(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".ico")) {
return res_ico(skt, req, str);
} else {
return res_text(skt, req, str);
}
return ret;
}
int SrsHttpVhost::response_ts_file(SrsSocket* skt, SrsHttpMessage* req, string fullpath)
{
int ret = ERROR_SUCCESS;
// TODO: FIXME: use more advance cache.
// for ts video large file, use bytes to write it.
int fd = ::open(fullpath.c_str(), O_RDONLY);
@ -214,55 +279,6 @@ int SrsHttpVhost::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
}
::close(fd);
return ret;
} else {
// TODO: FIXME: refine the file stream.
int fd = ::open(fullpath.c_str(), O_RDONLY);
if (fd < 0) {
ret = ERROR_HTTP_OPEN_FILE;
srs_warn("open file %s failed, ret=%d", fullpath.c_str(), ret);
return ret;
}
int64_t length = (int64_t)::lseek(fd, 0, SEEK_END);
::lseek(fd, 0, SEEK_SET);
char* buf = new char[length];
SrsAutoFree(char, buf);
// TODO: FIXME: use st_read.
if (::read(fd, buf, length) < 0) {
::close(fd);
ret = ERROR_HTTP_READ_FILE;
srs_warn("read file %s failed, ret=%d", fullpath.c_str(), ret);
return ret;
}
::close(fd);
std::string str;
str.append(buf, length);
if (srs_string_ends_with(fullpath, ".ts")) {
return res_mpegts(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".m3u8")) {
return res_m3u8(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".xml")) {
return res_xml(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".js")) {
return res_javascript(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".json")) {
return res_json(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".swf")) {
return res_swf(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".css")) {
return res_css(skt, req, str);
} else if (srs_string_ends_with(fullpath, ".ico")) {
return res_ico(skt, req, str);
} else {
return res_text(skt, req, str);
}
}
return ret;
}

View file

@ -70,6 +70,8 @@ protected:
virtual bool is_handler_valid(SrsHttpMessage* req, int& status_code, std::string& reason_phrase);
virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req);
private:
virtual int response_regular_file(SrsSocket* skt, SrsHttpMessage* req, std::string fullpath);
virtual int response_ts_file(SrsSocket* skt, SrsHttpMessage* req, std::string fullpath);
virtual std::string get_request_file(SrsHttpMessage* req);
public:
virtual std::string vhost();