The Pynt
class defined the interface between the NisseServer
object and code that handles input on a stream. This proivdes an implementation of Pynt
for the HTTP
protocol.
This proves that handling of the incoming HTTP message
and the outgoing HTTP response
. It then provides the virtual void processRequest(Request const& request, Response& response)
to be implemented by the user that will handle the parsing of the HTTP body incoming request and the generating the HTTP body for the outgoing response.
PyntHTTP.h
#ifndef THORSANVIL_NISSE_NISSEHTTP_PYNTHTTP_H
#define THORSANVIL_NISSE_NISSEHTTP_PYNTHTTP_H
/*
* An HTTP implementation of Pynt
* Version 1:
*/
#include "NisseHTTPConfig.h"
#include "NisseServer/Pynt.h"
#include <ThorsSocket/SocketStream.h>
#include <string_view>
namespace TAS = ThorsAnvil::ThorsSocket;
namespace ThorsAnvil::Nisse::NisseHTTP
{
class Request;
class Response;
class PyntHTTP: public Pynt
{
public:
virtual PyntResult handleRequest(TAS::SocketStream& stream);
virtual void processRequest(Request const& request, Response& response) = 0;
};
}
#endif
PyntHTTP.cpp
#include "PyntHTTP.h"
#include "Response.h"
#include "Request.h"
using namespace ThorsAnvil::Nisse::NisseHTTP;
ThorsAnvil::Nisse::PyntResult PyntHTTP::handleRequest(TAS::SocketStream& stream)
{
Request request(stream.getSocket().protocol(), stream);
if (!request.isValidRequest())
{
Response clientError(stream, 400);
clientError.addHeaders(request.failHeader(), 0);
return PyntResult::More;
}
Response response(stream);
this->processRequest(request, response);
return PyntResult::More;
}
The Hello World implementation.
HTTPHelloWorld.h
#ifndef THORSANVIL_NISSE_SIMPLE_SERVER_HTTP_HELLO_WORLD_H
#define THORSANVIL_NISSE_SIMPLE_SERVER_HTTP_HELLO_WORLD_H
#include "NisseHTTP/PyntHTTP.h"
class HTTPHelloWorld: public ThorsAnvil::Nisse::NisseHTTP::PyntHTTP
{
public:
virtual void processRequest(ThorsAnvil::Nisse::NisseHTTP::Request const& request, ThorsAnvil::Nisse::NisseHTTP::Response& response) override;
};
#endif
HTPPHelloWorld.cpp
#include "HTTPHelloWorld.h"
#include "NisseHTTP/Response.h"
#include <string_view>
void HTTPHelloWorld::processRequest(ThorsAnvil::Nisse::NisseHTTP::Request const& request, ThorsAnvil::Nisse::NisseHTTP::Response& response)
{
std::string_view page = R"(
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>Nisse server 1.1</title></head>
<body>Hello world</body>
</html>
)";
ThorsAnvil::Nisse::NisseHTTP::HeaderResponse header;
response.addHeaders(header, page.size()) << page;
}
#pragma once
, since it's widely supported and there are less mistakes to make and it's simpler to read. \$\endgroup\$