Răsfoiți Sursa

HTTPRequest can now handle https

Kolja Strohm 3 ani în urmă
părinte
comite
7e1e19c4db
6 a modificat fișierele cu 123 adăugiri și 93 ștergeri
  1. 23 7
      Network/HttpRequest.cpp
  2. 2 1
      Network/HttpRequest.h
  3. 14 6
      Network/Klient.cpp
  4. 1 0
      Network/Klient.h
  5. 3 0
      Network/Network.cpp
  6. 80 79
      Network/Network.h

+ 23 - 7
Network/HttpRequest.cpp

@@ -8,7 +8,7 @@ using namespace Network;
 using namespace HTTP;
 
 
-PostRequest::PostRequest( const char *path, const char *host, const char *data, const char *contentType, unsigned short port )
+PostRequest::PostRequest( const char *path, const char *host, const char *data, const char *contentType, unsigned short port, bool useSSL )
     : ReferenceCounter()
 {
     this->path = path;
@@ -16,6 +16,7 @@ PostRequest::PostRequest( const char *path, const char *host, const char *data,
     this->data = data;
     this->contentType = contentType;
     this->port = port;
+    this->useSSL = useSSL;
 }
 
 Answer *PostRequest::execute() const
@@ -31,10 +32,20 @@ Answer *PostRequest::execute() const
     message += data.getLength();
     message += "\r\n\r\n";
     message += data;
+    SSLKlient httpsK;
     Klient httpK;
-    if( !httpK.verbinde( port, host ) )
-        return 0;
-    httpK.sende( message, message.getLength() );
+    if( useSSL )
+    {
+        if( !httpsK.verbinde( port, host ) )
+            return 0;
+        httpsK.sende( message, message.getLength() );
+    }
+    else
+    {
+        if( !httpK.verbinde( port, host ) )
+            return 0;
+        httpK.sende( message, message.getLength() );
+    }
     int length = -1;
     bool lastn = 0;
     Text answer;
@@ -42,7 +53,7 @@ Answer *PostRequest::execute() const
     {
         char buff[ 2 ];
         buff[ 1 ] = 0;
-        if( httpK.getNachricht( buff, 1 ) )
+        if( ( useSSL && httpsK.getNachricht( buff, 1 ) ) || ( !useSSL && httpK.getNachricht( buff, 1 ) ) )
         {
             answer += buff;
             if( buff[ 0 ] == '\n' )
@@ -65,7 +76,12 @@ Answer *PostRequest::execute() const
                     char *buff = new char[ length + 1 ];
                     buff[ length ] = 0;
                     if( length > 0 )
-                        httpK.getNachricht( buff, length );
+                    {
+                        if( useSSL )
+                            httpsK.getNachricht( buff, length );
+                        else
+                            httpK.getNachricht( buff, length );
+                    }
                     answer += buff;
                     delete[] buff;
                     break;
@@ -77,7 +93,7 @@ Answer *PostRequest::execute() const
         }
         else
             break;
-    } while( httpK.hatNachricht( 1000 ) );
+    } while( ( useSSL && httpsK.hatNachricht( 1000 ) ) || ( useSSL && httpK.hatNachricht( 1000 ) ) );
     if( answer.getLength() )
         return new Answer( answer );
     return 0;

+ 2 - 1
Network/HttpRequest.h

@@ -37,9 +37,10 @@ namespace Network
             Framework::Text contentType;
             Framework::Text data;
             unsigned short port;
+            bool useSSL;
 
         public:
-            __declspec( dllexport ) PostRequest( const char *path, const char *host, const char *data, const char *contentType, unsigned short port );
+            __declspec( dllexport ) PostRequest( const char *path, const char *host, const char *data, const char *contentType, unsigned short port, bool useSSL = false );
 
             __declspec( dllexport ) Answer *execute() const;
         };

+ 14 - 6
Network/Klient.cpp

@@ -4,9 +4,10 @@
 #ifndef WIN32
 #include <string.h>
 #include <netdb.h>
+#include <sys/select.h>
 #endif
 #include <Key.h>
-#include <Datei.h>
+#include <Datei.h> 
 
 using namespace Network;
 
@@ -202,13 +203,11 @@ bool Klient::trenne() // Trennt die Verbindung zum Server
 // constant
 bool Klient::hatNachricht( int zeit ) // Wartet eine Zeit Lang auf eine Nachricht
 {
-#ifdef WIN32
-    fd_set set = { 1, { sock } };
+    fd_set set;
+    FD_ZERO( &set );
+    FD_SET( sock, &set );
     timeval time = { zeit / 1000, zeit };
     return select( 0, &set, 0, 0, &time ) == 1;
-#else
-    return 1;
-#endif
 }
 
 unsigned short Klient::getServerPort() const // gibt den Port zurück
