Преглед на файлове

add python layer for requests to connnect url

lyon преди 3 години
родител
ревизия
5bb24375ae

+ 10 - 0
examples/requests/requests_encode.py

@@ -0,0 +1,10 @@
+import requests
+requests._append_params_to_url('http://www.rt-thread.com', {
+    'a': 1,
+    'b': 2
+})
+
+requests._append_params_to_url('http://www.rt-thread.com', {
+    'a': ' ',
+    'b': '%',
+})

+ 30 - 11
package/requests/requests.c → package/requests/_requests.c

@@ -1,15 +1,13 @@
-#include "requests.h"
-#include "requests_Response.h"
+#include "_requests.h"
+#include <ctype.h>
+#include "_requests_Response.h"
 #include "webclient.h"
 
 #define GET_HEADER_BUFSZ 1024
 #define GET_RESP_BUFSZ 1024
 
-PikaObj* requests_request(PikaObj* self,
-                          char* method,
-                          char* url,
-                          PikaDict* kwargs) {
-    PikaObj* response = newNormalObj(New_requests_Response);
+PikaObj* _requests_request(PikaObj* self, char* method, char* url) {
+    PikaObj* response = newNormalObj(New__requests_Response);
     obj_setStr(response, "url", url);
 
     struct webclient_session* session = RT_NULL;
@@ -88,10 +86,31 @@ __exit:
     return response;
 }
 
-PikaObj* requests_get(PikaObj* self, char* url, PikaDict* kwargs) {
-    return requests_request(self, "GET", url, kwargs);
+char to_hex(char code) {
+    static char hex[] = "0123456789abcdef";
+    return hex[code & 15];
 }
 
-void requests___del__(PikaObj* self) {}
+char* _requests_urlencode(PikaObj* self, char* s) {
+    obj_setBytes(self, "encodebuff", NULL, strlen(s) * 3 + 1);
+    char* result = (char*)obj_getBytes(self, "encodebuff");
+    char* p = result;
+    while (*s) {
+        if (isalnum(*s) || *s == '-' || *s == '_' || *s == '.' || *s == '~') {
+            *p++ = *s;
+        } else if (*s == ' ') {
+            *p++ = '+';
+        } else {
+            *p++ = '%';
+            *p++ = to_hex(*s >> 4);
+            *p++ = to_hex(*s & 0xf);
+        }
+        s++;
+    }
+    *p = '\0';
+    return result;
+}
+
+void _requests___del__(PikaObj* self) {}
 
-void requests___init__(PikaObj* self) {}
+void _requests___init__(PikaObj* self) {}

+ 2 - 3
port/linux/package/pikascript/requests.pyi → package/requests/_requests.pyi

@@ -8,10 +8,9 @@ class Response:
     def json(self) -> dict: ...
 
 
-def request(method: str, url: str, **kwargs) -> Response: ...
+def request(method: str, url: str) -> Response: ...
 
-
-def get(url: str, **kwargs) -> Response: ...
+def urlencode(s: str) -> str: ...
 
 
 def __init__(): ...

+ 6 - 0
package/requests/_requests_Response.c

@@ -0,0 +1,6 @@
+#include "_requests_Response.h"
+
+PikaObj* _requests_Response_json(PikaObj* self) {
+    /* TODO */
+    return NULL;
+}

+ 36 - 0
package/requests/requests.py

@@ -0,0 +1,36 @@
+import _requests
+
+
+class Response(_requests.Response):
+    ...
+
+
+def _append_params_to_url(url: str, params: dict) -> str:
+    if params is None:
+        return url
+    if '?' in url:
+        url += '&'
+    else:
+        url += '?'
+    for k, v in params.items():
+        k = _requests.urlencode(str(k))
+        v = _requests.urlencode(str(v))
+        url += '%s=%s&' % (k, v)
+    return url[:-1]
+
+
+def request(method: str, url: str, params=None) -> Response:
+    url = _append_params_to_url(url, params)
+    return _requests.request(method, url)
+
+
+def get(url: str, params=None) -> Response:
+    return request('GET', url, params)
+
+
+def __init__():
+    _requests.__init__()
+
+
+def __del__():
+    _requests.__del__()

+ 0 - 6
package/requests/requests_Response.c

@@ -1,6 +0,0 @@
-#include "requests_Response.h"
-
-PikaObj* requests_Response_json(PikaObj* self) {
-    /* TODO */
-    return NULL;
-}

+ 1 - 1
port/linux/.vscode/launch.json

@@ -11,7 +11,7 @@
             "program": "${workspaceFolder}/build/test/pikascript_test",
             // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
             "args": [
-            //    "--gtest_filter=mqtt.init"
+            //    "--gtest_filter=pikaMain.slice_a90"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 2 - 3
package/requests/requests.pyi → port/linux/package/pikascript/_requests.pyi

@@ -8,10 +8,9 @@ class Response:
     def json(self) -> dict: ...
 
 
-def request(method: str, url: str, **kwargs) -> Response: ...
+def request(method: str, url: str) -> Response: ...
 
-
-def get(url: str, **kwargs) -> Response: ...
+def urlencode(s: str) -> str: ...
 
 
 def __init__(): ...

+ 5 - 1
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_String.c

@@ -86,8 +86,12 @@ char* string_slice(Args* outBuffs, char* str, int start, int end) {
     if (start < 0) {
         start += string_len(str);
     }
+    /* magic code, to the end */
+    if (end == -99999) {
+        end = string_len(str);
+    }
     if (end < 0) {
-        end += string_len(str) + 1;
+        end += string_len(str);
     }
     for (int i = start; i < end; i++) {
         char char_buff[5] = {0};

+ 30 - 11
port/linux/package/pikascript/pikascript-lib/requests/requests.c → port/linux/package/pikascript/pikascript-lib/requests/_requests.c

@@ -1,15 +1,13 @@
-#include "requests.h"
-#include "requests_Response.h"
+#include "_requests.h"
+#include <ctype.h>
+#include "_requests_Response.h"
 #include "webclient.h"
 
 #define GET_HEADER_BUFSZ 1024
 #define GET_RESP_BUFSZ 1024
 
-PikaObj* requests_request(PikaObj* self,
-                          char* method,
-                          char* url,
-                          PikaDict* kwargs) {
-    PikaObj* response = newNormalObj(New_requests_Response);
+PikaObj* _requests_request(PikaObj* self, char* method, char* url) {
+    PikaObj* response = newNormalObj(New__requests_Response);
     obj_setStr(response, "url", url);
 
     struct webclient_session* session = RT_NULL;
@@ -88,10 +86,31 @@ __exit:
     return response;
 }
 
-PikaObj* requests_get(PikaObj* self, char* url, PikaDict* kwargs) {
-    return requests_request(self, "GET", url, kwargs);
+char to_hex(char code) {
+    static char hex[] = "0123456789abcdef";
+    return hex[code & 15];
 }
 
-void requests___del__(PikaObj* self) {}
+char* _requests_urlencode(PikaObj* self, char* s) {
+    obj_setBytes(self, "encodebuff", NULL, strlen(s) * 3 + 1);
+    char* result = (char*)obj_getBytes(self, "encodebuff");
+    char* p = result;
+    while (*s) {
+        if (isalnum(*s) || *s == '-' || *s == '_' || *s == '.' || *s == '~') {
+            *p++ = *s;
+        } else if (*s == ' ') {
+            *p++ = '+';
+        } else {
+            *p++ = '%';
+            *p++ = to_hex(*s >> 4);
+            *p++ = to_hex(*s & 0xf);
+        }
+        s++;
+    }
+    *p = '\0';
+    return result;
+}
+
+void _requests___del__(PikaObj* self) {}
 
-void requests___init__(PikaObj* self) {}
+void _requests___init__(PikaObj* self) {}

+ 6 - 0
port/linux/package/pikascript/pikascript-lib/requests/_requests_Response.c

@@ -0,0 +1,6 @@
+#include "_requests_Response.h"
+
+PikaObj* _requests_Response_json(PikaObj* self) {
+    /* TODO */
+    return NULL;
+}

+ 0 - 6
port/linux/package/pikascript/pikascript-lib/requests/requests_Response.c

@@ -1,6 +0,0 @@
-#include "requests_Response.h"
-
-PikaObj* requests_Response_json(PikaObj* self) {
-    /* TODO */
-    return NULL;
-}

+ 36 - 0
port/linux/package/pikascript/requests.py

@@ -0,0 +1,36 @@
+import _requests
+
+
+class Response(_requests.Response):
+    ...
+
+
+def _append_params_to_url(url: str, params: dict) -> str:
+    if params is None:
+        return url
+    if '?' in url:
+        url += '&'
+    else:
+        url += '?'
+    for k, v in params.items():
+        k = _requests.urlencode(str(k))
+        v = _requests.urlencode(str(v))
+        url += '%s=%s&' % (k, v)
+    return url[:-1]
+
+
+def request(method: str, url: str, params=None) -> Response:
+    url = _append_params_to_url(url, params)
+    return _requests.request(method, url)
+
+
+def get(url: str, params=None) -> Response:
+    return request('GET', url, params)
+
+
+def __init__():
+    _requests.__init__()
+
+
+def __del__():
+    _requests.__del__()

+ 15 - 0
test/VM-test.cpp

@@ -2267,4 +2267,19 @@ TEST(VM, bc_fn_file_cb2) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
+TEST(vm, slice_str_end) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    /* run */
+    __platform_printf("BEGIN\r\n");
+    obj_run(pikaMain, "'test'[:-1]");
+    /* collect */
+    /* assert */
+    EXPECT_STREQ(log_buff[0], "'tes'\r\n");
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
 TEST_END

+ 1 - 1
test/parse-test.cpp

@@ -2962,7 +2962,7 @@ TEST(parser, slice_oifjlk) {
                  "B0\n"
                  "1 REF b\n"
                  "1 NUM 6\n"
-                 "2 NUM 1\n"
+                 "2 NUM 99999\n"
                  "1 OPT -\n"
                  "0 SLC \n"
                  "0 OUT a\n"

+ 2 - 2
test/pikaMain-test.cpp

@@ -2117,7 +2117,7 @@ TEST(pikaMain, slice_eei) {
     __platform_printf("BEGIN\r\n");
     obj_run(self, "'test'[1:-1]\n");
     /* assert */
-    EXPECT_STREQ(log_buff[0], "'est'\r\n");
+    EXPECT_STREQ(log_buff[0], "'es'\r\n");
     EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
     /* deinit */
     obj_deinit(self);
@@ -2134,7 +2134,7 @@ TEST(pikaMain, slice_a97) {
     __platform_printf("BEGIN\r\n");
     obj_run(self, "'test'[:-2]\n");
     /* assert */
-    EXPECT_STREQ(log_buff[0], "'tes'\r\n");
+    EXPECT_STREQ(log_buff[0], "'te'\r\n");
     EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
     /* deinit */
     obj_deinit(self);

+ 10 - 0
test/python/requests/requests_encode.py

@@ -0,0 +1,10 @@
+import requests
+requests._append_params_to_url('http://www.rt-thread.com', {
+    'a': 1,
+    'b': 2
+})
+
+requests._append_params_to_url('http://www.rt-thread.com', {
+    'a': ' ',
+    'b': '%',
+})

+ 13 - 0
test/requests-test.cpp

@@ -214,3 +214,16 @@ TEST(requests, get) {
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
 }
+
+TEST(requests, append_params_to_url) {
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    extern unsigned char pikaModules_py_a[];
+    obj_linkLibrary(pikaMain, pikaModules_py_a);
+    pikaVM_runSingleFile(pikaMain, "test/python/requests/requests_encode.py");
+    /* assert */
+    EXPECT_STREQ(log_buff[1], "'http://www.rt-thread.com?b=2&a=1'\r\n");
+    EXPECT_STREQ(log_buff[0], "'http://www.rt-thread.com?b=%25&a=+'\r\n");
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}