/*
+----------------------------------------------------------------------+
| Swoole |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the Apache license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.apache.org/licenses/LICENSE-2.0.html |
| If you did not receive a copy of the Apache2.0 license and are unable|
| to obtain it through the world-wide-web, please send a note to |
| license@swoole.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Tianfeng Han <mikan.tenny@gmail.com> |
+----------------------------------------------------------------------+
*/
#pragma once
#include "swoole_server.h"
#include "swoole_http.h"
#include "swoole_mime_type.h"
#include <string>
#include <set>
namespace swoole {
namespace http_server {
class StaticHandler {
private:
Server *serv;
std::string request_url;
std::string dir_path;
struct {
off_t offset;
size_t length;
char filename[PATH_MAX];
} task;
size_t l_filename;
struct stat file_stat;
bool last;
public:
int status_code;
StaticHandler(Server *_server, const char *url, size_t url_length) : request_url(url, url_length) {
serv = _server;
task.length = 0;
task.offset = 0;
last = false;
status_code = 200;
l_filename = 0;
dir_path = "";
}
bool hit();
bool is_modified(const std::string &date_if_modified_since);
size_t get_index_page(std::set<std::string> &index_files, char *buffer, size_t size);
bool get_dir_files(std::set<std::string> &index_files);
bool set_filename(std::string &filename);
std::string get_date();
inline time_t get_file_mtime() {
#ifdef __MACH__
return file_stat.st_mtimespec.tv_sec;
#else
return file_stat.st_mtim.tv_sec;
#endif
}
std::string get_date_last_modified();
inline const char *get_filename() {
return task.filename;
}
inline const char *get_mimetype() {
return swoole::mime_type::get(get_filename()).c_str();
}
inline std::string get_filename_std_string() {
return std::string(task.filename, l_filename);
}
inline size_t get_filesize() {
return file_stat.st_size;
}
inline const network::SendfileTask *get_task() {
return (const network::SendfileTask *) &task;
}
inline bool is_dir() {
return S_ISDIR(file_stat.st_mode);
}
};
}; // namespace http
}; // namespace swoole