#ifndef ICESPIDER_IHTTPREQUEST_H #define ICESPIDER_IHTTPREQUEST_H #include #include #include #include #include #include #include namespace IceSpider { class Core; class IRouteHandler; typedef std::vector PathElements; typedef IceUtil::Optional OptionalString; typedef std::pair ContentTypeSerializer; class DLL_PUBLIC IHttpRequest { public: IHttpRequest(const Core *); Ice::Context getContext() const; virtual const PathElements & getRequestPath() const = 0; virtual HttpMethod getRequestMethod() const = 0; const std::string & getURLParam(unsigned int) const; virtual OptionalString getQueryStringParam(const std::string &) const = 0; virtual OptionalString getHeaderParam(const std::string &) const = 0; virtual Slicer::DeserializerPtr getDeserializer() const; virtual ContentTypeSerializer getSerializer(const IRouteHandler *) const; virtual std::istream & getInputStream() const = 0; virtual std::ostream & getOutputStream() const = 0; template T getURLParam(unsigned int) const; template IceUtil::Optional getBodyParam(const std::string &) const { return Slicer::DeserializeAnyWith(getDeserializer()); } template IceUtil::Optional getQueryStringParam(const std::string & key) const; template IceUtil::Optional getHeaderParam(const std::string & key) const; void response(short, const std::string &) const; template void response(const IRouteHandler * route, const T & t) const { auto s = getSerializer(route); getOutputStream() << "Content-Type: " << s.first.group << "/" << s.first.type << "\r\n"; response(200, "OK"); Slicer::SerializeAnyWith(t, s.second); } const Core * core; }; } #endif