@@ -323,6 +322,15 @@ bool SSLKlient::trenne() // Trennt die Verbindung zum Server
 }
 
 // constant 
+bool SSLKlient::hatNachricht( int zeit ) // Wartet eine Zeit Lang auf eine Nachricht
+{
+    fd_set set;
+    FD_ZERO( &set );
+    FD_SET( SSL_get_rfd( ssl ), &set );
+    timeval time = { zeit / 1000, zeit };
+    return select( 0, &set, 0, 0, &time ) == 1;
+}
+
 unsigned short SSLKlient::getServerPort() const // gibt den Port des Servers zurück
 {
     return port;

+ 1 - 0
Network/Klient.h

@@ -84,6 +84,7 @@ namespace Network
         __declspec( dllexport ) int getUploadBytes( bool reset ); // gibt die anzahl von versendeter bytes zurück
         __declspec( dllexport ) bool trenne(); // Trennt die Verbindung zum Server
         // constant 
+        __declspec( dllexport ) bool hatNachricht( int zeit ); // Wartet eine Zeit Lang auf eine Nachricht
         __declspec( dllexport ) unsigned short getServerPort() const; // gibt den Port des Servers zurück
         __declspec( dllexport ) const char *getServerIp() const; // gibt die Ip des Servers zurück
     };

+ 3 - 0
Network/Network.cpp

@@ -65,6 +65,9 @@ Network::NetworkReader::NetworkReader( Verbindung *v )
     verbindung = v;
 }
 
+Network::NetworkReader::~NetworkReader()
+{}
+
 //! Ließt aus der Datei
 //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
 //! \param len Wie viele Bytes aus der Resource gelesen werden sollen

+ 80 - 79
Network/Network.h

