HSAdmin Backend Domains, E-Mail, Datenbanken
Purodha
2013-02-20 4a7e12928010374d76e677c8ec3ea4f5e63e9487
commit | author | age
c64ab5 1 /***************************************************************************
CD 2  *   Copyright (C) 2005 by Christof Donat   *
3  *   cdonat@gmx.de   *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include <iosfwd>
22 #include <string>
23 #include <iostream>
24 #include <boost/lexical_cast.hpp>
25 #include <boost/iostreams/stream.hpp>
26
27 #include "sslclient.h"
28
29 #ifndef HSADMIN_HTTPCLIENT
30 #define HSADMIN_HTTPCLIENT
31
32 using std::string;
33 using std::iostream;
34 using std::streamsize;
35 using boost::lexical_cast;
36 using boost::bad_lexical_cast;
37
38 //! A Socket as a Device
39 class TCPDevice : public boost::iostreams::device<boost::iostreams::bidirectional> {
40 public:
41         //! create a TCP-Stream by connecting to the given port at the given address
42         TCPDevice(const string& address, const short int port);
43         //! create a TCP-Stream by connecting to the given port at the given address
44         TCPDevice(const char* address, const short int port);
45         //! create a TCP-Stream from a connected socket - use this with accept
46         TCPDevice(const int socket);
47     //! copy constructor
48     TCPDevice(const TCPDevice& other);
49         //! does not close the socket - use closeSocket before deleting the Device.
50         virtual ~TCPDevice();
51     //! closes the socket
52     void closeSocket();
53
54         //! read n Bytes from socket
55         virtual streamsize read(char* s, streamsize n);
56         //! write n Bytes to socket
57         virtual streamsize write(const char* s, streamsize n);
58 private:
59     void init(const char* address, const short int port);
60         int m_socket;
61 };
62
63 //class SSLDevice;
64
65 const int HTTP = 0;
66 const int HTTPS = 1;
67
68 //! the basic HTTP Client - can only handle POST method.
69 class GenericHttpClient {
70     public:
71     //! initialize HTTP CLient with URL and default Port (usually 80)
72     GenericHttpClient(const string &url, const unsigned short defaultPort);
73     //! Post 
74     string post(string postcontent);
75
76     protected:
77     //! get a buffered iostream for the connection - must be overridden by derived classes
78     virtual iostream * getConnection(const string &host, unsigned short port) = 0;
79     //! check if this class can handle the protocol - must be overridden by derived classes
80     virtual bool checkProtocol(const string &protocol) { return false; };
81     //! close the underlying connection
82     virtual void close() = 0;
83
84     private:
85     iostream * parseUrl();
86     const string& m_url;
87     string m_protocol;
88     string m_hostname;
89     string m_path;
90     unsigned short m_port;
91     const unsigned short m_defaultPort;
92 };
93
94 //! This template should usually be used in one of the specialized Versions below.
95 template <int protocol> class HttpClient: public GenericHttpClient {
96     public:
97     HttpClient(const string &url, unsigned short defaultPort = 80): GenericHttpClient(url,defaultPort) {};
98     protected:
99     iostream * getConnection(const string &host, unsigned short port) { return (iostream *)0; };
100     bool checkProtocol(const string &p) { return false; };
101     virtual void close() { };
102 };
103
104 //! a HTTP CLient with a plain TCP socket as transport
105 template <> class HttpClient<HTTP>: public GenericHttpClient {
106     public:
107     //! initialize HTTP CLient with URL and default Port (usually 80)
108     HttpClient(const string &url, unsigned short defaultPort = 80): GenericHttpClient(url,defaultPort), device(0) {};
109     protected:
110     //! get a buffered iostream for the connection
111     iostream * getConnection(const string &host, unsigned short port) {
112         if( device == 0 ) device = new TCPDevice(host,port);
113         return (iostream *) new boost::iostreams::stream<TCPDevice>(*device); 
114     }
115     //! check if this class can handle the protocol
116     bool checkProtocol(const string &protocol) { return (protocol == "http"); };
117     //! close the underlying connection
118     virtual void close() { device->closeSocket(); };
119     private:
120     TCPDevice *device;
121 };
122 //! a HTTP CLient with a SSL stream as transport
123 template <> class HttpClient<HTTPS>: public GenericHttpClient {
124     public:
125     //! initialize HTTPS CLient with URL and default Port (usually 443)
126     HttpClient(const string &url, unsigned short defaultPort = 443): GenericHttpClient(url,defaultPort), device(0) {};
127     protected:
128     //! get a buffered iostream for the connection
129     iostream * getConnection(const string &host, unsigned short port) { 
130         try {
131             if( device == 0 ) device = new SSLDevice(host,port);
132             return (iostream *) new boost::iostreams::stream<SSLDevice>(*device); 
133         } catch( SSLDevice::CertificateError &e ) {
134             if( device != 0 ) {
135                 delete(device);
136                 device = 0;
137             }
138             std::cerr << e.msg << std::endl;
139             return (iostream *)0;
140         }
141     }
142     //! check if this class can handle the protocol
143     bool checkProtocol(const string &protocol) { return (protocol == "https"); };
144     //! close the underlying connection
145     virtual void close() { device->closeSocket(); };
146     private:
147     SSLDevice *device;
148 };
149
150 /** \brief get the best HTTP client for the defined Protocol
151  * 
152  * returns HttpClient<HTTP> or HttpClient<HTTPS> depending on the protocol
153  */
154 GenericHttpClient *createHttpClient(const string &uri);
155
156 #else  /* HSADMIN_HTTPCLIENT */
157 class TCPDevice;
158 class GenericHttpClient;
159 genericHttpClient *createHttpClient(url);
160
161 extern const int HTTP  = 0;
162 extern const int HTTPS = 1;
163 #endif /* HSADMIN_HTTPCLIENT */