Pārlūkot izejas kodu

update hssl api

hewei.it 5 gadi atpakaļ
vecāks
revīzija
06ff554c91
3 mainītis faili ar 50 papildinājumiem un 65 dzēšanām
  1. 20 44
      base/hssl.c
  2. 2 6
      base/hssl.h
  3. 28 15
      event/nio.c

+ 20 - 44
base/hssl.c

@@ -49,7 +49,7 @@ error:
     return NULL;
 }
 
-void hssl_ctx_destory(hssl_ctx_t ssl_ctx) {
+void hssl_ctx_cleanup(hssl_ctx_t ssl_ctx) {
     if (ssl_ctx) {
         if (ssl_ctx == s_ssl_ctx) {
             s_ssl_ctx = NULL;
@@ -73,19 +73,31 @@ void hssl_free(hssl_t ssl) {
     }
 }
 
-int hssl_connect(hssl_t ssl) {
-    int ret = SSL_connect((SSL*)ssl);
+int hssl_accept(hssl_t ssl) {
+    int ret = SSL_accept((SSL*)ssl);
     if (ret == 1) return 0;
 
     int err = SSL_get_error((SSL*)ssl, ret);
+    if (err == SSL_ERROR_WANT_READ) {
+        return HSSL_WANT_READ;
+    }
+    else if (err == SSL_ERROR_WANT_WRITE) {
+        return HSSL_WANT_WRITE;
+    }
     return err;
 }
 
-int hssl_accept(hssl_t ssl) {
-    int ret = SSL_accept((SSL*)ssl);
+int hssl_connect(hssl_t ssl) {
+    int ret = SSL_connect((SSL*)ssl);
     if (ret == 1) return 0;
 
     int err = SSL_get_error((SSL*)ssl, ret);
+    if (err == SSL_ERROR_WANT_READ) {
+        return HSSL_WANT_READ;
+    }
+    else if (err == SSL_ERROR_WANT_WRITE) {
+        return HSSL_WANT_WRITE;
+    }
     return err;
 }
 
@@ -102,30 +114,6 @@ int hssl_close(hssl_t ssl) {
     return 0;
 }
 
-int hssl_set_accept_state(hssl_t ssl) {
-    SSL_set_accept_state((SSL*)ssl);
-    return 0;
-}
-
-int hssl_set_connect_state(hssl_t ssl) {
-    SSL_set_connect_state((SSL*)ssl);
-    return 0;
-}
-
-int hssl_do_handshark(hssl_t ssl) {
-    int ret = SSL_do_handshake((SSL*)ssl);
-    if (ret == 1) return 0;
-
-    int err = SSL_get_error((SSL*)ssl, ret);
-    if (err == SSL_ERROR_WANT_READ) {
-        return HSSL_WANT_READ;
-    }
-    else if (err == SSL_ERROR_WANT_WRITE) {
-        return HSSL_WANT_WRITE;
-    }
-    return err;
-}
-
 #else
 
 #include "hplatform.h"
@@ -135,7 +123,7 @@ hssl_ctx_t hssl_ctx_init(hssl_ctx_init_param_t* param) {
     return NULL;
 }
 
-void hssl_ctx_destory(hssl_ctx_t ssl_ctx) {
+void hssl_ctx_cleanup(hssl_ctx_t ssl_ctx) {
 }
 
 hssl_t hssl_new(hssl_ctx_t ssl_ctx, int fd) {
@@ -145,11 +133,11 @@ hssl_t hssl_new(hssl_ctx_t ssl_ctx, int fd) {
 void hssl_free(hssl_t ssl) {
 }
 
-int hssl_connect(hssl_t ssl) {
+int hssl_accept(hssl_t ssl) {
     return 0;
 }
 
-int hssl_accept(hssl_t ssl) {
+int hssl_connect(hssl_t ssl) {
     return 0;
 }
 
@@ -166,16 +154,4 @@ int hssl_write(hssl_t ssl, const void* buf, int len) {
 int hssl_close(hssl_t ssl) {
     return 0;
 }
-
-int hssl_set_accept_state(hssl_t ssl) {
-    return 0;
-}
-
-int hssl_set_connect_state(hssl_t ssl) {
-    return 0;
-}
-
-int hssl_do_handshark(hssl_t ssl) {
-    return 0;
-}
 #endif

+ 2 - 6
base/hssl.h

@@ -22,22 +22,18 @@ typedef struct {
 BEGIN_EXTERN_C
 
 HV_EXPORT hssl_ctx_t hssl_ctx_init(hssl_ctx_init_param_t* param);
-HV_EXPORT void hssl_ctx_destory(hssl_ctx_t ssl_ctx);
+HV_EXPORT void hssl_ctx_cleanup(hssl_ctx_t ssl_ctx);
 HV_EXPORT hssl_ctx_t hssl_ctx_instance();
 
 HV_EXPORT hssl_t hssl_new(hssl_ctx_t ssl_ctx, int fd);
 HV_EXPORT void hssl_free(hssl_t ssl);
 
-HV_EXPORT int hssl_connect(hssl_t ssl);
 HV_EXPORT int hssl_accept(hssl_t ssl);
+HV_EXPORT int hssl_connect(hssl_t ssl);
 HV_EXPORT int hssl_read(hssl_t ssl, void* buf, int len);
 HV_EXPORT int hssl_write(hssl_t ssl, const void* buf, int len);
 HV_EXPORT int hssl_close(hssl_t ssl);
 
-HV_EXPORT int hssl_set_accept_state(hssl_t ssl);
-HV_EXPORT int hssl_set_connect_state(hssl_t ssl);
-HV_EXPORT int hssl_do_handshark(hssl_t ssl);
-
 END_EXTERN_C
 
 #endif // HV_SSL_H_

+ 28 - 15
event/nio.c

@@ -168,25 +168,42 @@ static void __close_cb(hio_t* io) {
     }
 }
 
-static void ssl_do_handshark(hio_t* io) {
-    printd("ssl handshark...\n");
-    int ret = hssl_do_handshark(io->ssl);
+static void ssl_server_handshark(hio_t* io) {
+    printd("ssl server handshark...\n");
+    int ret = hssl_accept(io->ssl);
     if (ret == 0) {
         // handshark finish
         iowatcher_del_event(io->loop, io->fd, HV_READ);
         io->events &= ~HV_READ;
         io->cb = NULL;
         printd("ssl handshark finished.\n");
-        if (io->accept_cb) {
-            __accept_cb(io);
-        }
-        else if (io->connect_cb) {
-            __connect_cb(io);
+        __accept_cb(io);
+    }
+    else if (ret == HSSL_WANT_READ) {
+        if ((io->events & HV_READ) == 0) {
+            hio_add(io, ssl_server_handshark, HV_READ);
         }
     }
+    else {
+        hloge("ssl handshake failed: %d", ret);
+        hio_close(io);
+    }
+}
+
+static void ssl_client_handshark(hio_t* io) {
+    printd("ssl client handshark...\n");
+    int ret = hssl_connect(io->ssl);
+    if (ret == 0) {
+        // handshark finish
+        iowatcher_del_event(io->loop, io->fd, HV_READ);
+        io->events &= ~HV_READ;
+        io->cb = NULL;
+        printd("ssl handshark finished.\n");
+        __connect_cb(io);
+    }
     else if (ret == HSSL_WANT_READ) {
         if ((io->events & HV_READ) == 0) {
-            hio_add(io, ssl_do_handshark, HV_READ);
+            hio_add(io, ssl_client_handshark, HV_READ);
         }
     }
     else {
@@ -231,9 +248,7 @@ accept:
         }
         hio_enable_ssl(connio);
         connio->ssl = ssl;
-        // int ret = hssl_accept(ssl);
-        hssl_set_accept_state(ssl);
-        ssl_do_handshark(connio);
+        ssl_server_handshark(connio);
     }
     else {
         // NOTE: SSL call accept_cb after handshark finished
@@ -269,9 +284,7 @@ static void nio_connect(hio_t* io) {
                 goto connect_failed;
             }
             io->ssl = ssl;
-            // int ret = hssl_connect(ssl);
-            hssl_set_connect_state(ssl);
-            ssl_do_handshark(io);
+            ssl_client_handshark(io);
         }
         else {
             // NOTE: SSL call connect_cb after handshark finished