#ifndef ICESPIDER_IHTTPREQUEST_H #define ICESPIDER_IHTTPREQUEST_H #include #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 OptionalString getCookieParam(const std::string &) const = 0; virtual OptionalString getEnv(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; virtual void setHeader(const std::string &, const std::string &) const = 0; template T getURLParam(unsigned int) const; template IceUtil::Optional getBody() const { return Slicer::DeserializeAnyWith(getDeserializer()); } template IceUtil::Optional getBodyParam(const IceUtil::Optional & map, const std::string & key) const { if (!map) { return IceUtil::Optional(); } auto i = map->find(key); if (i == map->end()) { return IceUtil::Optional(); } else { return boost::lexical_cast(i->second); } } void responseRedirect(const std::string & url, const IceUtil::Optional & = IceUtil::None) const; void setCookie(const std::string &, const std::string &, const IceUtil::Optional & = IceUtil::None, const IceUtil::Optional & = IceUtil::None, bool = false, IceUtil::Optional = IceUtil::None); template void setCookie(const std::string &, const T &, const IceUtil::Optional & = IceUtil::None, const IceUtil::Optional & = IceUtil::None, bool = false, IceUtil::Optional = IceUtil::None); template IceUtil::Optional getQueryStringParam(const std::string & key) const; template IceUtil::Optional getHeaderParam(const std::string & key) const; template IceUtil::Optional getCookieParam(const std::string & key) const; virtual void response(short, const std::string &) const = 0; template void response(const IRouteHandler * route, const T & t) const { auto s = getSerializer(route); setHeader("Content-Type", s.first.group + "/" + s.first.type); response(200, "OK"); Slicer::SerializeAnyWith(t, s.second); } const Core * core; }; } #endif