requests-test.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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 longer
  17. * 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 test.\n");
  151. return -RT_ERROR;
  152. }
  153. if (uri) {
  154. web_free(uri);
  155. }
  156. return RT_EOK;
  157. }
  158. }
  159. #if !PIKA_NANO_ENABLE
  160. TEST(requests, webclient_get) {
  161. char* argv1[] = {"test", "http://www.rt-thread.com/service/rt-thread.txt"};
  162. EXPECT_EQ(webclient_get_test(2, argv1), 0);
  163. char* argv2[] = {"test", "-s",
  164. "http://www.rt-thread.com/service/rt-thread.txt"};
  165. EXPECT_EQ(webclient_get_test(3, argv2), 0);
  166. }
  167. TEST(requests, get) {
  168. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  169. extern unsigned char pikaModules_py_a[];
  170. obj_linkLibrary(pikaMain, pikaModules_py_a);
  171. obj_run(
  172. pikaMain,
  173. "import requests\n"
  174. "r = requests.get('http://www.rt-thread.com/service/rt-thread.txt')\n");
  175. /* assert */
  176. EXPECT_STREQ(
  177. obj_getStr(pikaMain, "r.text"),
  178. "RT-Thread is an open source IoT operating system from China, which "
  179. "has strong scalability: from a tiny kernel running on a tiny core, "
  180. "for example ARM Cortex-M0, or Cortex-M3/4/7, to a rich feature system "
  181. "running on MIPS32, ARM Cortex-A8, ARM Cortex-A9 DualCore etc.\r\n");
  182. /* deinit */
  183. obj_deinit(pikaMain);
  184. EXPECT_EQ(pikaMemNow(), 0);
  185. }
  186. // TEST(requests, append_params_to_url) {
  187. // PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  188. // extern unsigned char pikaModules_py_a[];
  189. // obj_linkLibrary(pikaMain, pikaModules_py_a);
  190. // pikaVM_runSingleFile(pikaMain, "test/python/requests/requests_encode.py");
  191. // /* assert */
  192. // EXPECT_STREQ(log_buff[1], "'http://www.rt-thread.com?b=2&a=1'\r\n");
  193. // EXPECT_STREQ(log_buff[0], "'http://www.rt-thread.com?b=%25&a=+'\r\n");
  194. // /* deinit */
  195. // obj_deinit(pikaMain);
  196. // EXPECT_EQ(pikaMemNow(), 0);
  197. // }
  198. TEST(requests, std_request) {
  199. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  200. extern unsigned char pikaModules_py_a[];
  201. obj_linkLibrary(pikaMain, pikaModules_py_a);
  202. pikaVM_runSingleFile(pikaMain, "test/python/requests/requests_encode.py");
  203. /* assert */
  204. EXPECT_STREQ(log_buff[2], "HTTP/1.1 200 OK\r\n");
  205. /* deinit */
  206. obj_deinit(pikaMain);
  207. EXPECT_EQ(pikaMemNow(), 0);
  208. }
  209. // TEST(requests, get_gitee) {
  210. // PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  211. // extern unsigned char pikaModules_py_a[];
  212. // obj_linkLibrary(pikaMain, pikaModules_py_a);
  213. // pikaVM_runSingleFile(pikaMain, "test/python/requests/gitee_issue.py");
  214. // /* assert */
  215. // EXPECT_STREQ(log_buff[1], "'http://www.rt-thread.com?b=2&a=1'\r\n");
  216. // EXPECT_STREQ(log_buff[0], "'http://www.rt-thread.com?b=%25&a=+'\r\n");
  217. // /* deinit */
  218. // obj_deinit(pikaMain);
  219. // EXPECT_EQ(pikaMemNow(), 0);
  220. // }
  221. TEST(requests, get_basic) {
  222. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  223. extern unsigned char pikaModules_py_a[];
  224. obj_linkLibrary(pikaMain, pikaModules_py_a);
  225. pikaVM_runSingleFile(pikaMain, "test/python/requests/get_basic.py");
  226. /* assert */
  227. EXPECT_STREQ(log_buff[2], "HTTP/1.1 200 OK\r\n");
  228. /* deinit */
  229. obj_deinit(pikaMain);
  230. EXPECT_EQ(pikaMemNow(), 0);
  231. }
  232. //! Enable it manually if needed
  233. #if 0
  234. TEST(requests, post_data) {
  235. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  236. extern unsigned char pikaModules_py_a[];
  237. obj_linkLibrary(pikaMain, pikaModules_py_a);
  238. pikaVM_runSingleFile(pikaMain, "test/python/requests/post_data.py");
  239. /* assert */
  240. EXPECT_STREQ(log_buff[2], "HTTP/1.1 200 OK\r\n");
  241. /* deinit */
  242. obj_deinit(pikaMain);
  243. EXPECT_EQ(pikaMemNow(), 0);
  244. }
  245. #endif
  246. #endif