summaryrefslogtreecommitdiff
path: root/shared-bindings/socketpool/SocketPool.c
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2020-08-12 16:57:39 -0700
committerScott Shawcroft <scott@tannewt.org>2020-08-19 14:23:18 -0700
commiteb2c38825edfe28007c2bc6c37bdb0a3269f27e7 (patch)
tree397500b58db0cf91e067901041d619b2342d0d32 /shared-bindings/socketpool/SocketPool.c
parentc9ece21c2846d57f3c32b364be1209d884e388b1 (diff)
HTTP works with my adafruit_requests
Diffstat (limited to 'shared-bindings/socketpool/SocketPool.c')
-rw-r--r--shared-bindings/socketpool/SocketPool.c128
1 files changed, 58 insertions, 70 deletions
diff --git a/shared-bindings/socketpool/SocketPool.c b/shared-bindings/socketpool/SocketPool.c
index ed5ff8275..2be071c78 100644
--- a/shared-bindings/socketpool/SocketPool.c
+++ b/shared-bindings/socketpool/SocketPool.c
@@ -33,6 +33,7 @@
#include "py/runtime.h"
#include "py/mperrno.h"
+#include "shared-bindings/ipaddress/__init__.h"
#include "shared-bindings/socketpool/Socket.h"
#include "shared-bindings/socketpool/SocketPool.h"
@@ -45,6 +46,8 @@ STATIC mp_obj_t socketpool_socketpool_make_new(const mp_obj_type_t *type, size_t
socketpool_socketpool_obj_t *s = m_new_obj_with_finaliser(socketpool_socketpool_obj_t);
s->base.type = &socketpool_socketpool_type;
+ // common_hal_socketpool_socketpool_construct(s, );
+
return MP_OBJ_FROM_PTR(s);
}
@@ -58,31 +61,22 @@ STATIC mp_obj_t socketpool_socketpool_make_new(const mp_obj_type_t *type, size_t
//| ...
//|
STATIC mp_obj_t socketpool_socketpool_socket(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
- mp_arg_check_num(n_args, kw_args, 0, 4, false);
-
- // create socket object (not bound to any NIC yet)
- socketpool_socket_obj_t *s = m_new_obj_with_finaliser(socketpool_socket_obj_t);
- s->base.type = &socketpool_socket_type;
- // s->nic = MP_OBJ_NULL;
- // s->nic_type = NULL;
- // s->u_param.domain = MOD_NETWORK_AF_INET;
- // s->u_param.type = MOD_NETWORK_SOCK_STREAM;
- // s->u_param.fileno = -1;
- // if (n_args >= 1) {
- // s->u_param.domain = mp_obj_get_int(args[0]);
- // if (n_args >= 2) {
- // s->u_param.type = mp_obj_get_int(args[1]);
- // if (n_args >= 4) {
- // s->u_param.fileno = mp_obj_get_int(args[3]);
- // }
- // }
- // }
-
- return MP_OBJ_FROM_PTR(s);
+ mp_arg_check_num(n_args, kw_args, 0, 5, false);
+
+ socketpool_socketpool_obj_t *self = pos_args[0];
+ socketpool_socketpool_addressfamily_t family = SOCKETPOOL_AF_INET;
+ socketpool_socketpool_sock_t type = SOCKETPOOL_SOCK_STREAM;
+ if (n_args >= 2) {
+ family = mp_obj_get_int(pos_args[1]);
+ if (n_args >= 3) {
+ type = mp_obj_get_int(pos_args[2]);
+ }
+ }
+ return common_hal_socketpool_socket(self, family, type);
}
MP_DEFINE_CONST_FUN_OBJ_KW(socketpool_socketpool_socket_obj, 1, socketpool_socketpool_socket);
-//| def getaddrinfo(host: str, port: int) -> tuple:
+//| def getaddrinfo(host: str, port: int, family: int = 0, type: int = 0, proto: int = 0, flags: int = 0) -> tuple:
//| """Gets the address information for a hostname and port
//|
//| Returns the appropriate family, socket type, socket protocol and
@@ -91,55 +85,49 @@ MP_DEFINE_CONST_FUN_OBJ_KW(socketpool_socketpool_socket_obj, 1, socketpool_socke
//| ...
//|
-STATIC mp_obj_t socketpool_socketpool_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
- // size_t hlen;
- // const char *host = mp_obj_str_get_data(host_in, &hlen);
- // mp_int_t port = mp_obj_get_int(port_in);
- // uint8_t out_ip[MOD_NETWORK_IPADDR_BUF_SIZE];
- // bool have_ip = false;
-
- // if (hlen > 0) {
- // // check if host is already in IP form
- // nlr_buf_t nlr;
- // if (nlr_push(&nlr) == 0) {
- // netutils_parse_ipv4_addr(host_in, out_ip, NETUTILS_BIG);
- // have_ip = true;
- // nlr_pop();
- // } else {
- // // swallow exception: host was not in IP form so need to do DNS lookup
- // }
- // }
-
- // if (!have_ip) {
- // // find a NIC that can do a name lookup
- // for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) {
- // mp_obj_t nic = MP_STATE_PORT(mod_network_nic_list).items[i];
- // mod_network_nic_type_t *nic_type = (mod_network_nic_type_t*)mp_obj_get_type(nic);
- // if (nic_type->gethostbyname != NULL) {
- // int ret = nic_type->gethostbyname(nic, host, hlen, out_ip);
- // if (ret != 0) {
- // mp_raise_OSError(ret);
- // }
- // have_ip = true;
- // break;
- // }
- // }
- // }
-
- // if (!have_ip) {
- // nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, translate("no available NIC")));
- // }
-
- // mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL));
- // tuple->items[0] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_AF_INET);
- // tuple->items[1] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_STREAM);
- // tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
- // tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_);
- // tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG);
- // return mp_obj_new_list(1, (mp_obj_t*)&tuple);
- return mp_const_none;
+STATIC mp_obj_t socketpool_socketpool_getaddrinfo(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_host, ARG_port, ARG_family, ARG_type, ARG_proto, ARG_flags };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_host, MP_ARG_OBJ | MP_ARG_REQUIRED },
+ { MP_QSTR_port, MP_ARG_INT | MP_ARG_REQUIRED },
+ { MP_QSTR_family, MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_type, MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_port, MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_flags, MP_ARG_INT, {.u_int = 0} },
+ };
+ socketpool_socketpool_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ const char *host = mp_obj_str_get_str(args[ARG_host].u_obj);
+ mp_int_t port = args[ARG_port].u_int;
+ mp_obj_t ip_str = mp_const_none;
+
+ if (strlen(host) > 0 && ipaddress_parse_ipv4address(host, strlen(host), NULL)) {
+ ip_str = args[ARG_host].u_obj;
+ }
+
+ if (ip_str == mp_const_none) {
+ ip_str = common_hal_socketpool_socketpool_gethostbyname(self, host);
+ }
+
+ if (ip_str == mp_const_none) {
+ mp_raise_OSError(0);
+ }
+
+ mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL));
+ tuple->items[0] = MP_OBJ_NEW_SMALL_INT(SOCKETPOOL_AF_INET);
+ tuple->items[1] = MP_OBJ_NEW_SMALL_INT(SOCKETPOOL_SOCK_STREAM);
+ tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
+ tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_);
+ mp_obj_tuple_t *sockaddr = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
+ sockaddr->items[0] = ip_str;
+ sockaddr->items[1] = MP_OBJ_NEW_SMALL_INT(port);
+ tuple->items[4] = MP_OBJ_FROM_PTR(sockaddr);
+ return mp_obj_new_list(1, (mp_obj_t*)&tuple);
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socketpool_getaddrinfo_obj, socketpool_socketpool_getaddrinfo);
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(socketpool_socketpool_getaddrinfo_obj, 3, socketpool_socketpool_getaddrinfo);
STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&socketpool_socketpool_socket_obj) },