summaryrefslogtreecommitdiff
path: root/shared-bindings/socketpool
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
parentc9ece21c2846d57f3c32b364be1209d884e388b1 (diff)
HTTP works with my adafruit_requests
Diffstat (limited to 'shared-bindings/socketpool')
-rw-r--r--shared-bindings/socketpool/Socket.c495
-rw-r--r--shared-bindings/socketpool/Socket.h7
-rw-r--r--shared-bindings/socketpool/SocketPool.c128
-rw-r--r--shared-bindings/socketpool/SocketPool.h13
4 files changed, 313 insertions, 330 deletions
diff --git a/shared-bindings/socketpool/Socket.c b/shared-bindings/socketpool/Socket.c
index e4d79616a..f6f90ceb1 100644
--- a/shared-bindings/socketpool/Socket.c
+++ b/shared-bindings/socketpool/Socket.c
@@ -62,94 +62,94 @@ STATIC mp_obj_t socketpool_socket___exit__(size_t n_args, const mp_obj_t *args)
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket___exit___obj, 4, 4, socketpool_socket___exit__);
-//| def bind(self, address: tuple) -> None:
-//| """Bind a socket to an address
-//|
-//| :param ~tuple address: tuple of (remote_address, remote_port)"""
-//| ...
-//|
-
-STATIC mp_obj_t socketpool_socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
-
- // // get address
- // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
- // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG);
-
- // // check if we need to select a NIC
- // socket_select_nic(self, ip);
-
- // // call the NIC to bind the socket
- // int _errno;
- // if (self->nic_type->bind(self, ip, port, &_errno) != 0) {
- // mp_raise_OSError(_errno);
- // }
+// //| def bind(self, address: tuple) -> None:
+// //| """Bind a socket to an address
+// //|
+// //| :param ~tuple address: tuple of (remote_address, remote_port)"""
+// //| ...
+// //|
- return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_bind_obj, socketpool_socket_bind);
+// STATIC mp_obj_t socketpool_socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
+// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
-//| def listen(self, backlog: int) -> None:
-//| """Set socket to listen for incoming connections
-//|
-//| :param ~int backlog: length of backlog queue for waiting connetions"""
-//| ...
-//|
+// // // get address
+// // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
+// // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG);
-STATIC mp_obj_t socketpool_socket_listen(mp_obj_t self_in, mp_obj_t backlog) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+// // // check if we need to select a NIC
+// // socket_select_nic(self, ip);
- // if (self->nic == MP_OBJ_NULL) {
- // // not connected
- // // TODO I think we can listen even if not bound...
- // mp_raise_OSError(MP_ENOTCONN);
- // }
-
- // int _errno;
- // if (self->nic_type->listen(self, mp_obj_get_int(backlog), &_errno) != 0) {
- // mp_raise_OSError(_errno);
- // }
-
- return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_listen_obj, socketpool_socket_listen);
-
-//| def accept(self) -> tuple:
-//| """Accept a connection on a listening socket of type SOCK_STREAM,
-//| creating a new socket of type SOCK_STREAM.
-//| Returns a tuple of (new_socket, remote_address)"""
-//|
+// // // call the NIC to bind the socket
+// // int _errno;
+// // if (self->nic_type->bind(self, ip, port, &_errno) != 0) {
+// // mp_raise_OSError(_errno);
+// // }
-STATIC mp_obj_t socketpool_socket_accept(mp_obj_t self_in) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+// return mp_const_none;
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_bind_obj, socketpool_socket_bind);
+
+// //| def listen(self, backlog: int) -> None:
+// //| """Set socket to listen for incoming connections
+// //|
+// //| :param ~int backlog: length of backlog queue for waiting connetions"""
+// //| ...
+// //|
+
+// STATIC mp_obj_t socketpool_socket_listen(mp_obj_t self_in, mp_obj_t backlog) {
+// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+// // if (self->nic == MP_OBJ_NULL) {
+// // // not connected
+// // // TODO I think we can listen even if not bound...
+// // mp_raise_OSError(MP_ENOTCONN);
+// // }
- // // create new socket object
- // // starts with empty NIC so that finaliser doesn't run close() method if accept() fails
- // mod_network_socket_obj_t *socket2 = m_new_obj_with_finaliser(mod_network_socket_obj_t);
- // socket2->base.type = &socket_type;
- // socket2->nic = MP_OBJ_NULL;
- // socket2->nic_type = NULL;
+// // int _errno;
+// // if (self->nic_type->listen(self, mp_obj_get_int(backlog), &_errno) != 0) {
+// // mp_raise_OSError(_errno);
+// // }
- // // accept incoming connection
- // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
- // mp_uint_t port;
- // int _errno;
- // if (self->nic_type->accept(self, socket2, ip, &port, &_errno) != 0) {
- // mp_raise_OSError(_errno);
- // }
+// return mp_const_none;
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_listen_obj, socketpool_socket_listen);
+
+// //| def accept(self) -> tuple:
+// //| """Accept a connection on a listening socket of type SOCK_STREAM,
+// //| creating a new socket of type SOCK_STREAM.
+// //| Returns a tuple of (new_socket, remote_address)"""
+// //|
+
+// STATIC mp_obj_t socketpool_socket_accept(mp_obj_t self_in) {
+// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+// // // create new socket object
+// // // starts with empty NIC so that finaliser doesn't run close() method if accept() fails
+// // mod_network_socket_obj_t *socket2 = m_new_obj_with_finaliser(mod_network_socket_obj_t);
+// // socket2->base.type = &socket_type;
+// // socket2->nic = MP_OBJ_NULL;
+// // socket2->nic_type = NULL;
+
+// // // accept incoming connection
+// // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
+// // mp_uint_t port;
+// // int _errno;
+// // if (self->nic_type->accept(self, socket2, ip, &port, &_errno) != 0) {
+// // mp_raise_OSError(_errno);
+// // }
- // // new socket has valid state, so set the NIC to the same as parent
- // socket2->nic = self->nic;
- // socket2->nic_type = self->nic_type;
+// // // new socket has valid state, so set the NIC to the same as parent
+// // socket2->nic = self->nic;
+// // socket2->nic_type = self->nic_type;
- // // make the return value
- // mp_obj_tuple_t *client = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
- // client->items[0] = MP_OBJ_FROM_PTR(socket2);
- // client->items[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
+// // // make the return value
+// // mp_obj_tuple_t *client = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
+// // client->items[0] = MP_OBJ_FROM_PTR(socket2);
+// // client->items[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
- return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(socketpool_socket_accept_obj, socketpool_socket_accept);
+// return mp_const_none;
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_1(socketpool_socket_accept_obj, socketpool_socket_accept);
//| def close(self) -> None:
//| """Closes this Socket and makes its resources available to its SocketPool."""
@@ -193,20 +193,19 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(socketpool_socket_close_obj, socketpool_socket_
//|
STATIC mp_obj_t socketpool_socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
- // // get address
- // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
- // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG);
+ mp_obj_t *addr_items;
+ mp_obj_get_array_fixed_n(addr_in, 2, &addr_items);
- // // check if we need to select a NIC
- // socket_select_nic(self, ip);
+ size_t hostlen;
+ const char* host = mp_obj_str_get_data(addr_items[0], &hostlen);
+ mp_int_t port = mp_obj_get_int(addr_items[1]);
- // // call the NIC to connect the socket
- // int _errno;
- // if (self->nic_type->connect(self, ip, port, &_errno) != 0) {
- // mp_raise_OSError(_errno);
- // }
+ bool ok = common_hal_socketpool_socket_connect(self, host, hostlen, port);
+ if (!ok) {
+ mp_raise_OSError(0);
+ }
return mp_const_none;
}
@@ -221,19 +220,17 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_connect_obj, socketpool_socke
//|
STATIC mp_obj_t socketpool_socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
- mp_int_t ret = 0;
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
// if (self->nic == MP_OBJ_NULL) {
// // not connected
// mp_raise_OSError(MP_EPIPE);
// }
- // mp_buffer_info_t bufinfo;
- // mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
- // int _errno;
- // mp_int_t ret = self->nic_type->send(self, bufinfo.buf, bufinfo.len, &_errno);
- // if (ret == -1) {
- // mp_raise_OSError(_errno);
- // }
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
+ mp_int_t ret = common_hal_socketpool_socket_send(self, bufinfo.buf, bufinfo.len);
+ if (ret == -1) {
+ mp_raise_OSError(0);
+ }
return mp_obj_new_int_from_uint(ret);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_send_obj, socketpool_socket_send);
@@ -267,134 +264,133 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_send_obj, socketpool_socket_s
//|
STATIC mp_obj_t socketpool_socket_recv_into(size_t n_args, const mp_obj_t *args) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
// if (self->nic == MP_OBJ_NULL) {
// // not connected
// mp_raise_OSError(MP_ENOTCONN);
// }
- // mp_buffer_info_t bufinfo;
- // mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE);
- // mp_int_t len = bufinfo.len;
- // if (n_args == 3) {
- // mp_int_t given_len = mp_obj_get_int(args[2]);
- // if (given_len < len) {
- // len = given_len;
- // }
- // }
-
- // mp_int_t ret = _socket_recv_into(self, (byte*)bufinfo.buf, len);
- mp_int_t ret = 0;
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE);
+ mp_int_t len = bufinfo.len;
+ if (n_args == 3) {
+ mp_int_t given_len = mp_obj_get_int(args[2]);
+ if (given_len < len) {
+ len = given_len;
+ }
+ }
+
+ mp_int_t ret = common_hal_socketpool_socket_recv_into(self, (byte*)bufinfo.buf, len);
return mp_obj_new_int_from_uint(ret);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_recv_into_obj, 2, 3, socketpool_socket_recv_into);
-//| def sendto(self, bytes: ReadableBuffer, address: tuple) -> int:
-//| """Send some bytes to a specific address.
-//| Suits sockets of type SOCK_DGRAM
-//|
-//| :param ~bytes bytes: some bytes to send
-//| :param ~tuple address: tuple of (remote_address, remote_port)"""
-//| ...
-//|
-
-STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+// //| def sendto(self, bytes: ReadableBuffer, address: tuple) -> int:
+// //| """Send some bytes to a specific address.
+// //| Suits sockets of type SOCK_DGRAM
+// //|
+// //| :param ~bytes bytes: some bytes to send
+// //| :param ~tuple address: tuple of (remote_address, remote_port)"""
+// //| ...
+// //|
- // // get the data
- // mp_buffer_info_t bufinfo;
- // mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
-
- // // get address
- // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
- // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG);
+// STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
+// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
- // // check if we need to select a NIC
- // socket_select_nic(self, ip);
+// // // get the data
+// // mp_buffer_info_t bufinfo;
+// // mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
- // // call the NIC to sendto
- // int _errno;
- // mp_int_t ret = self->nic_type->sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);
- // if (ret == -1) {
- // mp_raise_OSError(_errno);
- // }
- mp_int_t ret = 0;
-
- return mp_obj_new_int(ret);
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto);
-
-//| def recvfrom(self, bufsize: int) -> Tuple[bytes, tuple]:
-//| """Reads some bytes from the connected remote address.
-//| Suits sockets of type SOCK_STREAM
-//|
-//| Returns a tuple containing
-//| * a bytes() of length <= bufsize
-//| * a remote_address, which is a tuple of ip address and port number
-//|
-//| :param ~int bufsize: maximum number of bytes to receive"""
-//| ...
-//|
+// // // get address
+// // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
+// // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG);
-STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t len_in) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
- // if (self->nic == MP_OBJ_NULL) {
- // // not connected
- // mp_raise_OSError(MP_ENOTCONN);
- // }
- // vstr_t vstr;
- // vstr_init_len(&vstr, mp_obj_get_int(len_in));
- // byte ip[4];
- // mp_uint_t port;
- // int _errno;
- // mp_int_t ret = self->nic_type->recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno);
- // if (ret == -1) {
- // mp_raise_OSError(_errno);
- // }
- mp_obj_t tuple[2];
- // if (ret == 0) {
- // tuple[0] = mp_const_empty_bytes;
- // } else {
- // vstr.len = ret;
- // tuple[0] = mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
- // }
- // tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
- return mp_obj_new_tuple(2, tuple);
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);
+// // // check if we need to select a NIC
+// // socket_select_nic(self, ip);
-//| def setsockopt(self, level: int, optname: int, value: int) -> None:
-//| """Sets socket options"""
-//| ...
-//|
+// // // call the NIC to sendto
+// // int _errno;
+// // mp_int_t ret = self->nic_type->sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);
+// // if (ret == -1) {
+// // mp_raise_OSError(_errno);
+// // }
+// mp_int_t ret = 0;
-STATIC mp_obj_t socketpool_socket_setsockopt(size_t n_args, const mp_obj_t *args) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
-
- // mp_int_t level = mp_obj_get_int(args[1]);
- // mp_int_t opt = mp_obj_get_int(args[2]);
-
- // const void *optval;
- // mp_uint_t optlen;
- // mp_int_t val;
- // if (mp_obj_is_integer(args[3])) {
- // val = mp_obj_get_int_truncated(args[3]);
- // optval = &val;
- // optlen = sizeof(val);
- // } else {
- // mp_buffer_info_t bufinfo;
- // mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
- // optval = bufinfo.buf;
- // optlen = bufinfo.len;
- // }
+// return mp_obj_new_int(ret);
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto);
+
+// //| def recvfrom(self, bufsize: int) -> Tuple[bytes, tuple]:
+// //| """Reads some bytes from the connected remote address.
+// //| Suits sockets of type SOCK_STREAM
+// //|
+// //| Returns a tuple containing
+// //| * a bytes() of length <= bufsize
+// //| * a remote_address, which is a tuple of ip address and port number
+// //|
+// //| :param ~int bufsize: maximum number of bytes to receive"""
+// //| ...
+// //|
+
+// STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t len_in) {
+// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+// // if (self->nic == MP_OBJ_NULL) {
+// // // not connected
+// // mp_raise_OSError(MP_ENOTCONN);
+// // }
+// // vstr_t vstr;
+// // vstr_init_len(&vstr, mp_obj_get_int(len_in));
+// // byte ip[4];
+// // mp_uint_t port;
+// // int _errno;
+// // mp_int_t ret = self->nic_type->recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno);
+// // if (ret == -1) {
+// // mp_raise_OSError(_errno);
+// // }
+// mp_obj_t tuple[2];
+// // if (ret == 0) {
+// // tuple[0] = mp_const_empty_bytes;
+// // } else {
+// // vstr.len = ret;
+// // tuple[0] = mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+// // }
+// // tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
+// return mp_obj_new_tuple(2, tuple);
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);
+
+// //| def setsockopt(self, level: int, optname: int, value: int) -> None:
+// //| """Sets socket options"""
+// //| ...
+// //|
+
+// STATIC mp_obj_t socketpool_socket_setsockopt(size_t n_args, const mp_obj_t *args) {
+// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+// // mp_int_t level = mp_obj_get_int(args[1]);
+// // mp_int_t opt = mp_obj_get_int(args[2]);
+
+// // const void *optval;
+// // mp_uint_t optlen;
+// // mp_int_t val;
+// // if (mp_obj_is_integer(args[3])) {
+// // val = mp_obj_get_int_truncated(args[3]);
+// // optval = &val;
+// // optlen = sizeof(val);
+// // } else {
+// // mp_buffer_info_t bufinfo;
+// // mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
+// // optval = bufinfo.buf;
+// // optlen = bufinfo.len;
+// // }
- // int _errno;
- // if (self->nic_type->setsockopt(self, level, opt, optval, optlen, &_errno) != 0) {
- // mp_raise_OSError(_errno);
- // }
+// // int _errno;
+// // if (self->nic_type->setsockopt(self, level, opt, optval, optlen, &_errno) != 0) {
+// // mp_raise_OSError(_errno);
+// // }
- return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4, 4, socketpool_socket_setsockopt);
+// return mp_const_none;
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4, 4, socketpool_socket_setsockopt);
//| def settimeout(self, value: int) -> None:
//| """Set the timeout value for this socket.
@@ -404,46 +400,39 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4,
//|
STATIC mp_obj_t socketpool_socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) {
- // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
- // if (self->nic == MP_OBJ_NULL) {
- // // not connected
- // mp_raise_OSError(MP_ENOTCONN);
- // }
- // mp_uint_t timeout;
- // if (timeout_in == mp_const_none) {
- // timeout = -1;
- // } else {
- // #if MICROPY_PY_BUILTINS_FLOAT
- // timeout = 1000 * mp_obj_get_float(timeout_in);
- // #else
- // timeout = 1000 * mp_obj_get_int(timeout_in);
- // #endif
- // }
- // int _errno;
- // if (self->nic_type->settimeout(self, timeout, &_errno) != 0) {
- // mp_raise_OSError(_errno);
- // }
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_uint_t timeout_ms;
+ if (timeout_in == mp_const_none) {
+ timeout_ms = -1;
+ } else {
+ #if MICROPY_PY_BUILTINS_FLOAT
+ timeout_ms = 1000 * mp_obj_get_float(timeout_in);
+ #else
+ timeout_ms = 1000 * mp_obj_get_int(timeout_in);
+ #endif
+ }
+ common_hal_socketpool_socket_settimeout(self, timeout_ms);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_settimeout_obj, socketpool_socket_settimeout);
-//| def setblocking(self, flag: bool) -> Optional[int]:
-//| """Set the blocking behaviour of this socket.
-//|
-//| :param ~bool flag: False means non-blocking, True means block indefinitely."""
-//| ...
-//|
-
-// method socket.setblocking(flag)
-STATIC mp_obj_t socketpool_socket_setblocking(mp_obj_t self_in, mp_obj_t blocking) {
- // if (mp_obj_is_true(blocking)) {
- // return socket_settimeout(self_in, mp_const_none);
- // } else {
- // return socket_settimeout(self_in, MP_OBJ_NEW_SMALL_INT(0));
- // }
- return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_setblocking_obj, socketpool_socket_setblocking);
+// //| def setblocking(self, flag: bool) -> Optional[int]:
+// //| """Set the blocking behaviour of this socket.
+// //|
+// //| :param ~bool flag: False means non-blocking, True means block indefinitely."""
+// //| ...
+// //|
+
+// // method socket.setblocking(flag)
+// STATIC mp_obj_t socketpool_socket_setblocking(mp_obj_t self_in, mp_obj_t blocking) {
+// // if (mp_obj_is_true(blocking)) {
+// // return socket_settimeout(self_in, mp_const_none);
+// // } else {
+// // return socket_settimeout(self_in, MP_OBJ_NEW_SMALL_INT(0));
+// // }
+// return mp_const_none;
+// }
+// STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_setblocking_obj, socketpool_socket_setblocking);
STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
@@ -451,17 +440,17 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&socketpool_socket_close_obj) },
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socketpool_socket_close_obj) },
- { MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&socketpool_socket_bind_obj) },
- { MP_ROM_QSTR(MP_QSTR_listen), MP_ROM_PTR(&socketpool_socket_listen_obj) },
- { MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&socketpool_socket_bind_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_listen), MP_ROM_PTR(&socketpool_socket_listen_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
{ MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&socketpool_socket_connect_obj) },
{ MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&socketpool_socket_send_obj) },
- { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) },
- { MP_ROM_QSTR(MP_QSTR_recvfrom_into), MP_ROM_PTR(&socketpool_socket_recvfrom_into_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_recvfrom_into), MP_ROM_PTR(&socketpool_socket_recvfrom_into_obj) },
{ MP_ROM_QSTR(MP_QSTR_recv_into), MP_ROM_PTR(&socketpool_socket_recv_into_obj) },
- { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_obj) },
{ MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socketpool_socket_settimeout_obj) },
- { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socketpool_socket_setblocking_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socketpool_socket_setblocking_obj) },
};
STATIC MP_DEFINE_CONST_DICT(socketpool_socket_locals_dict, socketpool_socket_locals_dict_table);
diff --git a/shared-bindings/socketpool/Socket.h b/shared-bindings/socketpool/Socket.h
index bbe6227ef..94c939e7b 100644
--- a/shared-bindings/socketpool/Socket.h
+++ b/shared-bindings/socketpool/Socket.h
@@ -31,8 +31,9 @@
extern const mp_obj_type_t socketpool_socket_type;
-// mp_obj_t common_hal_ipaddress_new_ipv4address(uint32_t value);
-// void common_hal_ipaddress_ipv4address_construct(ipaddress_ipv4address_obj_t* self, uint8_t* buf, size_t len);
-// mp_obj_t common_hal_ipaddress_ipv4address_get_packed(ipaddress_ipv4address_obj_t* self);
+void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t* self, mp_uint_t timeout_ms);
+bool common_hal_socketpool_socket_connect(socketpool_socket_obj_t* self, const char* host, size_t hostlen, mp_int_t port);
+mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
+mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKET_H
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) },
diff --git a/shared-bindings/socketpool/SocketPool.h b/shared-bindings/socketpool/SocketPool.h
index 1852cc168..42bd88518 100644
--- a/shared-bindings/socketpool/SocketPool.h
+++ b/shared-bindings/socketpool/SocketPool.h
@@ -29,11 +29,10 @@
#include "common-hal/socketpool/SocketPool.h"
+#include "shared-bindings/socketpool/Socket.h"
+
extern const mp_obj_type_t socketpool_socketpool_type;
-// mp_obj_t common_hal_ipaddress_new_ipv4address(uint32_t value);
-// void common_hal_ipaddress_ipv4address_construct(ipaddress_ipv4address_obj_t* self, uint8_t* buf, size_t len);
-// mp_obj_t common_hal_ipaddress_ipv4address_get_packed(ipaddress_ipv4address_obj_t* self);
typedef enum {
SOCKETPOOL_SOCK_STREAM,
SOCKETPOOL_SOCK_DGRAM,
@@ -43,6 +42,12 @@ typedef enum {
typedef enum {
SOCKETPOOL_AF_INET,
SOCKETPOOL_AF_INET6
-} socketpool_socketpool_af_t;
+} socketpool_socketpool_addressfamily_t;
+
+socketpool_socket_obj_t* common_hal_socketpool_socket(socketpool_socketpool_obj_t* self,
+ socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type);
+
+mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t* self,
+ const char* host);
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKETPOOL_H