void request_handler::produre_reply(const request& req, reply& rep) { string request_path; // request_path = req.url; //Request path must be absolute and not contain ".." if(request_path.empty() || request_path[0]!='/' || request_path.find("..")!=string::npos) { rep.set_status(reply::bad_request); return; } if(request_path[request_path.size() -1] == '/') { request_path += "index.html"; } std::size_t last_slash_pos = request_path.find_last_of("/"); std::size_t last_dot_pos = request_path.find_last_of("."); string extension; if( last_dot_pos!=string::npos && last_dot_pos> last_slash_pos) { extension = request_path.substr(last_dot_pos+1); } std::string full_path = this->m_docroot + request_path; ifstream in(full_path.c_str(), std::ios::in | std::ios::binary); if( !in) { rep.set_status(reply::not_found); return; } rep.set_status(reply::ok); string content; char buf[512]; while(in.read(buf, sizeof(buf)).gcount() > 0) content.append(buf, in.gcount()); rep.set_content(content); vector<header> headers; headers.resize(2); headers[0].name = "Content-Length"; char len[8] = {0}; sprintf(len, "%d", static_cast<int>(rep.get_content().size()) ); headers[0].value = len; headers[1].name = "Content-Type"; headers[1].value = maper.extension_to_type(extension); //Check the extension! rep.set_headers(headers); }