diff --git a/lib/http.hpp b/lib/http.hpp index 3d7c03d..3503234 100644 --- a/lib/http.hpp +++ b/lib/http.hpp @@ -15,6 +15,7 @@ class api; class http_request { public: string protocol; + string protocol; string method; string url; map headers; @@ -28,13 +29,16 @@ class http_request { //dolazni http_request(const string _raw); - void putheader(const string _key, const string _value); - void setheaders(const map _headers); + //bool validate(); + void header(const string _key, const string _value); + void header(const map _headers); + private: void parse(); void mold(); }; +static string get_protocol(const string _protocol); class http_response { public: @@ -46,7 +50,7 @@ class http_response { //konstruktor odgovora // odlazni - http_response(const http_response_code _status, const string _body, const string _protocol = "1.1"); + http_response(const http_response_code _status, const string _body = "", const string _protocol = "1.1"); // dolaznih http_response(const string _raw); @@ -54,6 +58,7 @@ class http_response { void header(const string _key, const string _value); void header(const map _headers); + private: void mold(); // za slanje void parse(); // čitaj http }; diff --git a/src/http.cpp b/src/http.cpp index 0bd7e28..a6c8933 100644 --- a/src/http.cpp +++ b/src/http.cpp @@ -3,16 +3,22 @@ http_request::http_request(const http_method _method, const string _url, const string _body, const string _protocol) { method = http_method_to_str(_method); url = _url; - body = _body; - protocol = set_protcol(_protocol); + protocol = get_protocol(_protocol); + if (!_body.empty()) { + body = _body; + this->header("Content-Length", to_string(body.length())); + } mold(); } http_request::http_request(const api *_api, const string _protocol) { method = _api->method; url = _api->url; - body = _api->body; - protocol = set_protcol(_protocol); + protocol = get_protocol(_protocol); + if (!_api->body.empty()) { + body = _api->body; + this->header("Content-Length", to_string(body.length())); + } mold(); } @@ -48,12 +54,12 @@ void http_request::parse() { } -void http_request::putheader(const string _key, const string _value) { +void http_request::header(const string _key, const string _value) { headers[_key] = _value; mold(); } -void http_request::setheaders(const map _headers) { +void http_request::header(const map _headers) { headers = _headers; mold(); } @@ -65,7 +71,7 @@ void http_request::setheaders(const map _headers) { void http_request::mold() { raw = method.empty() ? "GET" : method; - raw += " " + url + " HTTP/1.1\r\n"; + raw += " " + url + " " + protocol + "\r\n"; if (!headers.empty()) { for (auto i : headers) { @@ -78,12 +84,28 @@ void http_request::mold() { http_response::http_response(const http_response_code _status, const string _body, const string _protocol) { status = to_string(_status) + " " + http_response_code_txt(_status); - body = _body; - protocol = set_protcol(_protocol); + if (!_body.empty()) { + body = _body; + // kad merge s header-response branch možeš omogućit ovu liniju + // this->header("Content-Length", to_string(body.length())); + } + protocol = get_protocol(_protocol); mold(); } +static string get_protocol(const string _protocol) { + string protocol; + if (_protocol == "1.0" || _protocol == "1.1" || _protocol == "2.0") { + protocol = "HTTP/" + _protocol; + } + else { + protocol = "HTTP/1.1"; + } + return protocol; +} + + http_response::http_response(const string _raw) { raw = _raw; parse(); diff --git a/test/test.cpp b/test/test.cpp index 40083d7..4cb283b 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -8,23 +8,29 @@ int main() { try { +<<<<<<< HEAD api uf(GET, "delete", {make_pair("id", "4")}, "bay"); http_request myreq(&uf); myreq.putheader("Content-type", "text/plain"); +======= + // api uf(&myApi, GET, "/delete", {make_pair("id", "4")}, "bay"); + // http_request myreq(&uf); + // myreq.header("Content-type", "text/plain"); +>>>>>>> http-status-code - cout << myreq.raw << endl; + // cout << myreq.raw << endl; - http_response myres("HTTP/1.1 200 OK\r\n\r\nnotauth"); - cout << myres.protocol << endl; - cout << myres.status << endl; - // cout << myres.headers << endl; - cout << myres.body << endl; + // cout << myreq.protocol << endl; + // // cout << myreq.status << endl; + // for(auto i : myreq.headers) + // cout << i.first << " " << i.second << endl; + // cout << myreq.body << endl; http_response myres2(OK, "nnotauth", "1.0" ); cout << myres2.protocol << endl; cout << myres2.status << endl; - // cout << myres2.headers << endl; + cout << myres2.headers["Content-Length"] << endl; cout << myres2.body << endl;