You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

275 lines
10 KiB

#include "webserv.hpp"
Route::Route(string location, JSONNode *datas) : _location(location) {
JSONObject object = datas->obj();
JSONNode *tmp;
if ((tmp = object["root"]))
_root = tmp->str();
if ((tmp = object["return"]))
_ret = tmp->str();
if ((tmp = object["autoindex"]))
_autoindex = tmp->boo();
if ((tmp = object["indexs"])) {
JSONList indexs = tmp->lst();
for (JSONList::iterator it = indexs.begin(); it < indexs.end(); it++) {
_indexs.push_back((*it)->str());
}
}
}
Route::~Route(void) {}
string Route::getLocation(void) { return _location; }
string Route::getRoot(void) { return _root; }
string Route::getReturn(void) { return _ret; }
std::vector<string> Route::getIndexsLst(void) { return _indexs; }
string Route::getIndex(string path) {
std::stringstream content;
std::stringstream ret;
DIR *dir;
struct dirent *entry;
struct stat info;
std::vector<string> indexs = getIndexsLst();
std::vector<string>::iterator it;
if ((dir = opendir(path.c_str())) == NULL)
return "";
else {
content << path << " files :\n";
while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] == '.')
continue;
for (it = indexs.begin(); it < indexs.end(); it++) {
if (entry->d_name == *it)
return (read_file(path + "/" + *it));
}
content << "- " << entry->d_name << "\n";
if (stat(path.c_str(), &info) != 0)
std::cerr << "stat() error on " << path << ": "
<< strerror(errno) << "\n";
}
closedir(dir);
}
ret << "Content-type: text/html \n";
ret << "Content-length: "<< content.str().length();
ret << "\n\n" << content;
return ret.str();
}
string Route::getMime(string path)
{
string extension;
size_t position = path.find('.');
if (position != string::npos)
extension = path.substr(position + 1);
else
extension = "html";
if (path.length() == 1)
{
path = "/index.html";
return("text/html\r\n\r\n");
}
else if (!(extension.compare("html")) || !(extension.compare("htm")) || !(extension.compare("shtml")))
return("text/html\r\n\r\n");
else if (!(extension.compare("css")))
return("text/css\r\n\r\n");
else if (!(extension.compare("xml")))
return("text/xml\r\n\r\n");
else if (!(extension.compare("gif")))
return("image/gif\r\n\r\n");
else if (!(extension.compare("jpeg")) || !(extension.compare("jpg")))
return("image/jpeg\r\n\r\n");
else if (!(extension.compare("js")))
return("application/javascript\r\n\r\n");
else if (!(extension.compare("atom")))
return("application/atom+xml\r\n\r\n");
else if (!(extension.compare("rss")))
return("application/rss+xml\r\n\r\n");
else if (!(extension.compare("mml")))
return("text/mathml\r\n\r\n");
else if (!(extension.compare("txt")))
return("text/plain\r\n\r\n");
else if (!(extension.compare("jad")))
return("text/vnd.sun.j2me.app-descriptor\r\n\r\n");
else if (!(extension.compare("wml")))
return("text/vnd.wap.wml\r\n\r\n");
else if (!(extension.compare("htc")))
return("text/x-component\r\n\r\n");
else if (!(extension.compare("avif")))
return("image/avif\r\n\r\n");
else if (!(extension.compare("png")))
return("image/png\r\n\r\n");
else if (!(extension.compare("svg")) || !(extension.compare("svgz")))
return("image/svg+xml\r\n\r\n");
else if (!(extension.compare("tif")) || !(extension.compare("tiff")))
return("image/tiff\r\n\r\n");
else if (!(extension.compare("wbmp")))
return("image/vnd.wap.wbmp\r\n\r\n");
else if (!(extension.compare("webp")))
return("image/webp\r\n\r\n");
else if (!(extension.compare("ico")))
return("image/x-icon\r\n\r\n");
else if (!(extension.compare("jng")))
return("image/x-jng\r\n\r\n");
else if (!(extension.compare("bmp")))
return("image/x-ms-bmp\r\n\r\n");
else if (!(extension.compare("woff")))
return("font/woff\r\n\r\n");
else if (!(extension.compare("woff2")))
return("font/woff2\r\n\r\n");
else if (!(extension.compare("jar")) || !(extension.compare("war")) || !(extension.compare("ear")))
return("application/java-archive\r\n\r\n");
else if (!(extension.compare("json")))
return("application/json\r\n\r\n");
else if (!(extension.compare("hqx")))
return("application/mac-binhex40\r\n\r\n");
else if (!(extension.compare("doc")))
return("application/msword\r\n\r\n");
else if (!(extension.compare("pdf")))
return("application/pdf\r\n\r\n");
else if (!(extension.compare("ps")) || !(extension.compare("eps")) || !(extension.compare("ai")))
return("application/postscript\r\n\r\n");
else if (!(extension.compare("rtf")))
return("application/rtf\r\n\r\n");
else if (!(extension.compare("m3u8")))
return("application/vnd.apple.mpegurl\r\n\r\n");
else if (!(extension.compare("xls")) || !(extension.compare("xlt")) || !(extension.compare("xlm")) || !(extension.compare("xld")) || !(extension.compare("xla")) || !(extension.compare("xlc")) || !(extension.compare("xlw")) || !(extension.compare("xll")))
return("application/vnd.ms-excel\r\n\r\n");
else if (!(extension.compare("ppt")) || !(extension.compare("pps")))
return("application/vnd.ms-powerpoint\r\n\r\n");
else if (!(extension.compare("wmlc")))
return("application/vnd.wap.wmlc\r\n\r\n");
else if (!(extension.compare("kml")))
return("application/vnd.google-earth.kml+xml\r\n\r\n");
else if (!(extension.compare("kmz")))
return("application/vnd.google-earth.kmz\r\n\r\n");
else if (!(extension.compare("7z")))
return("application/x-7z-compressed\r\n\r\n");
else if (!(extension.compare("cco")))
return("application/x-cocoa\r\n\r\n");
else if (!(extension.compare("jardiff")))
return("application/x-java-archive-diff\r\n\r\n");
else if (!(extension.compare("jnlp")))
return("application/x-java-jnlp-file\r\n\r\n");
else if (!(extension.compare("run")))
return("application/x-makeself\r\n\r\n");
else if (!(extension.compare("pl")) || !(extension.compare("pm")))
return("application/x-perl\r\n\r\n");
else if (!(extension.compare("pdb")) || !(extension.compare("pqr")) || !(extension.compare("prc")) || !(extension.compare("pde")))
return("application/x-pilot\r\n\r\n");
else if (!(extension.compare("rar")))
return("application/x-rar-compressed\r\n\r\n");
else if (!(extension.compare("rpm")))
return("application/x-redhat-package-manager\r\n\r\n");
else if (!(extension.compare("sea")))
return("application/x-sea\r\n\r\n");
else if (!(extension.compare("swf")))
return("application/x-shockwave-flash\r\n\r\n");
else if (!(extension.compare("sit")))
return("application/x-stuffit\r\n\r\n");
else if (!(extension.compare("tcl")) || !(extension.compare("tk")))
return("application/x-tcl\r\n\r\n");
else if (!(extension.compare("der")) || !(extension.compare("pem")) || !(extension.compare("crt")))
return("application/x-x509-ca-cert\r\n\r\n");
else if (!(extension.compare("xpi")))
return("application/x-xpinstall\r\n\r\n");
else if (!(extension.compare("xhtml")) || !(extension.compare("xht")))
return("application/xhtml+xml\r\n\r\n");
else if (!(extension.compare("zip")))
return("application/zip\r\n\r\n");
else if (!(extension.compare("bin")) || !(extension.compare("exe")) || !(extension.compare("dll")))
return("application/octet-stream\r\n\r\n");
else if (!(extension.compare("deb")))
return("application/octet-stream\r\n\r\n");
else if (!(extension.compare("dmg")))
return("application/octet-stream\r\n\r\n");
else if (!(extension.compare("eot")))
return("application/octet-stream\r\n\r\n");
else if (!(extension.compare("img")) || !(extension.compare("iso")))
return("application/octet-stream\r\n\r\n");
else if (!(extension.compare("msi")) || !(extension.compare("msp")) || !(extension.compare("msm")))
return("application/octet-stream\r\n\r\n");
else if (!(extension.compare("mid")) || !(extension.compare("midi")) || !(extension.compare("kar")))
return("audio/midi\r\n\r\n");
else if (!(extension.compare("mp3")))
return("audio/mpeg\r\n\r\n");
else if (!(extension.compare("ogg")))
return("audio/ogg\r\n\r\n");
else if (!(extension.compare("m4a")))
return("audio/x-m4a\r\n\r\n");
else if (!(extension.compare("ra")))
return("audio/x-realaudio\r\n\r\n");
else if (!(extension.compare("3gpp")) || !(extension.compare("3gp")))
return("video/3gpp\r\n\r\n");
else if (!(extension.compare("ts")))
return("video/mp2t\r\n\r\n");
else if (!(extension.compare("mp4")))
return("video/mp4\r\n\r\n");
else if (!(extension.compare("mpeg")) || !(extension.compare("mpg")))
return("video/mpeg\r\n\r\n");
else if (!(extension.compare("mov")))
return("video/quicktime\r\n\r\n");
else if (!(extension.compare("webm")))
return("video/webm\r\n\r\n");
else if (!(extension.compare("flv")))
return("video/x-flv\r\n\r\n");
else if (!(extension.compare("m4v")))
return("video/x-m4v\r\n\r\n");
else if (!(extension.compare("mng")))
return("video/x-mng\r\n\r\n");
else if (!(extension.compare("asx")) || !(extension.compare("asf")))
return("video/x-ms-asf\r\n\r\n");
else if (!(extension.compare("wmv")))
return("video/x-ms-wmv\r\n\r\n");
else if (!(extension.compare("avi")))
return("video/x-msvideo\r\n\r\n");
else
return("text/plain\r\n\r\n");
}
string Route::read_file(string path) {
string str;
string content;
std::stringstream ret;
struct stat info;
if (stat(path.c_str(), &info) != 0) {
std::cerr << "stat() error on " << path << ": "
<< strerror(errno) << "\n";
return "";
}
std::ifstream file(path.c_str());
while (file) {
std::getline(file, str);
content += str + "\n";
}
ret << "Content-type: " << this->getMime(path) << "\n";
ret << "Content-length: " << content.length();
ret << "\n\n" << content;
return (ret.str());
}
string Route::correctUri(string uri) {
std::stringstream ret;
std::vector<string>::iterator it;
std::vector<string>::iterator it2;
cout << "Correcting request: " << uri << " with root: " << _root << "\n";
ret << _root;
std::vector<string> loc_split = split(_location, '/');
std::vector<string> uri_split = split(uri, '/');
it2 = uri_split.begin();
for (it = loc_split.begin(); it < loc_split.end(); it++) {
while (*it2 == "")
it2++;
while (*it == "")
it++;
it2++;
}
while (it2 < uri_split.end()) {
ret << "/" << *(it2++);
}
cout << "resutlt: " << ret.str() << "\n";
return ret.str();
}