Commit 116ea24e authored by knowledge4igor's avatar knowledge4igor

Fix cookie sending and getting on client side

parent 3beb79cc
......@@ -89,15 +89,22 @@ namespace {
bool writeCookies(const Http::CookieJar& cookies, DynamicStreamBuf& buf) {
using Http::crlf;
std::ostream os(&buf);
std::vector<std::pair<std::string, std::string>> cookiesInfo;
for (const auto& cookie: cookies) {
OUT(os << "Cookie: ");
OUT(cookie.write(os));
OUT(os << crlf);
cookiesInfo.emplace_back(cookie.name, cookie.value);
}
return true;
std::ostream os(&buf);
OUT(os << "Cookie: ");
for (size_t i = 0; i < cookiesInfo.size(); ++i) {
if (i > 0) {
OUT(os << "; ");
}
OUT(os << cookiesInfo[i].first << "=" << cookiesInfo[i].second);
}
OUT(os << crlf);
return true;
}
bool writeRequest(const Http::Request& request, DynamicStreamBuf &buf) {
......
......@@ -297,7 +297,11 @@ namespace Private {
message->cookies_.removeAllCookies(); // removing existing cookies before re-adding them.
message->cookies_.addFromRaw(cursor.offset(start), cursor.diff(start));
}
else if (name == "Set-Cookie") {
auto c = Cookie::fromRaw(cursor.offset(start), cursor.diff(start));
message->cookies_.add(c);
std::cout << "[HeadersStep::apply] Set-Cookie: " << c.name << " " << c.value << "\n";
}
else if (Header::Registry::isRegistered(name)) {
std::shared_ptr<Header::Header> header = Header::Registry::makeHeader(name);
header->parseRaw(cursor.offset(start), cursor.diff(start));
......@@ -673,6 +677,7 @@ ResponseWriter::putOnWire(const char* data, size_t len)
#undef OUT
auto fd = peer()->fd();
std::cout << "ResponseWriter -> buffer sent to: " << buffer.data << "\n";
return transport_->asyncWrite(fd, buffer);
} catch (const std::runtime_error& e) {
......
......@@ -15,6 +15,7 @@ pistache_test(typeid_test)
pistache_test(router_test)
pistache_test(cookie_test)
pistache_test(cookie_test_2)
pistache_test(cookie_test_3)
pistache_test(view_test)
pistache_test(http_parsing_test)
pistache_test(http_uri_test)
......
#include <pistache/client.h>
#include <pistache/cookie.h>
#include <pistache/endpoint.h>
#include <pistache/http.h>
#include "gtest/gtest.h"
#include <chrono>
#include <unordered_map>
using namespace Pistache;
struct CookieHandler : public Http::Handler {
HTTP_PROTOTYPE(CookieHandler)
void onRequest(const Http::Request& request, Http::ResponseWriter response) override {
// Synthetic behaviour, just for testing purposes
for(auto&& cookie: request.cookies()) {
response.cookies().add(cookie);
}
response.send(Http::Code::Ok, "Ok");
}
};
TEST(http_client_test, one_client_with_one_request_with_cookies) {
const std::string address = "localhost:9085";
Http::Endpoint server(address);
auto flags = Tcp::Options::InstallSignalHandler | Tcp::Options::ReuseAddr;
auto server_opts = Http::Endpoint::options().flags(flags);
server.init(server_opts);
server.setHandler(Http::make_handler<CookieHandler>());
server.serveThreaded();
Http::Client client;
client.init();
std::vector<Async::Promise<Http::Response>> responses;
const std::string name1 = "FOO";
const std::string value1 = "bar";
auto cookie1 = Http::Cookie(name1, value1);
const std::string name2 = "FIZZ";
const std::string value2 = "Buzz";
auto cookie2 = Http::Cookie(name2, value2);
const std::string name3 = "Key";
const std::string value3 = "value";
auto cookie3 = Http::Cookie(name3, value3);
auto rb = client.get(address).cookie(cookie1).cookie(cookie2).cookie(cookie3);
auto response = rb.send();
std::unordered_map<std::string, std::string> cookiesStorages;
response.then([&](Http::Response rsp) {
for (auto&& cookie: rsp.cookies()) {
cookiesStorages[cookie.name] = cookie.value;
std::cout << "get: " << cookie.name << "\n";
}
},
Async::IgnoreException);
responses.push_back(std::move(response));
auto sync = Async::whenAll(responses.begin(), responses.end());
Async::Barrier<std::vector<Http::Response>> barrier(sync);
barrier.wait_for(std::chrono::seconds(5));
server.shutdown();
client.shutdown();
ASSERT_NE(cookiesStorages.find(name1), cookiesStorages.end());
ASSERT_EQ(cookiesStorages[name1], value1);
ASSERT_NE(cookiesStorages.find(name2), cookiesStorages.end());
ASSERT_EQ(cookiesStorages[name2], value2);
ASSERT_NE(cookiesStorages.find(name3), cookiesStorages.end());
ASSERT_EQ(cookiesStorages[name3], value3);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment