https_test.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. #include "board.h"
  2. #include <string.h>
  3. /* wolfssl includes. */
  4. #include <wolfssl/ssl.h>
  5. #include <wolfssl/internal.h>
  6. #define HTTPS_GET_API "GET / HTTP/1.1\r\n" /* HOST, host-port, URI */\
  7. "Host: www.baidu.com\r\n" /* server name */ \
  8. "\r\n"
  9. typedef struct {
  10. uint32_t ContentLength;
  11. }https_header_t;
  12. const char s__host_name[] = "www.baidu.com";
  13. static const unsigned char __ssl_root_certificate[] =
  14. "-----BEGIN CERTIFICATE-----"
  15. "MIIJ7DCCCNSgAwIBAgIMTkADpl62gfh/S9jrMA0GCSqGSIb3DQEBCwUAMFAxCzAJ"
  16. "BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSYwJAYDVQQDEx1H"
  17. "bG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODAeFw0yNDA3MDgwMTQxMDJaFw0y"
  18. "NTA4MDkwMTQxMDFaMIGAMQswCQYDVQQGEwJDTjEQMA4GA1UECBMHYmVpamluZzEQ"
  19. "MA4GA1UEBxMHYmVpamluZzE5MDcGA1UEChMwQmVpamluZyBCYWlkdSBOZXRjb20g"
  20. "U2NpZW5jZSBUZWNobm9sb2d5IENvLiwgTHRkMRIwEAYDVQQDEwliYWlkdS5jb20w"
  21. "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1wFMskJ2dseOqoHptNwot"
  22. "FOhdBERsZ4VQnRNKXEEXMQEfgbNtScQ+C/Z+IpRAt1EObhYlifn74kt2nTsCQLng"
  23. "jfQkRVBuO/6PNGKdlCYGBeGqAL7xR+LOyHnpH9mwCBJc+WVt2zYM9I1clpXCJa+I"
  24. "tsq6qpb1AGoQxRDZ2n4K8Gd61wgNCPHDHc/Lk9NPJoUBMvYWvEe5lKhHsJtWtHe4"
  25. "QC3y58Vi+r5R0PWn2hyTBr9fCo58p/stDiRqp9Irtmi95YhwkNkmgwpMB8RhcGoN"
  26. "h+Uw5TkPZVj4AVaoPT1ED/GMKZev0+ypmp0+nmjVg2x7yUfLUfp3X7oBdI4TS2hv"
  27. "AgMBAAGjggaTMIIGjzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADCBjgYI"
  28. "KwYBBQUHAQEEgYEwfzBEBggrBgEFBQcwAoY4aHR0cDovL3NlY3VyZS5nbG9iYWxz"
  29. "aWduLmNvbS9jYWNlcnQvZ3Nyc2FvdnNzbGNhMjAxOC5jcnQwNwYIKwYBBQUHMAGG"
  30. "K2h0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2dzcnNhb3Zzc2xjYTIwMTgwVgYD"
  31. "VR0gBE8wTTBBBgkrBgEEAaAyARQwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu"
  32. "Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQICMD8GA1UdHwQ4MDYw"
  33. "NKAyoDCGLmh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vZ3Nyc2FvdnNzbGNhMjAx"
  34. "OC5jcmwwggNhBgNVHREEggNYMIIDVIIJYmFpZHUuY29tggxiYWlmdWJhby5jb22C"
  35. "DHd3dy5iYWlkdS5jboIQd3d3LmJhaWR1LmNvbS5jboIPbWN0LnkubnVvbWkuY29t"
  36. "ggthcG9sbG8uYXV0b4IGZHd6LmNuggsqLmJhaWR1LmNvbYIOKi5iYWlmdWJhby5j"
  37. "b22CESouYmFpZHVzdGF0aWMuY29tgg4qLmJkc3RhdGljLmNvbYILKi5iZGltZy5j"
  38. "b22CDCouaGFvMTIzLmNvbYILKi5udW9taS5jb22CDSouY2h1YW5rZS5jb22CDSou"
  39. "dHJ1c3Rnby5jb22CDyouYmNlLmJhaWR1LmNvbYIQKi5leXVuLmJhaWR1LmNvbYIP"
  40. "Ki5tYXAuYmFpZHUuY29tgg8qLm1iZC5iYWlkdS5jb22CESouZmFueWkuYmFpZHUu"
  41. "Y29tgg4qLmJhaWR1YmNlLmNvbYIMKi5taXBjZG4uY29tghAqLm5ld3MuYmFpZHUu"
  42. "Y29tgg4qLmJhaWR1cGNzLmNvbYIMKi5haXBhZ2UuY29tggsqLmFpcGFnZS5jboIN"
  43. "Ki5iY2Vob3N0LmNvbYIQKi5zYWZlLmJhaWR1LmNvbYIOKi5pbS5iYWlkdS5jb22C"
  44. "EiouYmFpZHVjb250ZW50LmNvbYILKi5kbG5lbC5jb22CCyouZGxuZWwub3JnghIq"
  45. "LmR1ZXJvcy5iYWlkdS5jb22CDiouc3UuYmFpZHUuY29tgggqLjkxLmNvbYISKi5o"
  46. "YW8xMjMuYmFpZHUuY29tgg0qLmFwb2xsby5hdXRvghIqLnh1ZXNodS5iYWlkdS5j"
  47. "b22CESouYmouYmFpZHViY2UuY29tghEqLmd6LmJhaWR1YmNlLmNvbYIOKi5zbWFy"
  48. "dGFwcHMuY26CDSouYmR0anJjdi5jb22CDCouaGFvMjIyLmNvbYIMKi5oYW9rYW4u"
  49. "Y29tgg8qLnBhZS5iYWlkdS5jb22CESoudmQuYmRzdGF0aWMuY29tghEqLmNsb3Vk"
  50. "LmJhaWR1LmNvbYISY2xpY2suaG0uYmFpZHUuY29tghBsb2cuaG0uYmFpZHUuY29t"
  51. "ghBjbS5wb3MuYmFpZHUuY29tghB3bi5wb3MuYmFpZHUuY29tghR1cGRhdGUucGFu"
  52. "LmJhaWR1LmNvbTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0j"
  53. "BBgwFoAU+O9/8s14Z6jeb48kjYjxhwMCs+swHQYDVR0OBBYEFK3KAFTK2OWUto+D"
  54. "2ieAKE5ZJDsYMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgCvGBoo1oyj4KmK"
  55. "TJxnqwn4u7wiuq68sTijoZ3T+bYDDQAAAZCQAGzzAAAEAwBHMEUCIFwF5Jc+zyIF"
  56. "Gnpxchz9fY1qzlqg/oVrs2nnuxcpBuuIAiEAu3scD6u51VOP/9aMSqR2yKHZLbHw"
  57. "Fos9U7AzSdLIZa8AdgAS8U40vVNyTIQGGcOPP3oT+Oe1YoeInG0wBYTr5YYmOgAA"
  58. "AZCQAG3iAAAEAwBHMEUCIBBYQ6NP7VUDgfktWRg5QxT23QAbTqYovtV2D9O8Qc0T"
  59. "AiEA2P7+44EvQ5adwL1y56oyxv/m+Gujeia7wpo7+Xbhv6MAdwAN4fIwK9MNwUBi"
  60. "EgnqVS78R3R8sdfpMO8OQh60fk6qNAAAAZCQAGy+AAAEAwBIMEYCIQDU7Hxtx4c9"
  61. "p9Jd+cr+DCMtyRYSc0b8cktCcbMmtDE9ygIhAIpJd4yb7jtxnaEC8oLWDushbK1v"
  62. "0BIuZu6YrQvsf1nQMA0GCSqGSIb3DQEBCwUAA4IBAQCh9DfewC012/+fHZpmSpCn"
  63. "y+h3/+ClAZ8cJVO+LCmYz9r6bkyhcFquJ5qUpyoW8AYtU0oUFlqH6zLIyujW+7lq"
  64. "wFxB6NsXKKdwBKmMbmnZr2Fca5f+TtwD/GDJgG/egr7fI1u8194j9KEl8cK8Fujm"
  65. "+UsoWklEzd1It9xkLazJR/6SwbhSR4k610pvj8rQrS4wAewuYFDaDOfqsHtDIsx1"
  66. "tZfIfoB/O1wGWZQJU2M9wC8uYq0jQ2Q0MQJXuyJz04MFiGrPAS1Uk8mWd8M+3p65"
  67. "Xy4iAf8uWzs1M+fcwBE8BNBghkQgE+FSUsldm+5ZBCazU0joJswzldWisXMLTagI"
  68. "-----END CERTIFICATE-----"
  69. ;
  70. static const size_t __ssl_root_certificate_len = sizeof(__ssl_root_certificate);
  71. /*
  72. *行长度不包含行尾的\r\n
  73. */
  74. static int https_content_get_line_len(const char *https_content, int content_len)
  75. {
  76. int ret = -1;
  77. int step = 0;
  78. int cnt;
  79. if (!https_content || (content_len <= 0))
  80. goto exit;
  81. for (cnt = 0; cnt < content_len; cnt++) {
  82. if (https_content[cnt] == '\r') {
  83. step = 1;
  84. } else if (https_content[cnt] == '\n') {
  85. if (step == 1) {
  86. ret = cnt - 1;
  87. break;
  88. }
  89. } else {
  90. step = 0;
  91. }
  92. }
  93. exit:
  94. return ret;
  95. }
  96. static int https_content_get_line_pos(const char *https_content, int content_len, uint32_t line)
  97. {
  98. int pos = -1;
  99. int cur_pos;
  100. int step = 0;
  101. int line_cnt = 0;
  102. if (!https_content || (content_len <= 0))
  103. goto exit;
  104. for (cur_pos = 0; cur_pos < content_len; cur_pos++) {
  105. if (step == 2) {
  106. line_cnt++;
  107. step = 0;
  108. if (line_cnt == line) {
  109. pos = cur_pos;
  110. break;
  111. }
  112. }
  113. if (https_content[cur_pos] == '\r') {
  114. step = 1;
  115. } else if (https_content[cur_pos] == '\n') {
  116. if (step == 1) {
  117. step = 2;
  118. }
  119. } else {
  120. step = 0;
  121. }
  122. }
  123. exit:
  124. return pos;
  125. }
  126. static int https_get_content_length(const char *https_content, int content_len)
  127. {
  128. int ret = -1;
  129. int line_len = 0;
  130. int pos = 0;
  131. int pos_cnt = 0;
  132. const char header_start[] = "HTTP";
  133. const char ContentLength[] = "Content-Length";
  134. if (!https_content || content_len < 4) {
  135. ret = -1;
  136. goto exit;
  137. }
  138. if (memcmp((const void *)https_content, (const void *)header_start, 4) != 0) {
  139. ret = -1;
  140. goto exit;
  141. }
  142. while (1) {
  143. pos = https_content_get_line_pos(&https_content[pos_cnt], content_len - pos_cnt, 1);
  144. if (pos > -1) {
  145. pos_cnt += pos;
  146. line_len = https_content_get_line_len(&https_content[pos_cnt], content_len - pos_cnt);
  147. if (line_len <= 0) {
  148. break;
  149. } else if (line_len >= strlen(ContentLength)) {
  150. if (memcmp((const char *)&https_content[pos_cnt], (const char *)ContentLength, strlen(ContentLength)) == 0) {
  151. sscanf((const char *)&https_content[pos_cnt + strlen(ContentLength) + 2], "%d\r\n", &ret);
  152. break;
  153. }
  154. }
  155. } else {
  156. break;
  157. }
  158. }
  159. exit:
  160. return ret;
  161. }
  162. static int https_get_content_pos(const char *https_content, int content_len)
  163. {
  164. int ret = -1;
  165. int line_len = 0;
  166. int pos = 0;
  167. int pos_cnt = 0;
  168. int flag = 0;
  169. const char header_start[] = "HTTP";
  170. if (!https_content || content_len < 4) {
  171. ret = -1;
  172. goto exit;
  173. }
  174. if (memcmp((const void *)https_content, (const void *)header_start, 4) != 0) {
  175. ret = -1;
  176. goto exit;
  177. }
  178. while (1) {
  179. pos = https_content_get_line_pos(&https_content[pos_cnt], content_len - pos_cnt, 1);
  180. if (pos > -1) {
  181. pos_cnt += pos;
  182. line_len = https_content_get_line_len(&https_content[pos_cnt], content_len - pos_cnt);
  183. if (flag) {
  184. ret = pos_cnt;
  185. break;
  186. } else {
  187. if (line_len < 0) {
  188. break;
  189. } else if (line_len == 0) {
  190. flag = 1;
  191. }
  192. }
  193. } else {
  194. break;
  195. }
  196. }
  197. exit:
  198. return ret;
  199. }
  200. #if !USE_LWIP
  201. #include "FreeRTOS_Sockets.h"
  202. #include "FreeRTOS_DHCP_Server.h"
  203. void https_client_test(void)
  204. {
  205. WOLFSSL_CTX* ctx = NULL;
  206. uint32_t server_ip;
  207. uint32_t sin_addr;
  208. Socket_t socket;
  209. struct freertos_sockaddr servaddr = {0};
  210. WOLFSSL* ssl = NULL;
  211. char http_head[] = HTTPS_GET_API;
  212. int recv_len = 0;
  213. int total_recv_len = 0;
  214. char *rbuf = NULL;
  215. uint32_t pg_size = 1024 * 16;
  216. int ContentLength = -1;
  217. int content_start_pos = -1;
  218. char pucBuffer[32] = {0};
  219. uint16_t sin_port;
  220. //创建 wolfssl 需要的空间等配置
  221. if ( WOLFSSL_SUCCESS != wolfSSL_Init()) {
  222. printf("-------------- wolfssl init fail! --------------\n");
  223. goto exit;
  224. }
  225. //初始化 结构体 WOLFSSL_CTX
  226. if ((ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL) {
  227. printf("-------------- wolfSSL_CTX_new fail! --------------\n");
  228. goto exit;
  229. }
  230. //加载 CA 证书到 WOLFSSL_CTX
  231. if ( wolfSSL_CTX_load_verify_buffer(ctx, (unsigned char *)__ssl_root_certificate, \
  232. __ssl_root_certificate_len, WOLFSSL_FILETYPE_PEM) != SSL_SUCCESS) {
  233. printf("-------------- wolfSSL_CTX_load_verify_buffer fail! --------------\n");
  234. goto exit;
  235. }
  236. //进行域名解析
  237. server_ip = FreeRTOS_gethostbyname(s__host_name);
  238. if (server_ip == 0) {
  239. printf("-------------- FreeRTOS_gethostbyname fail! --------------\n");
  240. goto exit;
  241. }
  242. // 进行 socket 连接
  243. socket = FreeRTOS_socket(FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP);
  244. if (!socket)
  245. goto exit;
  246. servaddr.sin_port = htons(443);
  247. FreeRTOS_inet_pton(FREERTOS_AF_INET, FreeRTOS_inet_ntoa(server_ip, pucBuffer), &servaddr.sin_addr);
  248. /* Connect to socket file descriptor */
  249. if (0 > FreeRTOS_connect(socket, &servaddr, sizeof(servaddr))) {
  250. printf("-------------- https connect socket fail! --------------\n");
  251. goto exit;
  252. }
  253. //进行 SSL 的初始化
  254. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); // 尝试解决 -188, -155
  255. if ((ssl = wolfSSL_new(ctx)) == NULL) {
  256. printf("-------------- wolfSSL_new fail! --------------\n");
  257. goto exit;
  258. }
  259. //进行 SSL 和 socket 绑定
  260. if( WOLFSSL_SUCCESS != wolfSSL_set_fd(ssl, (int)socket)) {
  261. printf("-------------- wolfSSL_set_fd fail! --------------\n");
  262. goto exit;
  263. }
  264. //访问
  265. if (wolfSSL_write(ssl, http_head, strlen(http_head)) != strlen(http_head)) {
  266. printf("-------------- wolfSSL_write fail! --------------\n");
  267. goto exit;
  268. }
  269. //接收
  270. for(;;) {
  271. if (total_recv_len == 0)
  272. rbuf = (char *)pvPortRealloc(rbuf, pg_size);
  273. else
  274. rbuf = (char *)pvPortRealloc(rbuf, total_recv_len + pg_size);
  275. if (!rbuf) {
  276. printf("realloc fail!\n");
  277. goto exit;
  278. }
  279. if ((ContentLength > 0) && (content_start_pos > 0)) {
  280. if (((ContentLength + content_start_pos) - total_recv_len) >= pg_size) {
  281. recv_len = wolfSSL_read(ssl, rbuf + total_recv_len, pg_size);
  282. } else {
  283. recv_len = wolfSSL_read(ssl, rbuf + total_recv_len, ((ContentLength + content_start_pos) - total_recv_len));
  284. }
  285. } else {
  286. recv_len = wolfSSL_read(ssl, rbuf + total_recv_len, pg_size);
  287. }
  288. if(recv_len <= 0) {
  289. break;
  290. }
  291. total_recv_len += recv_len;
  292. if ((ContentLength > 0) && (content_start_pos > 0)) {
  293. if ((ContentLength + content_start_pos) <= total_recv_len)
  294. break;
  295. }
  296. if (ContentLength == -1) {
  297. ContentLength = https_get_content_length((const char *)rbuf, total_recv_len);
  298. if (ContentLength > 0)
  299. printf("ContentLength = %d\n", ContentLength);
  300. }
  301. if ((ContentLength > 0) && (content_start_pos == -1)) {
  302. content_start_pos = https_get_content_pos((const char *)rbuf, total_recv_len);
  303. if (content_start_pos > 0)
  304. printf("content_start_pos = %d\n", content_start_pos);
  305. }
  306. }
  307. printf("\n ========== \n\n");
  308. printf("https recv data : recv_len = 0x%x!\n",total_recv_len);
  309. printf("addr:0x%x\n", (uint32_t)rbuf);
  310. printf("\n ========== \n\n");
  311. exit:
  312. //释放空间
  313. if (ssl)
  314. wolfSSL_free(ssl); /* Free WOLFSSL object */
  315. if (ctx)
  316. wolfSSL_CTX_free(ctx); /* Free WOLFSSL_CTX object */
  317. wolfSSL_Cleanup(); /* Free wolfSSL */
  318. //关闭 socket
  319. if (socket)
  320. FreeRTOS_closesocket(socket);
  321. if (rbuf)
  322. vPortFree((void *)rbuf);
  323. return;
  324. }
  325. #else
  326. /* lwip includes. */
  327. #include "api.h"
  328. void https_client_test(void)
  329. {
  330. WOLFSSL_CTX* ctx = NULL;
  331. ip_addr_t server_ip ;
  332. err_t err = ERR_OK;
  333. int sockfd;
  334. struct sockaddr_in servaddr;
  335. WOLFSSL* ssl = NULL;
  336. char http_head[] = HTTPS_GET_API;
  337. int recv_len = 0;
  338. int total_recv_len = 0;
  339. char *rbuf = NULL;
  340. uint32_t pg_size = 1024 * 16;
  341. int ContentLength = -1;
  342. int content_start_pos = -1;
  343. //创建 wolfssl 需要的空间等配置
  344. if ( WOLFSSL_SUCCESS != wolfSSL_Init()) {
  345. printf("-------------- wolfssl init fail! --------------\n");
  346. goto exit;
  347. }
  348. //初始化 结构体 WOLFSSL_CTX
  349. if ((ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL) {
  350. printf("-------------- wolfSSL_CTX_new fail! --------------\n");
  351. goto exit;
  352. }
  353. //加载 CA 证书到 WOLFSSL_CTX
  354. if ( wolfSSL_CTX_load_verify_buffer(ctx, (unsigned char *)__ssl_root_certificate, \
  355. __ssl_root_certificate_len, WOLFSSL_FILETYPE_PEM) != SSL_SUCCESS) {
  356. printf("-------------- wolfSSL_CTX_load_verify_buffer fail! --------------\n");
  357. goto exit;
  358. }
  359. //进行域名解析
  360. err = netconn_gethostbyname(s__host_name, &server_ip);
  361. if (err != ERR_OK) {
  362. printf("-------------- netconn_gethostbyname fail! --------------\n");
  363. goto exit;
  364. }
  365. if (server_ip.addr == 0) {
  366. printf("-------------- DNS fail! --------------\n");
  367. goto exit;
  368. }
  369. // 进行 socket 连接
  370. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  371. if (sockfd < 0)
  372. goto exit;
  373. memset(&servaddr, sizeof(servaddr), 0);
  374. servaddr.sin_family = AF_INET;
  375. servaddr.sin_port = htons(443);
  376. inet_pton(AF_INET, inet_ntoa(server_ip), &servaddr.sin_addr);
  377. /* Connect to socket file descriptor */
  378. if (0 > connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr))) {
  379. printf("-------------- https connect socket fail! --------------\n");
  380. goto exit;
  381. }
  382. //进行 SSL 的初始化
  383. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); // 尝试解决 -188, -155
  384. if ((ssl = wolfSSL_new(ctx)) == NULL) {
  385. printf("-------------- wolfSSL_new fail! --------------\n");
  386. goto exit;
  387. }
  388. //进行 SSL 和 socket 绑定
  389. if( WOLFSSL_SUCCESS != wolfSSL_set_fd(ssl, sockfd)) {
  390. printf("-------------- wolfSSL_set_fd fail! --------------\n");
  391. goto exit;
  392. }
  393. //访问
  394. if (wolfSSL_write(ssl, http_head, strlen(http_head)) != strlen(http_head)) {
  395. printf("-------------- wolfSSL_write fail! --------------\n");
  396. goto exit;
  397. }
  398. //接收
  399. for(;;) {
  400. if (total_recv_len == 0)
  401. rbuf = (char *)pvPortRealloc(rbuf, pg_size);
  402. else
  403. rbuf = (char *)pvPortRealloc(rbuf, total_recv_len + pg_size);
  404. if (!rbuf) {
  405. printf("realloc fail!\n");
  406. goto exit;
  407. }
  408. if ((ContentLength > 0) && (content_start_pos > 0)) {
  409. if (((ContentLength + content_start_pos) - total_recv_len) >= pg_size) {
  410. recv_len = wolfSSL_read(ssl, rbuf + total_recv_len, pg_size);
  411. } else {
  412. recv_len = wolfSSL_read(ssl, rbuf + total_recv_len, ((ContentLength + content_start_pos) - total_recv_len));
  413. }
  414. } else {
  415. recv_len = wolfSSL_read(ssl, rbuf + total_recv_len, pg_size);
  416. }
  417. if(recv_len <= 0) {
  418. break;
  419. }
  420. total_recv_len += recv_len;
  421. if ((ContentLength > 0) && (content_start_pos > 0)) {
  422. if ((ContentLength + content_start_pos) <= total_recv_len)
  423. break;
  424. }
  425. if (ContentLength == -1) {
  426. ContentLength = https_get_content_length((const char *)rbuf, total_recv_len);
  427. if (ContentLength > 0)
  428. printf("ContentLength = %d\n", ContentLength);
  429. }
  430. if ((ContentLength > 0) && (content_start_pos == -1)) {
  431. content_start_pos = https_get_content_pos((const char *)rbuf, total_recv_len);
  432. if (content_start_pos > 0)
  433. printf("content_start_pos = %d\n", content_start_pos);
  434. }
  435. }
  436. printf("\n ========== \n\n");
  437. printf("https recv data : recv_len = 0x%x\n",total_recv_len);
  438. printf("addr:0x%x\n", (uint32_t)rbuf);
  439. printf("\n ========== \n\n");
  440. exit:
  441. //释放空间
  442. if (ssl)
  443. wolfSSL_free(ssl); /* Free WOLFSSL object */
  444. if (ctx)
  445. wolfSSL_CTX_free(ctx); /* Free WOLFSSL_CTX object */
  446. wolfSSL_Cleanup(); /* Free wolfSSL */
  447. //关闭 socket
  448. if (sockfd != -1)
  449. closesocket(sockfd);
  450. if (rbuf)
  451. vPortFree((void *)rbuf);
  452. return;
  453. }
  454. #endif