|
|
1fb0df |
From f1169a50516e34d22a22229113aef46212177417 Mon Sep 17 00:00:00 2001
|
|
|
1fb0df |
From: Oleg Pudeyev <oleg@bsdpower.com>
|
|
|
1fb0df |
Date: Thu, 3 Oct 2013 22:31:31 -0400
|
|
|
1fb0df |
Subject: [PATCH] Keep a reference to the object used for CURLOPT_POSTFIELDS.
|
|
|
1fb0df |
|
|
|
1fb0df |
Fixes #34
|
|
|
1fb0df |
|
|
|
1fb0df |
Upstream-commit: b01a04fbd7797c70c5397a1b04abb09e6e4c8a36
|
|
|
1fb0df |
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
|
1fb0df |
---
|
|
|
1fb0df |
src/pycurl.c | 10 ++++++++++
|
|
|
1fb0df |
1 file changed, 10 insertions(+)
|
|
|
1fb0df |
|
|
|
1fb0df |
diff --git a/src/pycurl.c b/src/pycurl.c
|
|
|
1fb0df |
index 9a7135c..31722ad 100644
|
|
|
1fb0df |
--- a/src/pycurl.c
|
|
|
1fb0df |
+++ b/src/pycurl.c
|
|
|
1fb0df |
@@ -149,16 +149,18 @@ typedef struct {
|
|
|
1fb0df |
PyObject *pro_cb;
|
|
|
1fb0df |
PyObject *debug_cb;
|
|
|
1fb0df |
PyObject *ioctl_cb;
|
|
|
1fb0df |
PyObject *opensocket_cb;
|
|
|
1fb0df |
/* file objects */
|
|
|
1fb0df |
PyObject *readdata_fp;
|
|
|
1fb0df |
PyObject *writedata_fp;
|
|
|
1fb0df |
PyObject *writeheader_fp;
|
|
|
1fb0df |
+ /* reference to the object used for CURLOPT_POSTFIELDS */
|
|
|
1fb0df |
+ PyObject *postfields_obj;
|
|
|
1fb0df |
/* misc */
|
|
|
1fb0df |
char error[CURL_ERROR_SIZE+1];
|
|
|
1fb0df |
} CurlObject;
|
|
|
1fb0df |
|
|
|
1fb0df |
/* Throw exception based on return value `res' and `self->error' */
|
|
|
1fb0df |
#define CURLERROR_RETVAL() do {\
|
|
|
1fb0df |
PyObject *v; \
|
|
|
1fb0df |
self->error[sizeof(self->error) - 1] = 0; \
|
|
|
1fb0df |
@@ -727,16 +729,17 @@ util_curl_new(void)
|
|
|
1fb0df |
self->debug_cb = NULL;
|
|
|
1fb0df |
self->ioctl_cb = NULL;
|
|
|
1fb0df |
self->opensocket_cb = NULL;
|
|
|
1fb0df |
|
|
|
1fb0df |
/* Set file object pointers to NULL by default */
|
|
|
1fb0df |
self->readdata_fp = NULL;
|
|
|
1fb0df |
self->writedata_fp = NULL;
|
|
|
1fb0df |
self->writeheader_fp = NULL;
|
|
|
1fb0df |
+ self->postfields_obj = NULL;
|
|
|
1fb0df |
|
|
|
1fb0df |
/* Zero string pointer memory buffer used by setopt */
|
|
|
1fb0df |
memset(self->error, 0, sizeof(self->error));
|
|
|
1fb0df |
|
|
|
1fb0df |
return self;
|
|
|
1fb0df |
}
|
|
|
1fb0df |
|
|
|
1fb0df |
/* initializer - used to intialize curl easy handles for use with pycurl */
|
|
|
1fb0df |
@@ -854,16 +857,17 @@ util_curl_xdecref(CurlObject *self, int flags, CURL *handle)
|
|
|
1fb0df |
ZAP(self->ioctl_cb);
|
|
|
1fb0df |
}
|
|
|
1fb0df |
|
|
|
1fb0df |
if (flags & 8) {
|
|
|
1fb0df |
/* Decrement refcount for python file objects. */
|
|
|
1fb0df |
ZAP(self->readdata_fp);
|
|
|
1fb0df |
ZAP(self->writedata_fp);
|
|
|
1fb0df |
ZAP(self->writeheader_fp);
|
|
|
1fb0df |
+ ZAP(self->postfields_obj);
|
|
|
1fb0df |
}
|
|
|
1fb0df |
|
|
|
1fb0df |
if (flags & 16) {
|
|
|
1fb0df |
/* Decrement refcount for share objects. */
|
|
|
1fb0df |
if (self->share != NULL) {
|
|
|
1fb0df |
CurlShareObject *share = self->share;
|
|
|
1fb0df |
self->share = NULL;
|
|
|
1fb0df |
if (share->share_handle != NULL && handle != NULL) {
|
|
|
1fb0df |
@@ -1626,16 +1630,22 @@ do_curl_setopt(CurlObject *self, PyObject *args)
|
|
|
1fb0df |
/* Allocate memory to hold the string */
|
|
|
1fb0df |
assert(str != NULL);
|
|
|
1fb0df |
/* Call setopt */
|
|
|
1fb0df |
res = curl_easy_setopt(self->handle, (CURLoption)option, str);
|
|
|
1fb0df |
/* Check for errors */
|
|
|
1fb0df |
if (res != CURLE_OK) {
|
|
|
1fb0df |
CURLERROR_RETVAL();
|
|
|
1fb0df |
}
|
|
|
1fb0df |
+ /* libcurl does not copy the value of CURLOPT_POSTFIELDS */
|
|
|
1fb0df |
+ if (option == CURLOPT_POSTFIELDS) {
|
|
|
1fb0df |
+ Py_INCREF(obj);
|
|
|
1fb0df |
+ Py_XDECREF(self->postfields_obj);
|
|
|
1fb0df |
+ self->postfields_obj = obj;
|
|
|
1fb0df |
+ }
|
|
|
1fb0df |
Py_INCREF(Py_None);
|
|
|
1fb0df |
return Py_None;
|
|
|
1fb0df |
}
|
|
|
1fb0df |
|
|
|
1fb0df |
#define IS_LONG_OPTION(o) (o < CURLOPTTYPE_OBJECTPOINT)
|
|
|
1fb0df |
#define IS_OFF_T_OPTION(o) (o >= CURLOPTTYPE_OFF_T)
|
|
|
1fb0df |
|
|
|
1fb0df |
/* Handle the case of integer arguments */
|
|
|
1fb0df |
--
|
|
|
1fb0df |
2.5.0
|
|
|
1fb0df |
|