@@ -37,100 +37,101 @@
 
 namespace Framework
 {
-	class Text;
+    class Text;
 }
 
 namespace Network
 {
-	__declspec( dllexport ) void Start( int maxClients );
-	__declspec( dllexport ) void getHostName( char *name, int bufferLen );
-	__declspec( dllexport ) char *getHostAddresse();
-	__declspec( dllexport ) void Exit();
+    __declspec( dllexport ) void Start( int maxClients );
+    __declspec( dllexport ) void getHostName( char *name, int bufferLen );
+    __declspec( dllexport ) char *getHostAddresse();
+    __declspec( dllexport ) void Exit();
 
 
-	class Verbindung
-	{
-	public:
-		virtual bool sende( const char *nachricht, int len ) = 0; // sendet Nachricht
-		virtual bool getNachricht( char *nachricht, int len ) = 0; // empfängt Nachricht
-	};
+    class Verbindung
+    {
+    public:
+        virtual bool sende( const char *nachricht, int len ) = 0; // sendet Nachricht
+        virtual bool getNachricht( char *nachricht, int len ) = 0; // empfängt Nachricht
+    };
 
-	class EncryptedVerbindung : public Verbindung
-	{
-	public:
-		virtual bool sendeEncrypted( const char *nachricht, int len ) = 0; // sendet Nachricht
-		virtual bool getNachrichtEncrypted( char *nachricht, int len ) = 0; // empfängt Nachricht
-	};
+    class EncryptedVerbindung : public Verbindung
+    {
+    public:
+        virtual bool sendeEncrypted( const char *nachricht, int len ) = 0; // sendet Nachricht
+        virtual bool getNachrichtEncrypted( char *nachricht, int len ) = 0; // empfängt Nachricht
+    };
 
-	class NetworkReader : public Framework::StreamReader
-	{
-	private:
-		Verbindung *verbindung;
+    class NetworkReader : public Framework::StreamReader
+    {
+    private:
+        Verbindung *verbindung;
 
-	public:
-		__declspec( dllexport ) NetworkReader( Verbindung *v );
-		//! Ließt aus der Datei
-		//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
-		//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
-		__declspec( dllexport ) void lese( char *bytes, int len ) override;
-		//! Ließt die nächste zeile der Resource ein
-		//! \return Die gelesene Zeile als Text mit zeilenumbruch
-		__declspec( dllexport ) Framework::Text *leseZeile() override;
-		//! Prüft, ob die Resource vollständig gelesen wurde
-		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
-		__declspec( dllexport ) bool istEnde() const override;
-	};
+    public:
+        __declspec( dllexport ) NetworkReader( Verbindung *v );
+        __declspec( dllexport ) virtual ~NetworkReader();
+        //! Ließt aus der Datei
+        //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
+        //! \param len Wie viele Bytes aus der Resource gelesen werden sollen
+        __declspec( dllexport ) void lese( char *bytes, int len ) override;
+        //! Ließt die nächste zeile der Resource ein
+        //! \return Die gelesene Zeile als Text mit zeilenumbruch
+        __declspec( dllexport ) Framework::Text *leseZeile() override;
+        //! Prüft, ob die Resource vollständig gelesen wurde
+        //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+        __declspec( dllexport ) bool istEnde() const override;
+    };
 
-	class NetworkWriter : public Framework::StreamWriter
-	{
-	private:
-		Verbindung *verbindung;
+    class NetworkWriter : public Framework::StreamWriter
+    {
+    private:
+        Verbindung *verbindung;
 
-	public:
-		__declspec( dllexport ) NetworkWriter( Verbindung *v );
-		//! Schreibt in die Resource
-		//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
-		//! \param len Wie viele Bytes in die Resource geschrieben werden sollen
-		__declspec( dllexport ) void schreibe( const char *bytes, int len ) override;
-		//! Prüft, ob die Resource vollständig geschrieben wurde
-		//!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
-		__declspec( dllexport ) bool istEnde() const override;
-	};
+    public:
+        __declspec( dllexport ) NetworkWriter( Verbindung *v );
+        //! Schreibt in die Resource
+        //! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
+        //! \param len Wie viele Bytes in die Resource geschrieben werden sollen
+        __declspec( dllexport ) void schreibe( const char *bytes, int len ) override;
+        //! Prüft, ob die Resource vollständig geschrieben wurde
+        //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
+        __declspec( dllexport ) bool istEnde() const override;
+    };
 
-	class EncryptedNetworkReader : public Framework::StreamReader
-	{
-	private:
-		EncryptedVerbindung *verbindung;
+    class EncryptedNetworkReader : public Framework::StreamReader
+    {
+    private:
+        EncryptedVerbindung *verbindung;
 
-	public:
-		__declspec( dllexport ) EncryptedNetworkReader( EncryptedVerbindung *v );
-		//! Ließt aus der Datei
-		//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
-		//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
-		__declspec( dllexport ) void lese( char *bytes, int len ) override;
-		//! Ließt die nächste zeile der Resource ein
-		//! \return Die gelesene Zeile als Text mit zeilenumbruch
-		__declspec( dllexport ) Framework::Text *leseZeile() override;
-		//! Prüft, ob die Resource vollständig gelesen wurde
-		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
-		__declspec( dllexport ) bool istEnde() const override;
-	};
+    public:
+        __declspec( dllexport ) EncryptedNetworkReader( EncryptedVerbindung *v );
+        //! Ließt aus der Datei
+        //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
+        //! \param len Wie viele Bytes aus der Resource gelesen werden sollen
+        __declspec( dllexport ) void lese( char *bytes, int len ) override;
+        //! Ließt die nächste zeile der Resource ein
+        //! \return Die gelesene Zeile als Text mit zeilenumbruch
+        __declspec( dllexport ) Framework::Text *leseZeile() override;
+        //! Prüft, ob die Resource vollständig gelesen wurde
+        //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+        __declspec( dllexport ) bool istEnde() const override;
+    };
 
-	class EncryptedNetworkWriter : public Framework::StreamWriter
-	{
-	private:
-		EncryptedVerbindung *verbindung;
+    class EncryptedNetworkWriter : public Framework::StreamWriter
+    {
+    private:
+        EncryptedVerbindung *verbindung;
 
-	public:
-		__declspec( dllexport ) EncryptedNetworkWriter( EncryptedVerbindung *v );
-		//! Schreibt in die Resource
-		//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
-		//! \param len Wie viele Bytes in die Resource geschrieben werden sollen
-		__declspec( dllexport ) void schreibe( const char *bytes, int len ) override;
-		//! Prüft, ob die Resource vollständig geschrieben wurde
-		//!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
-		__declspec( dllexport ) bool istEnde() const override;
-	};
+    public:
+        __declspec( dllexport ) EncryptedNetworkWriter( EncryptedVerbindung *v );
+        //! Schreibt in die Resource
+        //! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
+        //! \param len Wie viele Bytes in die Resource geschrieben werden sollen
+        __declspec( dllexport ) void schreibe( const char *bytes, int len ) override;
+        //! Prüft, ob die Resource vollständig geschrieben wurde
+        //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
+        __declspec( dllexport ) bool istEnde() const override;
+    };
 }
 
 #endif