Commit 7d7aede5 authored by Antoine Pitrou's avatar Antoine Pitrou

Merged revisions 75529 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r75529 | antoine.pitrou | 2009-10-19 19:59:07 +0200 (lun., 19 oct. 2009) | 5 lines

  Issue #7133: SSL objects now support the new buffer API.

  This fixes the test_ssl failure.
........
parent b742a96c
...@@ -651,21 +651,23 @@ else: ...@@ -651,21 +651,23 @@ else:
except Exception as x: except Exception as x:
raise support.TestFailed("Unexpected exception: " + str(x)) raise support.TestFailed("Unexpected exception: " + str(x))
else: else:
if connectionchatty: bindata = indata.encode('ASCII', 'strict')
if support.verbose: for arg in [bindata, bytearray(bindata), memoryview(bindata)]:
sys.stdout.write( if connectionchatty:
" client: sending %s...\n" % (repr(indata))) if support.verbose:
s.write(indata.encode('ASCII', 'strict')) sys.stdout.write(
outdata = s.read() " client: sending %s...\n" % (repr(indata)))
if connectionchatty: s.write(arg)
if support.verbose: outdata = s.read()
sys.stdout.write(" client: read %s\n" % repr(outdata)) if connectionchatty:
outdata = str(outdata, 'ASCII', 'strict') if support.verbose:
if outdata != indata.lower(): sys.stdout.write(" client: read %s\n" % repr(outdata))
raise support.TestFailed( outdata = str(outdata, 'ASCII', 'strict')
"bad data <<%s>> (%d) received; expected <<%s>> (%d)\n" if outdata != indata.lower():
% (repr(outdata[:min(len(outdata),20)]), len(outdata), raise support.TestFailed(
repr(indata[:min(len(indata),20)].lower()), len(indata))) "bad data <<%s>> (%d) received; expected <<%s>> (%d)\n"
% (repr(outdata[:min(len(outdata),20)]), len(outdata),
repr(indata[:min(len(indata),20)].lower()), len(indata)))
s.write("over\n".encode("ASCII", "strict")) s.write("over\n".encode("ASCII", "strict"))
if connectionchatty: if connectionchatty:
if support.verbose: if support.verbose:
......
...@@ -140,6 +140,8 @@ C-API ...@@ -140,6 +140,8 @@ C-API
Library Library
------- -------
- Issue #7133: SSL objects now support the new buffer API.
- Issue #1488943: difflib.Differ() doesn't always add hints for tab characters - Issue #1488943: difflib.Differ() doesn't always add hints for tab characters
- Issue #6123: tarfile now opens empty archives correctly and consistently - Issue #6123: tarfile now opens empty archives correctly and consistently
......
...@@ -1146,9 +1146,8 @@ normal_return: ...@@ -1146,9 +1146,8 @@ normal_return:
static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
{ {
char *data; Py_buffer buf;
int len; int len;
int count;
int sockstate; int sockstate;
int err; int err;
int nonblocking; int nonblocking;
...@@ -1161,7 +1160,7 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) ...@@ -1161,7 +1160,7 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
return NULL; return NULL;
} }
if (!PyArg_ParseTuple(args, "y#:write", &data, &count)) if (!PyArg_ParseTuple(args, "y*:write", &buf))
return NULL; return NULL;
/* just in case the blocking state of the socket has been changed */ /* just in case the blocking state of the socket has been changed */
...@@ -1173,24 +1172,24 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) ...@@ -1173,24 +1172,24 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySSLErrorObject,
"The write operation timed out"); "The write operation timed out");
return NULL; goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySSLErrorObject,
"Underlying socket has been closed."); "Underlying socket has been closed.");
return NULL; goto error;
} else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySSLErrorObject,
"Underlying socket too large for select()."); "Underlying socket too large for select().");
return NULL; goto error;
} }
do { do {
err = 0; err = 0;
PySSL_BEGIN_ALLOW_THREADS 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); err = SSL_get_error(self->ssl, len);
PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS
if(PyErr_CheckSignals()) { if (PyErr_CheckSignals()) {
return NULL; goto error;
} }
if (err == SSL_ERROR_WANT_READ) { if (err == SSL_ERROR_WANT_READ) {
sockstate = sockstate =
...@@ -1204,19 +1203,25 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) ...@@ -1204,19 +1203,25 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySSLErrorObject,
"The write operation timed out"); "The write operation timed out");
return NULL; goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySSLErrorObject,
"Underlying socket has been closed."); "Underlying socket has been closed.");
return NULL; goto error;
} else if (sockstate == SOCKET_IS_NONBLOCKING) { } else if (sockstate == SOCKET_IS_NONBLOCKING) {
break; break;
} }
} while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE); } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
PyBuffer_Release(&buf);
if (len > 0) if (len > 0)
return PyLong_FromLong(len); return PyLong_FromLong(len);
else else
return PySSL_SetError(self, len, __FILE__, __LINE__); return PySSL_SetError(self, len, __FILE__, __LINE__);
error:
PyBuffer_Release(&buf);
return NULL;
} }
PyDoc_STRVAR(PySSL_SSLwrite_doc, PyDoc_STRVAR(PySSL_SSLwrite_doc,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment