]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Convert the socket module to insist on bytes for input, and to return bytes
authorGuido van Rossum <guido@python.org>
Wed, 21 Nov 2007 22:09:45 +0000 (22:09 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 21 Nov 2007 22:09:45 +0000 (22:09 +0000)
(not bytearray) on output.  Discovered a bunch of places that were still
depending on it accepting text strings.

Lib/SimpleXMLRPCServer.py
Lib/smtplib.py
Lib/test/test_ftplib.py
Lib/test/test_poplib.py
Lib/test/test_smtplib.py
Lib/test/test_socket.py
Lib/test/test_urllib2_localnet.py
Modules/socketmodule.c

index 5f6e9d0bdecf58d0cad7105b89c2cff3be4567e4..f74ca541c7a6e78c59b97320cce5d59e8ed4a537 100644 (file)
@@ -464,7 +464,8 @@ class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
             self.end_headers()
         else:
-            # got a valid XML RPC response
+            # Got a valid XML RPC response; convert to bytes first
+            response = response.encode("utf-8")
             self.send_response(200)
             self.send_header("Content-type", "text/xml")
             self.send_header("Content-length", str(len(response)))
index e10e327a82eec5aa47d68cd5446835a2eded5502..0b4cbf05dcaf529f01d727966b5899caddaa61d9 100755 (executable)
@@ -295,12 +295,14 @@ class SMTP:
         if self.debuglevel > 0: print("connect:", msg, file=stderr)
         return (code, msg)
 
-    def send(self, str):
-        """Send `str' to the server."""
-        if self.debuglevel > 0: print('send:', repr(str), file=stderr)
+    def send(self, s):
+        """Send `s' to the server."""
+        if self.debuglevel > 0: print('send:', repr(s), file=stderr)
         if self.sock:
+            if isinstance(s, str):
+                s = s.encode("ascii")
             try:
-                self.sock.sendall(str)
+                self.sock.sendall(s)
             except socket.error:
                 self.close()
                 raise SMTPServerDisconnected('Server not connected')
index 62aae05fa69d3e678d22c268dba99382339b2674..d782c530f57b6f1b666ae563c645f599e67ee6dc 100644 (file)
@@ -18,7 +18,7 @@ def server(evt, ready):
     except socket.timeout:
         pass
     else:
-        conn.send("1 Hola mundo\n")
+        conn.send(b"1 Hola mundo\n")
         conn.close()
     finally:
         serv.close()
index ef8565c57fc3af726d261e31111336607faedb8e..983cf2163472d74d4b3951459afa8177c987467a 100644 (file)
@@ -19,7 +19,7 @@ def server(ready, evt):
     except socket.timeout:
         pass
     else:
-        conn.send("+ Hola mundo\n")
+        conn.send(b"+ Hola mundo\n")
         conn.close()
     finally:
         serv.close()
index 00c3ad412a553ae601b093511ff9fcbf89b1109f..4151d6b655d4e24742a89a66387d63c121fbe56a 100644 (file)
@@ -50,7 +50,7 @@ class GeneralTests(TestCase):
 
     def setUp(self):
         self.evt = threading.Event()
-        servargs = (self.evt, "220 Hola mundo\n")
+        servargs = (self.evt, b"220 Hola mundo\n")
         threading.Thread(target=server, args=servargs).start()
 
         # wait until server thread has assigned a port number
index c01d998ae0b39d4991044f502be5c488b68e0b98..97445a079f908df49dfeab37de05402712c626d0 100644 (file)
@@ -498,7 +498,7 @@ class GeneralModuleTests(unittest.TestCase):
         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         sock.settimeout(1)
         sock.close()
-        self.assertRaises(socket.error, sock.send, "spam")
+        self.assertRaises(socket.error, sock.send, b"spam")
 
     def testNewAttributes(self):
         # testing .family, .type and .protocol
index dde9504e49e4dcaa07de6ad54b459a79525fcdec..f0b5dea32365b11448ff070d95d41ccc132aa767 100644 (file)
@@ -139,7 +139,7 @@ class DigestAuthHandler:
         # not.
         #request_handler.send_header('Connection', 'close')
         request_handler.end_headers()
-        request_handler.wfile.write("Proxy Authentication Required.")
+        request_handler.wfile.write(b"Proxy Authentication Required.")
         return False
 
     def handle_request(self, request_handler):
@@ -210,9 +210,10 @@ class FakeProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
             self.send_response(200, "OK")
             self.send_header("Content-Type", "text/html")
             self.end_headers()
-            self.wfile.write("You've reached %s!<BR>" % self.path)
-            self.wfile.write("Our apologies, but our server is down due to "
-                              "a sudden zombie invasion.")
+            self.wfile.write(bytes("You've reached %s!<BR>" % self.path,
+                                   "ascii"))
+            self.wfile.write(b"Our apologies, but our server is down due to "
+                             b"a sudden zombie invasion.")
 
 # Test cases
 
index 9f312ea96577ff5f7beac8c19db3601283472489..e4e30b8a9830004e357f03a4878afabb7d6790df 100644 (file)
@@ -947,7 +947,7 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
 #ifdef linux
                if (a->sun_path[0] == 0) {  /* Linux abstract namespace */
                        addrlen -= (sizeof(*a) - sizeof(a->sun_path));
-                       return PyBytes_FromStringAndSize(a->sun_path, addrlen);
+                       return PyString_FromStringAndSize(a->sun_path, addrlen);
                }
                else
 #endif /* linux */
@@ -1273,12 +1273,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
 
                        addr = (struct sockaddr_sco *)addr_ret;
                        _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
-                       if (!PyBytes_Check(args)) {
+                       if (!PyString_Check(args)) {
                                PyErr_SetString(socket_error, "getsockaddrarg: "
                                                "wrong format");
                                return 0;
                        }
-                       straddr = PyBytes_AS_STRING(args);
+                       straddr = PyString_AS_STRING(args);
                        if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
                                return 0;
 
@@ -1313,7 +1313,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
                                Py_Type(args)->tp_name);
                        return 0;
                }
-               if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
+               if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
                                      &protoNumber, &pkttype, &hatype,
                                      &haddr, &halen))
                        return 0;
@@ -1606,7 +1606,7 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args)
        }
        else {
                PyErr_Clear();
-               if (!PyArg_ParseTuple(args, "iis#:setsockopt",
+               if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
                                      &level, &optname, &buf, &buflen))
                        return NULL;
        }
@@ -1662,19 +1662,16 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args)
                                "getsockopt buflen out of range");
                return NULL;
        }
-       buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
+       buf = PyString_FromStringAndSize((char *)NULL, buflen);
        if (buf == NULL)
                return NULL;
        res = getsockopt(s->sock_fd, level, optname,
-                        (void *)PyBytes_AS_STRING(buf), &buflen);
+                        (void *)PyString_AS_STRING(buf), &buflen);
        if (res < 0) {
                Py_DECREF(buf);
                return s->errorhandler();
        }
-       if (PyBytes_Resize(buf, buflen) < 0) {
-               Py_DECREF(buf);
-               return NULL;
-       }
+       _PyString_Resize(&buf, buflen);
        return buf;
 }
 
@@ -2097,12 +2094,12 @@ sock_recv(PySocketSockObject *s, PyObject *args)
        }
 
        /* Allocate a new string. */
-       buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
+       buf = PyString_FromStringAndSize((char *) 0, recvlen);
        if (buf == NULL)
                return NULL;
 
        /* Call the guts */
-       outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
+       outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
        if (outlen < 0) {
                /* An error occurred, release the string and return an
                   error. */
@@ -2112,9 +2109,7 @@ sock_recv(PySocketSockObject *s, PyObject *args)
        if (outlen != recvlen) {
                /* We did not read as many bytes as we anticipated, resize the
                   string if possible and be successful. */
-               if (PyBytes_Resize(buf, outlen) < 0)
-                       /* Oopsy, not so successful after all. */
-                       return NULL;
+               _PyString_Resize(&buf, outlen);
        }
 
        return buf;
@@ -2270,11 +2265,11 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args)
                return NULL;
        }
 
-       buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
+       buf = PyString_FromStringAndSize((char *) 0, recvlen);
        if (buf == NULL)
                return NULL;
 
-       outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
+       outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
                                    recvlen, flags, &addr);
        if (outlen < 0) {
                goto finally;
@@ -2283,7 +2278,7 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args)
        if (outlen != recvlen) {
                /* We did not read as many bytes as we anticipated, resize the
                   string if possible and be succesful. */
-               if (PyBytes_Resize(buf, outlen) < 0)
+               if (_PyString_Resize(&buf, outlen) < 0)
                        /* Oopsy, not so succesful after all. */
                        goto finally;
        }
@@ -2358,7 +2353,7 @@ sock_send(PySocketSockObject *s, PyObject *args)
        char *buf;
        int len, n = -1, flags = 0, timeout;
 
-       if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
+       if (!PyArg_ParseTuple(args, "y#|i:send", &buf, &len, &flags))
                return NULL;
 
        if (!IS_SELECTABLE(s))
@@ -2399,7 +2394,7 @@ sock_sendall(PySocketSockObject *s, PyObject *args)
        char *buf;
        int len, n = -1, flags = 0, timeout;
 
-       if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
+       if (!PyArg_ParseTuple(args, "y#|i:sendall", &buf, &len, &flags))
                return NULL;
 
        if (!IS_SELECTABLE(s))
@@ -2454,9 +2449,9 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
        int addrlen, len, n = -1, flags, timeout;
 
        flags = 0;
-       if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
+       if (!PyArg_ParseTuple(args, "y#O:sendto", &buf, &len, &addro)) {
                PyErr_Clear();
-               if (!PyArg_ParseTuple(args, "s#iO:sendto",
+               if (!PyArg_ParseTuple(args, "y#iO:sendto",
                                      &buf, &len, &flags, &addro))
                        return NULL;
        }
@@ -3382,7 +3377,7 @@ socket_inet_aton(PyObject *self, PyObject *args)
     if (inet_aton != NULL) {
 #endif
        if (inet_aton(ip_addr, &buf))
-               return PyBytes_FromStringAndSize((char *)(&buf),
+               return PyString_FromStringAndSize((char *)(&buf),
                                                  sizeof(buf));
 
        PyErr_SetString(socket_error,
@@ -3411,8 +3406,8 @@ socket_inet_aton(PyObject *self, PyObject *args)
                        return NULL;
                }
        }
-       return PyBytes_FromStringAndSize((char *) &packed_addr,
-                                        sizeof(packed_addr));
+       return PyString_FromStringAndSize((char *) &packed_addr,
+                                          sizeof(packed_addr));
 
 #ifdef USE_INET_ATON_WEAKLINK
    }
@@ -3488,12 +3483,12 @@ socket_inet_pton(PyObject *self, PyObject *args)
                        "illegal IP address string passed to inet_pton");
                return NULL;
        } else if (af == AF_INET) {
-               return PyBytes_FromStringAndSize(packed,
-                       sizeof(struct in_addr));
+               return PyString_FromStringAndSize(packed,
+                                                  sizeof(struct in_addr));
 #ifdef ENABLE_IPV6
        } else if (af == AF_INET6) {
-               return PyBytes_FromStringAndSize(packed,
-                       sizeof(struct in6_addr));
+               return PyString_FromStringAndSize(packed,
+                                                  sizeof(struct in6_addr));
 #endif
        } else {
                PyErr_SetString(socket_error, "unknown address family");