projects
/
prss.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
asynchronous download of the article content
[prss.git]
/
src
/
http.c
diff --git
a/src/http.c
b/src/http.c
index
12f8b72
..
cd46515
100644
(file)
--- a/
src/http.c
+++ b/
src/http.c
@@
-30,14
+30,16
@@
#include "http.h"
#include "log.h"
#include "http.h"
#include "log.h"
+struct http_session {
+ CURL *curl;
+ pthread_mutex_t lock;
+};
+
struct ucontent {
char *data;
size_t len;
};
struct ucontent {
char *data;
size_t len;
};
-static CURL *curl;
-static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-
static size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp)
{
size_t realsize;
static size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp)
{
size_t realsize;
@@
-55,18
+57,26
@@
static size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp)
return realsize;
}
return realsize;
}
-
void http_init
()
+
struct http_session *http_session_new
()
{
{
- if (!curl)
- curl = curl_easy_init();
+ struct http_session *sess;
+
+ sess = malloc(sizeof(struct http_session));
+ sess->curl = curl_easy_init();
+ pthread_mutex_init(&sess->lock, NULL);
+
+ return sess;
}
}
-void http_
cleanup(
)
+void http_
session_free(struct http_session *sess
)
{
{
- curl_easy_cleanup(curl);
+ curl_easy_cleanup(sess->curl);
+ pthread_mutex_destroy(&sess->lock);
+ free(sess);
}
}
-static char *http_get(const char *url, const char *content)
+static char *
+http_get(struct http_session *sess, const char *url, const char *content)
{
struct ucontent chunk;
int result;
{
struct ucontent chunk;
int result;
@@
-74,22
+84,22
@@
static char *http_get(const char *url, const char *content)
chunk.data = malloc(1);
chunk.len = 0;
chunk.data = malloc(1);
chunk.len = 0;
- pthread_mutex_lock(&lock);
+ pthread_mutex_lock(&
sess->
lock);
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);
+ curl_easy_setopt(
sess->
curl, CURLOPT_URL, url);
+ curl_easy_setopt(
sess->
curl, CURLOPT_VERBOSE, 0);
if (content) {
if (content) {
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, content);
- curl_easy_setopt(curl,
+ curl_easy_setopt(
sess->
curl, CURLOPT_POSTFIELDS, content);
+ curl_easy_setopt(
sess->
curl,
CURLOPT_POSTFIELDSIZE,
(long)strlen(content));
}
CURLOPT_POSTFIELDSIZE,
(long)strlen(content));
}
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cbk_curl);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
+ curl_easy_setopt(
sess->
curl, CURLOPT_WRITEFUNCTION, cbk_curl);
+ curl_easy_setopt(
sess->
curl, CURLOPT_WRITEDATA, (void *)&chunk);
- result = curl_easy_perform(curl);
+ result = curl_easy_perform(
sess->
curl);
- pthread_mutex_unlock(&lock);
+ pthread_mutex_unlock(&
sess->
lock);
if (result == CURLE_OK)
return chunk.data;
if (result == CURLE_OK)
return chunk.data;
@@
-100,7
+110,8
@@
static char *http_get(const char *url, const char *content)
return NULL;
}
return NULL;
}
-json_object *http_json_get(const char *url, struct json_object *j)
+json_object *
+http_json_get(struct http_session *sess, const char *url, struct json_object *j)
{
const char *in;
char *out;
{
const char *in;
char *out;
@@
-111,7
+122,7
@@
json_object *http_json_get(const char *url, struct json_object *j)
json_object_to_json_string(j));
in = json_object_to_json_string(j);
json_object_to_json_string(j));
in = json_object_to_json_string(j);
- out = http_get(url, in);
+ out = http_get(
sess,
url, in);
if (out) {
result = json_tokener_parse(out);
if (out) {
result = json_tokener_parse(out);