]> granicus.if.org Git - python/commitdiff
Issue #7133: SSL objects now support the new buffer API.
authorAntoine Pitrou <solipsis@pitrou.net>
Mon, 19 Oct 2009 17:59:07 +0000 (17:59 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Mon, 19 Oct 2009 17:59:07 +0000 (17:59 +0000)
This fixes the test_ssl failure.

Lib/test/test_ssl.py
Misc/NEWS
Modules/_ssl.c

index 247ffcd085a0ca52804502e09686f30dae2e5435..5aca13528a35f62a1b96ac0dcd878e56fc615f1a 100644 (file)
@@ -662,20 +662,21 @@ else:
             except Exception, x:
                 raise test_support.TestFailed("Unexpected exception:  " + str(x))
             else:
-                if connectionchatty:
-                    if test_support.verbose:
-                        sys.stdout.write(
-                            " client:  sending %s...\n" % (repr(indata)))
-                s.write(indata)
-                outdata = s.read()
-                if connectionchatty:
-                    if test_support.verbose:
-                        sys.stdout.write(" client:  read %s\n" % repr(outdata))
-                if outdata != indata.lower():
-                    raise test_support.TestFailed(
-                        "bad data <<%s>> (%d) received; expected <<%s>> (%d)\n"
-                        % (outdata[:min(len(outdata),20)], len(outdata),
-                           indata[:min(len(indata),20)].lower(), len(indata)))
+                for arg in [indata, bytearray(indata), memoryview(indata)]:
+                    if connectionchatty:
+                        if test_support.verbose:
+                            sys.stdout.write(
+                                " client:  sending %s...\n" % (repr(arg)))
+                    s.write(arg)
+                    outdata = s.read()
+                    if connectionchatty:
+                        if test_support.verbose:
+                            sys.stdout.write(" client:  read %s\n" % repr(outdata))
+                    if outdata != indata.lower():
+                        raise test_support.TestFailed(
+                            "bad data <<%s>> (%d) received; expected <<%s>> (%d)\n"
+                            % (outdata[:min(len(outdata),20)], len(outdata),
+                               indata[:min(len(indata),20)].lower(), len(indata)))
                 s.write("over\n")
                 if connectionchatty:
                     if test_support.verbose:
index 38c29bab6d4777c6b23956cbc000e95eda59f355..30d2c0ee89cc2bc3d9772fd9f076bfdc986eff07 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -414,6 +414,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #7133: SSL objects now support the new buffer API.
+
 - Issue #7149: urllib fails on OSX in the proxy detection code
 
 - Issue #7069: Make inspect.isabstract() return a boolean.
index 643693eecb33abdd9f6de7e9d36067935a1d52ce..87408c927913acc16d8967fdd652d70c254a6842 100644 (file)
@@ -1144,14 +1144,13 @@ normal_return:
 
 static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
 {
-       char *data;
+       Py_buffer buf;
        int len;
-       int count;
        int sockstate;
        int err;
         int nonblocking;
 
-       if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
+       if (!PyArg_ParseTuple(args, "s*:write", &buf))
                return NULL;
 
         /* just in case the blocking state of the socket has been changed */
@@ -1163,24 +1162,24 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
        if (sockstate == SOCKET_HAS_TIMED_OUT) {
                PyErr_SetString(PySSLErrorObject,
                                 "The write operation timed out");
-               return NULL;
+               goto error;
        } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
                PyErr_SetString(PySSLErrorObject,
                                 "Underlying socket has been closed.");
-               return NULL;
+               goto error;
        } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
                PyErr_SetString(PySSLErrorObject,
                                 "Underlying socket too large for select().");
-               return NULL;
+               goto error;
        }
        do {
                err = 0;
                PySSL_BEGIN_ALLOW_THREADS
-               len = SSL_write(self->ssl, data, count);
+               len = SSL_write(self->ssl, buf.buf, buf.len);
                err = SSL_get_error(self->ssl, len);
                PySSL_END_ALLOW_THREADS
-               if(PyErr_CheckSignals()) {
-                       return NULL;
+               if (PyErr_CheckSignals()) {
+                       goto error;
                }
                if (err == SSL_ERROR_WANT_READ) {
                        sockstate =
@@ -1194,19 +1193,25 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
                if (sockstate == SOCKET_HAS_TIMED_OUT) {
                        PyErr_SetString(PySSLErrorObject,
                                         "The write operation timed out");
-                       return NULL;
+                       goto error;
                } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
                        PyErr_SetString(PySSLErrorObject,
                                         "Underlying socket has been closed.");
-                       return NULL;
+                       goto error;
                } else if (sockstate == SOCKET_IS_NONBLOCKING) {
                        break;
                }
        } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
+
+       PyBuffer_Release(&buf);
        if (len > 0)
                return PyInt_FromLong(len);
        else
                return PySSL_SetError(self, len, __FILE__, __LINE__);
+
+error:
+       PyBuffer_Release(&buf);
+       return NULL;
 }
 
 PyDoc_STRVAR(PySSL_SSLwrite_doc,