/* * Copyright (C) 2004-2013 ZNC, see the NOTICE file for details. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _HTTPSOCK_H #define _HTTPSOCK_H #include #include #include class CModule; class CHTTPSock : public CSocket { public: CHTTPSock(CModule *pMod); CHTTPSock(CModule *pMod, const CString& sHostname, unsigned short uPort, int iTimeout = 60); virtual ~CHTTPSock(); // Csocket derived members virtual void ReadData(const char* data, size_t len); virtual void ReadLine(const CString& sData); virtual void Connected(); virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort) = 0; // !Csocket derived members // Hooks virtual bool ForceLogin(); virtual bool OnLogin(const CString& sUser, const CString& sPass); virtual void OnPageRequest(const CString& sURI) = 0; virtual bool PrintFile(const CString& sFileName, CString sContentType = ""); // !Hooks void CheckPost(); bool SentHeader() const; bool PrintHeader(off_t uContentLength, const CString& sContentType = "", unsigned int uStatusId = 200, const CString& sStatusMsg = "OK"); void AddHeader(const CString& sName, const CString& sValue); void SetContentType(const CString& sContentType); bool PrintNotFound(); bool Redirect(const CString& sURL); bool PrintErrorPage(unsigned int uStatusId, const CString& sStatusMsg, const CString& sMessage); static void ParseParams(const CString& sParams, std::map& msvsParams); void ParseURI(); void GetPage(); static CString GetDate(time_t tm = 0); // Cookies CString GetRequestCookie(const CString& sKey) const; bool SendCookie(const CString& sKey, const CString& sValue); // Cookies // Setters void SetDocRoot(const CString& s); void SetLoggedIn(bool b) { m_bLoggedIn = b; } // !Setters // Getters CString GetPath() const; bool IsLoggedIn() const { return m_bLoggedIn; } const CString& GetDocRoot() const; const CString& GetUser() const; const CString& GetPass() const; const CString& GetParamString() const; const CString& GetContentType() const; bool IsPost() const; // !Getters // Parameter access CString GetParam(const CString& sName, bool bPost = true, const CString& sFilter = "\r\n") const; CString GetRawParam(const CString& sName, bool bPost = true) const; bool HasParam(const CString& sName, bool bPost = true) const; const std::map& GetParams(bool bPost = true) const; size_t GetParamValues(const CString& sName, VCString& vsRet, bool bPost = true, const CString& sFilter = "\r\n") const; size_t GetParamValues(const CString& sName, std::set& ssRet, bool bPost = true, const CString& sFilter = "\r\n") const; // !Parameter access private: static CString GetRawParam(const CString& sName, const std::map& msvsParams); static CString GetParam(const CString& sName, const std::map& msvsParams, const CString& sFilter); static size_t GetParamValues(const CString& sName, VCString& vsRet, const std::map& msvsParams, const CString& sFilter); static size_t GetParamValues(const CString& sName, std::set& ssRet, const std::map& msvsParams, const CString& sFilter); void WriteFileUncompressed(CFile& File); void WriteFileGzipped(CFile& File); protected: void PrintPage(const CString& sPage); void Init(); bool m_bSentHeader; bool m_bGotHeader; bool m_bLoggedIn; bool m_bPost; bool m_bDone; unsigned long m_uPostLen; CString m_sPostData; CString m_sURI; CString m_sUser; CString m_sPass; CString m_sContentType; CString m_sDocRoot; std::map m_msvsPOSTParams; std::map m_msvsGETParams; MCString m_msHeaders; bool m_bHTTP10Client; CString m_sIfNoneMatch; bool m_bAcceptGzip; MCString m_msRequestCookies; MCString m_msResponseCookies; }; #endif // !_HTTPSOCK_H