Commit dcd37c15 authored by Denis Bilenko's avatar Denis Bilenko

add wrappers for evbuffer, evhttp, evhttp_request and evhttp_connection

parent c5747fdf
cdef extern from "libevent.h":
struct evbuffer:
char *buf "buffer"
int off
evbuffer *evbuffer_new()
int evbuffer_add(evbuffer *buf, char *p, int len)
char *evbuffer_readline(evbuffer *buf)
void evbuffer_free(evbuffer *buf)
size_t evbuffer_get_length(evbuffer *buffer)
unsigned char *evbuffer_pullup(evbuffer *buf, size_t size)
int EVBUFFER_DRAIN(evbuffer *buf, size_t len)
cdef class buffer:
cdef evbuffer* __obj
def __init__(self, size_t _obj):
self.__obj = <evbuffer*>_obj
property _obj:
def __get__(self):
return <size_t>(self.__obj)
def __len__(self):
return evbuffer_get_length(self.__obj)
def __nonzero__(self):
return self.__obj and evbuffer_get_length(self.__obj)
# cython does not implement generators
#def __iter__(self):
# while len(self):
# yield self.readline()
def read(self, long size=-1):
cdef long length = evbuffer_get_length(self.__obj)
if size < 0:
size = length
else:
size = min(size, length)
if size <= 0:
return ''
cdef char* data = <char*>evbuffer_pullup(self.__obj, size)
if not data:
raise RuntimeError('evbuffer_pullup(%x, %s) returned NULL' % (self._obj, size))
cdef object result = PyString_FromStringAndSize(data, size)
cdef res = EVBUFFER_DRAIN(self.__obj, size)
if res:
raise RuntimeError('evbuffer_drain(%x, %s) returned %s' % (self._obj, size, res))
return result
def readline(self):
return evbuffer_readline(self.__obj) or ''
def readlines(self, hint=-1):
return list(self.__iter__())
This diff is collapsed.
#include "sys/queue.h"
#ifdef USE_LIBEVENT_2
#warning "Using libevent2"
#include "event2/event.h"
#include "event2/event_struct.h"
#include "event2/event_compat.h"
#include "event2/http.h"
#include "event2/http_compat.h"
#include "event2/http_struct.h"
#include "event2/buffer.h"
#include "event2/buffer_compat.h"
#define EVBUFFER_DRAIN evbuffer_drain
#define EVHTTP_SET_CB evhttp_set_cb
#elif USE_LIBEVENT_1
#warning "Using libevent1"
#include "event.h"
#include "evhttp.h"
/* compatibility */
#define evbuffer_get_length EVBUFFER_LENGTH
#define evbuffer_pullup(BUF, SIZE) EVBUFFER_DATA(BUF)
#define TAILQ_FIRST(head) ((head)->tqh_first)
#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
/* functions that return int in libeven2 but void in libevent1 */
#define EVBUFFER_DRAIN(A, B) (evbuffer_drain((A), (B)), 0)
#define EVHTTP_SET_CB(A, B, C, D) (evhttp_set_cb((A), (B), (C), (D)), 0)
#else
#error "Please define either USE_LIBEVENT_1 or USE_LIBEVENT_2"
#endif
#define TAILQ_GET_NEXT(X) TAILQ_NEXT((X), next)
extern void *current_base;
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