requests-test.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #include "test_common.h"
  2. /*
  3. * Copyright (c) 2006-2022, RT-Thread Development Team
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2018-08-03 chenyong the first version
  10. */
  11. extern "C" {
  12. #include "../pikascript-lib/requests/webclient.h"
  13. #define GET_HEADER_BUFSZ 1024
  14. #define GET_RESP_BUFSZ 1024
  15. #define GET_LOCAL_URI "http://www.rt-thread.com/service/rt-thread.txt"
  16. /* send HTTP GET request by common request interface, it used to receive
  17. * longer data */
  18. static int webclient_get_comm(const char* uri) {
  19. struct webclient_session* session = RT_NULL;
  20. unsigned char* buffer = RT_NULL;
  21. int index = 0;
  22. int ret = 0;
  23. int bytes_read, resp_status;
  24. int content_length = -1;
  25. buffer = (unsigned char*)web_malloc(GET_RESP_BUFSZ);
  26. if (buffer == RT_NULL) {
  27. rt_kprintf("no memory for receive buffer.\n");
  28. ret = -RT_ENOMEM;
  29. goto __exit;
  30. }
  31. /* create webclient session and set header response size */
  32. session = webclient_session_create(GET_HEADER_BUFSZ);
  33. if (session == RT_NULL) {
  34. ret = -RT_ENOMEM;
  35. goto __exit;
  36. }
  37. /* send GET request by default header */
  38. if ((resp_status = webclient_get(session, uri)) != 200) {
  39. rt_kprintf("webclient GET request failed, response(%d) error.\n",
  40. resp_status);
  41. ret = -RT_ERROR;
  42. goto __exit;
  43. }
  44. rt_kprintf("webclient get response data: \n");
  45. content_length = webclient_content_length_get(session);
  46. if (content_length < 0) {
  47. rt_kprintf("webclient GET request type is chunked.\n");
  48. do {
  49. bytes_read = webclient_read(session, (void*)buffer, GET_RESP_BUFSZ);
  50. if (bytes_read <= 0) {
  51. break;
  52. }
  53. for (index = 0; index < bytes_read; index++) {
  54. rt_kprintf("%c", buffer[index]);
  55. }
  56. } while (1);
  57. rt_kprintf("\n");
  58. } else {
  59. int content_pos = 0;
  60. do {
  61. bytes_read =
  62. webclient_read(session, (void*)buffer,
  63. content_length - content_pos > GET_RESP_BUFSZ
  64. ? GET_RESP_BUFSZ
  65. : content_length - content_pos);
  66. if (bytes_read <= 0) {
  67. break;
  68. }
  69. for (index = 0; index < bytes_read; index++) {
  70. rt_kprintf("%c", buffer[index]);
  71. }
  72. content_pos += bytes_read;
  73. } while (content_pos < content_length);
  74. rt_kprintf("\n");
  75. }
  76. __exit:
  77. if (session) {
  78. webclient_close(session);
  79. }
  80. if (buffer) {
  81. web_free(buffer);
  82. }
  83. return ret;
  84. }
  85. /* send HTTP GET request by simplify request interface, it used to received
  86. * shorter data */
  87. static int webclient_get_smpl(const char* uri) {
  88. char* response = RT_NULL;
  89. size_t resp_len = 0;
  90. int index;
  91. if (webclient_request(uri, RT_NULL, RT_NULL, 0, (void**)&response,
  92. &resp_len) < 0) {
  93. rt_kprintf("webclient send get request failed.");
  94. return -RT_ERROR;
  95. }
  96. rt_kprintf("webclient send get request by simplify request interface.\n");
  97. rt_kprintf("webclient get response data: \n");
  98. for (index = 0; index < (int)strlen(response); index++) {
  99. rt_kprintf("%c", response[index]);
  100. }
  101. rt_kprintf("\n");
  102. if (response) {
  103. web_free(response);
  104. }
  105. return 0;
  106. }
  107. int webclient_get_test(int argc, char** argv) {
  108. char* uri = RT_NULL;
  109. if (argc == 1) {
  110. uri = web_strdup(GET_LOCAL_URI);
  111. if (uri == RT_NULL) {
  112. rt_kprintf("no memory for create get request uri buffer.\n");
  113. return -RT_ENOMEM;
  114. }
  115. if (RT_EOK != webclient_get_comm(uri)) {
  116. return -RT_EIO;
  117. }
  118. } else if (argc == 2) {
  119. if (strcmp(argv[1], "-s") == 0) {
  120. uri = web_strdup(GET_LOCAL_URI);
  121. if (uri == RT_NULL) {
  122. rt_kprintf("no memory for create get request uri buffer.\n");
  123. return -RT_ENOMEM;
  124. }
  125. if (RT_EOK != webclient_get_smpl(uri)) {
  126. return -RT_EIO;
  127. }
  128. } else {
  129. uri = web_strdup(argv[1]);
  130. if (uri == RT_NULL) {
  131. rt_kprintf("no memory for create get request uri buffer.\n");
  132. return -RT_ENOMEM;
  133. }
  134. if (RT_EOK != webclient_get_comm(uri)) {
  135. return RT_EIO;
  136. }
  137. }
  138. } else if (argc == 3 && strcmp(argv[1], "-s") == 0) {
  139. uri = web_strdup(argv[2]);
  140. if (uri == RT_NULL) {
  141. rt_kprintf("no memory for create get request uri buffer.\n");
  142. return -RT_ENOMEM;
  143. }
  144. if (RT_EOK != webclient_get_smpl(uri)) {
  145. return -RT_EIO;
  146. }
  147. } else {
  148. rt_kprintf("web_get_test [URI] - webclient GET request test.\n");
  149. rt_kprintf(
  150. "web_get_test -s [URI] - webclient simplify GET request "
  151. "test.\n");
  152. return -RT_ERROR;
  153. }
  154. if (uri) {
  155. web_free(uri);
  156. }
  157. return RT_EOK;
  158. }
  159. }
  160. #if !PIKA_NANO_ENABLE
  161. // TEST(requests, webclient_get) {
  162. // char* argv1[] = {"test", "http://www.pikapython.com/index.html"};
  163. // EXPECT_EQ(webclient_get_test(2, argv1), 0);
  164. // char* argv2[] = {"test", "-s",
  165. // "http://www.pikapython.com/index.html"};
  166. // EXPECT_EQ(webclient_get_test(3, argv2), 0);
  167. // }
  168. // TEST(requests, get) {
  169. // PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  170. // extern unsigned char pikaModules_py_a[];
  171. // obj_linkLibrary(pikaMain, pikaModules_py_a);
  172. // obj_run(
  173. // pikaMain,
  174. // "import requests\n"
  175. // "r = requests.get('http://www.pikapython.com/index.html')\n");
  176. // /* assert */
  177. // // EXPECT_STREQ(
  178. // // obj_getStr(pikaMain, "r.text"),
  179. // // "RT-Thread is an open source IoT operating system from China,
  180. // which "
  181. // // "has strong scalability: from a tiny kernel running on a tiny
  182. // core, "
  183. // // "for example ARM Cortex-M0, or Cortex-M3/4/7, to a rich feature
  184. // system "
  185. // // "running on MIPS32, ARM Cortex-A8, ARM Cortex-A9 DualCore
  186. // etc.\r\n");
  187. // /* deinit */
  188. // obj_deinit(pikaMain);
  189. // EXPECT_EQ(pikaMemNow(), 0);
  190. // }
  191. // TEST(requests, append_params_to_url) {
  192. // PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  193. // extern unsigned char pikaModules_py_a[];
  194. // obj_linkLibrary(pikaMain, pikaModules_py_a);
  195. // pikaVM_runSingleFile(pikaMain,
  196. // "test/python/requests/requests_encode.py");
  197. // /* assert */
  198. // EXPECT_STREQ(log_buff[1], "'http://www.rt-thread.com?b=2&a=1'\r\n");
  199. // EXPECT_STREQ(log_buff[0], "'http://www.rt-thread.com?b=%25&a=+'\r\n");
  200. // /* deinit */
  201. // obj_deinit(pikaMain);
  202. // EXPECT_EQ(pikaMemNow(), 0);
  203. // }
  204. // TEST(requests, std_request) {
  205. // PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  206. // extern unsigned char pikaModules_py_a[];
  207. // obj_linkLibrary(pikaMain, pikaModules_py_a);
  208. // pikaVM_runSingleFile(pikaMain,
  209. // "test/python/requests/requests_encode.py");
  210. // /* assert */
  211. // EXPECT_STREQ(log_buff[2], "HTTP/1.1 200 OK\r\n");
  212. // /* deinit */
  213. // obj_deinit(pikaMain);
  214. // EXPECT_EQ(pikaMemNow(), 0);
  215. // }
  216. // TEST(requests, get_gitee) {
  217. // PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  218. // extern unsigned char pikaModules_py_a[];
  219. // obj_linkLibrary(pikaMain, pikaModules_py_a);
  220. // pikaVM_runSingleFile(pikaMain, "test/python/requests/gitee_issue.py");
  221. // /* assert */
  222. // EXPECT_STREQ(log_buff[1], "'http://www.rt-thread.com?b=2&a=1'\r\n");
  223. // EXPECT_STREQ(log_buff[0], "'http://www.rt-thread.com?b=%25&a=+'\r\n");
  224. // /* deinit */
  225. // obj_deinit(pikaMain);
  226. // EXPECT_EQ(pikaMemNow(), 0);
  227. // }
  228. TEST(requests, get_basic) {
  229. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  230. extern unsigned char pikaModules_py_a[];
  231. obj_linkLibrary(pikaMain, pikaModules_py_a);
  232. pikaVM_runSingleFile(pikaMain, "test/python/requests/get_basic.py");
  233. /* assert */
  234. EXPECT_STREQ(log_buff[2], "HTTP/1.1 200 OK\r\n");
  235. /* deinit */
  236. obj_deinit(pikaMain);
  237. EXPECT_EQ(pikaMemNow(), 0);
  238. }
  239. //! Enable it manually if needed
  240. #if 1
  241. TEST(requests, post_data) {
  242. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  243. extern unsigned char pikaModules_py_a[];
  244. obj_linkLibrary(pikaMain, pikaModules_py_a);
  245. pikaVM_runSingleFile(pikaMain, "test/python/requests/post_data.py");
  246. /* assert */
  247. EXPECT_STREQ(log_buff[2], "HTTP/1.1 200 OK\r\n");
  248. /* deinit */
  249. obj_deinit(pikaMain);
  250. EXPECT_EQ(pikaMemNow(), 0);
  251. }
  252. #endif
  253. #endif