parent
de2ba47180
commit
8f6881af92
@ -0,0 +1,29 @@ |
|||||||
|
{ |
||||||
|
"tasks": [ |
||||||
|
{ |
||||||
|
"type": "cppbuild", |
||||||
|
"label": "C/C++: g++ build active file", |
||||||
|
"command": "/usr/bin/g++", |
||||||
|
"args": [ |
||||||
|
"-fdiagnostics-color=always", |
||||||
|
"-g", |
||||||
|
"${fileDirname}/test.cpp", |
||||||
|
"${fileDirname}/../src/*.cpp", |
||||||
|
"-o", |
||||||
|
"${fileDirname}/test.o" |
||||||
|
], |
||||||
|
"options": { |
||||||
|
"cwd": "${fileDirname}" |
||||||
|
}, |
||||||
|
"problemMatcher": [ |
||||||
|
"$gcc" |
||||||
|
], |
||||||
|
"group": { |
||||||
|
"kind": "build", |
||||||
|
"isDefault": true |
||||||
|
}, |
||||||
|
"detail": "Task generated by Debugger." |
||||||
|
} |
||||||
|
], |
||||||
|
"version": "2.0.0" |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
#ifndef _HTTP_ |
||||||
|
#define _HTTP_ |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <string> |
||||||
|
#include <map> |
||||||
|
|
||||||
|
#include "api.hpp" |
||||||
|
|
||||||
|
using namespace std; |
||||||
|
|
||||||
|
|
||||||
|
class defapi; |
||||||
|
class api; |
||||||
|
|
||||||
|
class http_request { |
||||||
|
public: |
||||||
|
string method; |
||||||
|
string url; |
||||||
|
map<string, string> headers; |
||||||
|
string body; |
||||||
|
string raw; |
||||||
|
|
||||||
|
// konstruktori zahtjeva
|
||||||
|
// odlazni
|
||||||
|
http_request(const string _method, const string _url, const string _body = ""); |
||||||
|
http_request(const api *_api); |
||||||
|
//dolazni
|
||||||
|
http_request(const string _raw); |
||||||
|
|
||||||
|
//bool validate();
|
||||||
|
void putheader(const string _key, const string _value); |
||||||
|
void putheaders(const map<string, string> _headers); |
||||||
|
void parse(); |
||||||
|
void mold(); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
class http_response { |
||||||
|
public: |
||||||
|
string status; |
||||||
|
map<string, string> headers; |
||||||
|
string body; |
||||||
|
string raw; |
||||||
|
|
||||||
|
//konstruktor odgovora
|
||||||
|
// odlazni
|
||||||
|
void send(const string _body); |
||||||
|
// dolaznih
|
||||||
|
void get(const string _raw); |
||||||
|
|
||||||
|
//bool validate();
|
||||||
|
void putheader(const string _key, const string _value); |
||||||
|
void putheaders(const map<string, string> _headers); |
||||||
|
|
||||||
|
void mold(); // za slanje
|
||||||
|
void parse(); // čitaj http
|
||||||
|
}; |
||||||
|
|
||||||
|
#endif |
@ -1,94 +1,82 @@ |
|||||||
#include "../lib/api.hpp" |
#include "../lib/api.hpp" |
||||||
|
|
||||||
defapi::defapi(const vector<string> _options, const vector<string> _keys) { |
defapi::defapi(const vector<string> _methods, const vector<string> _paths, const vector<string> _keys) { |
||||||
options = _options; |
methods = _methods; |
||||||
|
paths = _paths; |
||||||
keys = _keys; |
keys = _keys; |
||||||
} |
} |
||||||
|
|
||||||
void defapi::necessary(const string _option, const vector<string> _keys) { |
void defapi::necessary(const string _path, const vector<string> _keys) { |
||||||
val_matrix[_option].insert( val_matrix[_option].end(), _keys.begin(), _keys.end()); |
val_matrix[_path].insert( val_matrix[_path].end(), _keys.begin(), _keys.end()); |
||||||
} |
} |
||||||
|
|
||||||
api::api(defapi *_def, const string _option, const map<string, string> _object) { |
// radi
|
||||||
|
api::api(defapi* _def, const string _method, const string _path, const map<string, string> _params, const string _body) { |
||||||
def = _def; |
def = _def; |
||||||
object = _object; |
method = _method; |
||||||
option = _option; |
path = _path;
|
||||||
|
url = path; |
||||||
|
|
||||||
if (!validate()) { |
if (!_params.empty()) { |
||||||
cout << "Validate API error" << endl; |
url += '?'; |
||||||
|
for (auto i : _params) { |
||||||
|
url += i.first + '=' + i.second + '&';
|
||||||
} |
} |
||||||
format(); |
url.pop_back(); |
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
api::api(defapi *_def, const string _body) { |
|
||||||
def = _def; |
|
||||||
body = _body; |
body = _body; |
||||||
|
|
||||||
parse(); |
|
||||||
if (!validate()) { |
if (!validate()) { |
||||||
cout << "Validate API error" << endl; |
cout << "Nije ispravan API" << endl; |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
bool api::validate() { |
// radi
|
||||||
bool isValidate = true; |
api::api(defapi* _def, const http_request _req) { |
||||||
|
def = _def; |
||||||
for (uint i=0; i<def->val_matrix[option].size(); i++) { |
method = _req.method; |
||||||
def->val_matrix[option][i]; |
//path = _path;
|
||||||
if (object[def->val_matrix[option][i]].empty()) { |
url = _req.url; |
||||||
isValidate = false; |
|
||||||
break;
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return isValidate; |
|
||||||
} |
|
||||||
|
|
||||||
void api::parse() { |
|
||||||
|
|
||||||
// Extract the query string from the API request
|
if ( (size_t)url.find("?") < (size_t)url.length() ) { |
||||||
size_t queryStart = body.find('?'); |
path = url.substr(0, url.find("?")); |
||||||
size_t protocolEnd = body.find("HTTP/"); |
|
||||||
if (queryStart == string::npos || (protocolEnd != string::npos && queryStart > protocolEnd)) { |
|
||||||
// cout << "No object found in the API request." << endl;
|
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
size_t queryStringStart = (queryStart != string::npos) ? queryStart + 1 : 0; |
string str_params = url.substr(url.find("?")+1, url.length()-url.find("?")-1); |
||||||
string queryString = body.substr(queryStringStart, protocolEnd - queryStringStart); |
while (!str_params.empty()) { |
||||||
|
string key, value; |
||||||
// Parse the query string and extract key-value pairs
|
key = str_params.substr(0, str_params.find('=')); |
||||||
istringstream iss(queryString); |
str_params.erase(0, key.length()+1); |
||||||
string parameter; |
value = str_params.substr(0, str_params.find('&')); |
||||||
while (getline(iss, parameter, '&')) { |
str_params.erase(0, value.length()+1); |
||||||
size_t equalSignPos = parameter.find('='); |
params.insert(make_pair(key, value)); |
||||||
if (equalSignPos != string::npos) { |
|
||||||
string key = parameter.substr(0, equalSignPos); |
|
||||||
string value = parameter.substr(equalSignPos + 1); |
|
||||||
object[key] = value; |
|
||||||
} |
} |
||||||
} |
} |
||||||
|
else { |
||||||
|
path = url; |
||||||
} |
} |
||||||
|
|
||||||
void api::format() { |
body = _req.body; |
||||||
|
|
||||||
body = "GET /"; |
// if (!validate()) {
|
||||||
|
// cout << "Nije ispravan API" << endl;
|
||||||
|
// }
|
||||||
|
|
||||||
if (!option.empty()) { |
|
||||||
body += option + '/'; |
|
||||||
} |
} |
||||||
|
|
||||||
body += '?'; |
|
||||||
|
|
||||||
for (uint i=0; i<def->keys.size(); i++) { |
bool api::validate() { |
||||||
if (!object[def->keys[i]].empty()) { |
bool isValidate = true; |
||||||
body += def->keys[i] + "=" + object[def->keys[i]] + "&"; |
|
||||||
|
// api validacija ključeva
|
||||||
|
for (uint i=0; i<def->val_matrix[path].size(); i++) { |
||||||
|
def->val_matrix[path][i]; |
||||||
|
if (params[def->val_matrix[path][i]].empty()) { |
||||||
|
isValidate = false; |
||||||
|
break;
|
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
body.pop_back(); |
return isValidate; |
||||||
body += " HTTP/1.1"; |
|
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
|
@ -0,0 +1,132 @@ |
|||||||
|
#include "../lib/http.hpp" |
||||||
|
|
||||||
|
// radi
|
||||||
|
|
||||||
|
http_request::http_request(const string _method, const string _url, const string _body) { |
||||||
|
method = _method; |
||||||
|
url = _url; |
||||||
|
body = _body; |
||||||
|
mold(); |
||||||
|
} |
||||||
|
|
||||||
|
// radi
|
||||||
|
http_request::http_request(const api *_api) { |
||||||
|
method = _api->method; |
||||||
|
url = _api->url; |
||||||
|
body = _api->body; |
||||||
|
mold(); |
||||||
|
} |
||||||
|
|
||||||
|
// radi
|
||||||
|
http_request::http_request(const string _raw) { |
||||||
|
raw = _raw; |
||||||
|
parse(); |
||||||
|
} |
||||||
|
|
||||||
|
// radi
|
||||||
|
void http_request::parse() { |
||||||
|
method = raw.substr(0, raw.find(" ")); |
||||||
|
url = raw.substr(raw.find("/"), raw.find("HTTP/")-raw.find("/")); |
||||||
|
|
||||||
|
string _headers = raw.substr(raw.find("\r\n")+2, raw.find("\r\n\r\n")-raw.find("\r\n")); |
||||||
|
while (!_headers.empty()) { |
||||||
|
string key, value; |
||||||
|
key = _headers.substr(0, _headers.find(": ")); |
||||||
|
_headers.erase(0, key.length()+2); |
||||||
|
value = _headers.substr(0, _headers.find("\r\n")); |
||||||
|
_headers.erase(0, value.length()+2); |
||||||
|
headers.insert(make_pair(key, value)); |
||||||
|
} |
||||||
|
|
||||||
|
// ne radi za specijalan slučaj kada nema zaglavlja
|
||||||
|
if ((size_t)raw.find("\r\n\r\n") == (size_t)raw.find("\r\n")) |
||||||
|
body = raw.substr(raw.find("\r\n\r\n")+4, raw.length()-raw.find("\r\n\r\n")); |
||||||
|
|
||||||
|
else if ((size_t)raw.find("\r\n\r\n") < raw.length()) |
||||||
|
body = raw.substr(raw.find("\r\n\r\n")+4, raw.find("\r\n")-raw.find("\r\n\r\n")); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
void http_request::putheader(const string _key, const string _value) { |
||||||
|
headers[_key] = _value; |
||||||
|
mold(); |
||||||
|
} |
||||||
|
|
||||||
|
void http_request::putheaders(const map<string, string> _headers) { |
||||||
|
headers = _headers; |
||||||
|
mold(); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* http zahtjev formiranje raw
|
||||||
|
*/ |
||||||
|
// radi
|
||||||
|
|
||||||
|
void http_request::mold() { |
||||||
|
|
||||||
|
raw = method.empty() ? "GET" : method; |
||||||
|
raw += " " + url + " HTTP/1.1\r\n"; |
||||||
|
|
||||||
|
if (!headers.empty()) { |
||||||
|
for (auto i : headers) { |
||||||
|
raw += i.first + ": " + i.second + "\r\n";
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
raw += "\r\n" + body; |
||||||
|
} |
||||||
|
|
||||||
|
void http_response::send(const string _body) { |
||||||
|
body = _body; |
||||||
|
mold();
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void http_response::get(const string _raw) { |
||||||
|
raw = _raw; |
||||||
|
parse(); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* Nakon
|
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
void http_response::mold() { |
||||||
|
raw = "HTTP/1.1 200 OK\r\n"; |
||||||
|
if (!headers.empty()) { |
||||||
|
raw += '?'; |
||||||
|
for (auto i : headers) { |
||||||
|
raw += i.first + ": " + i.second + "\r\n";
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
raw += "\r\n" + body; |
||||||
|
} |
||||||
|
|
||||||
|
// radi
|
||||||
|
|
||||||
|
void http_response::parse() { |
||||||
|
|
||||||
|
string protocol = raw.substr(0, raw.find(" ")); |
||||||
|
status = raw.substr(raw.find(" ")+1, raw.find(" ",raw.find(" ")+1)-raw.find(" ")-1); |
||||||
|
|
||||||
|
if ((size_t)raw.find("\r\n") < raw.length()) { |
||||||
|
string _headers = raw.substr(raw.find("\r\n")+2, raw.find("\r\n\r\n")-raw.find("\r\n")); |
||||||
|
while (!_headers.empty()) { |
||||||
|
string key, value; |
||||||
|
key = _headers.substr(0, _headers.find(": ")); |
||||||
|
_headers.erase(0, key.length()+2); |
||||||
|
value = _headers.substr(0, _headers.find("\r\n")); |
||||||
|
_headers.erase(0, value.length()+2); |
||||||
|
headers.insert(make_pair(key, value)); |
||||||
|
} |
||||||
|
} |
||||||
|
// ne radi za specijalan slučaj kada nema zaglavlja
|
||||||
|
if ((size_t)raw.find("\r\n\r\n") == (size_t)raw.find("\r\n")) |
||||||
|
body = raw.substr(raw.find("\r\n\r\n")+4, raw.length()-raw.find("\r\n\r\n")); |
||||||
|
|
||||||
|
else if ((size_t)raw.find("\r\n\r\n") < raw.length()) |
||||||
|
body = raw.substr(raw.find("\r\n\r\n")+4, raw.find("\r\n")-raw.find("\r\n\r\n")); |
||||||
|
|
||||||
|
} |
Binary file not shown.
Loading…
Reference in new issue