Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions CGI/Cookie.php

This file was deleted.

Binary file removed CGI/a.out
Binary file not shown.
96 changes: 47 additions & 49 deletions CGI/cgi.cpp
Original file line number Diff line number Diff line change
@@ -1,66 +1,39 @@
#include "cgi.hpp"
std::map<std::string, std::string>get_env(char *file, request req)
{

std::map<std::string, std::string> env;

env["SERVER_SOFTWARE"] = "MyServer/1.0";
env["SERVER_NAME"] = "localhost";
env["GATEWAY_INTERFACE"] = "CGI/1.1";
env["SERVER_PROTOCOL"] = "HTTP/1.1";
env["SERVER_PORT"] = "80";
env["REQUEST_METHOD"] = req.get_method();
env["SCRIPT_NAME"] = "/cgi-bin/mycgi";
env["CONTENT_TYPE"] = req.get_header("Content-Type");
env["CONTENT_LENGTH"] = std::to_string(req.get_body().size());
env["QUERY_STRING"] = req.get_query();
env["REMOTE_ADDR"] = "127.0.0.1";
env["REMOTE_HOST"] = "localhost";
env["REDIRECT_STATUS"] = "200";
env["HTTP_COOKIE"] = req.get_header("Cookie");
env["SCRIPT_FILENAME"] = file;


return env;
}

void put_cookie(std::string output, Respond &res)
{
std::string token;
std::size_t pos = output.find("Set-Cookie:");
if (pos != std::string::npos)
{
pos += 12;
std::size_t end = output.find(";", pos);
if (end != std::string::npos) {
token = output.substr(pos);
} else {
token = output.substr(pos);
}
res.set_header("Set-Cookie", token);
}
}

void set_headers_cgi(std::string output, Respond &res) {
void set_headers_cgi(std::string output, Respond &res)
{
std::stringstream ss(output);
std::string line;
std::string body;
bool headers_finished = false;

put_cookie(output, res);
body =+ "<!DOCTYPE html>";
body =+ "<!DOCTYPE html>\n";
while (std::getline(ss, line)) {
if (line == "\r") {
headers_finished = true;
continue;
}
if (!headers_finished) {
std::size_t pos = line.find(": ");
if (pos != std::string::npos) {
if (pos != std::string::npos)
{
std::string key = line.substr(0, pos);
std::string value = line.substr(pos + 2);
if(key != "Set-Cookie")
res.set_header(key, value);
res.set_header(key, value);
}
}
else
Expand All @@ -69,6 +42,14 @@ void set_headers_cgi(std::string output, Respond &res) {
res.set_response_body(body);
}

void free_all(char *file, char *path, char **env, int size)
{
for (int i = 0; i < size; i++)
free(env[i]);
free (env);
free (file);
free (path);
}

std::string run_cgi(request &r, Respond &res)
{
Expand All @@ -85,43 +66,54 @@ std::string run_cgi(request &r, Respond &res)

std::map<std::string, std::string> env = get_env(file, r);
std::string method = env["REQUEST_METHOD"];
std::string content_type = env["CONTENT_TYPE"];
std::string content_length_str = env["CONTENT_LENGTH"];
std::string query_string = env["QUERY_STRING"];

char **envp = (char **)malloc(sizeof(char *) * (env.size() + 1));
if(!envp)
{
res.set_status_code(500);
res.set_response_body(res.get_response_status(res.get_status_code()));
free_all(file, path,envp, env.size());
return res.get_response_status(res.get_status_code());
}
int i = 0;
for (std::map<std::string , std::string>::iterator it = env.begin(); it != env.end(); it++, i++)
for (std::map<std::string , std::string>::iterator it = env.begin(); it != env.end(); it++)
{
std::string e = it->first + "=" + it->second;
envp[i] = strdup(e.c_str());
envp[i++] = strdup(e.c_str());
}
envp[i] = NULL;
int pid = fork();
if (pid == -1)
{
res.set_status_code(500);
res.set_status_message(res.get_response_status(res.get_status_code()));
res.set_response_body(res.get_response_status(res.get_status_code()));
free_all(file, path,envp, env.size());
return NULL;
}
else if (pid == 0)
{
std::cout << r.get_body() << "\n";
if (method == "POST")
{

if (dup2(fdtemp1, STDIN_FILENO) == -1)
{
std::cerr << "Error: failed to redirect stdin\n";
exit(1);
res.set_status_code(500);
res.set_response_body(res.get_response_status(res.get_status_code()));
free_all(file, path,envp, env.size());
return res.get_response_status(res.get_status_code());
}
std::fprintf(temp1, "%s", r.get_body().c_str());
write(fdtemp1, r.get_body().c_str(), r.get_body().size());
std::rewind(temp1);
}
if (dup2(fdtemp, STDOUT_FILENO) == -1)
{
std::cerr << "Error: failed to redirect stdout\n";
exit(1);
res.set_status_code(500);
res.set_response_body(res.get_response_status(res.get_status_code()));
free_all(file, path,envp, env.size());
return res.get_response_status(res.get_status_code());
}
alarm(2);
alarm(1);
execve(cmd[0], cmd, envp);
exit(1);
}
Expand All @@ -131,7 +123,9 @@ std::string run_cgi(request &r, Respond &res)
if (WIFSIGNALED(status) || status != 0)
{
res.set_status_code(500);
res.set_status_message(res.get_response_status(res.get_status_code()));
res.set_response_body(res.get_response_status(res.get_status_code()));
free_all(file, path,envp, env.size());
return res.get_response_status(res.get_status_code());
}
char buf[1];
std::string content;
Expand All @@ -140,12 +134,16 @@ std::string run_cgi(request &r, Respond &res)
while ((byt = read(fdtemp, buf, 1)) > 0){
content.append(buf, 1);
}
//std::cout << content <<std::endl;
//puts("heeeeere");
if (byt == -1)
std::cerr << "Error: failed to read output\n";
{
res.set_status_code(500);
res.set_response_body(res.get_response_status(res.get_status_code()));
free_all(file, path,envp, env.size());
return res.get_response_status(res.get_status_code());
}
close(fdtemp);
close(fdtemp1);
free_all(file, path,envp, env.size());
set_headers_cgi(content, res);
return (content);
}
1 change: 1 addition & 0 deletions CGI/cgi.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "../respond/respond.hpp"

class Respond;
class request;

std::string run_cgi(request &r, Respond &res);

Expand Down
Binary file removed CGI/cgi_tester
Binary file not shown.
76 changes: 0 additions & 76 deletions CGI/server.cpp

This file was deleted.

13 changes: 0 additions & 13 deletions CGI/set_Session.php

This file was deleted.

Loading