Hi all,
I'm running Slackware Linux 10.2 on i386 and using neon-0.26.2,
gnomevfs-2.10.1. In gnomevfs there is a neon extension, which
implements ne_get_range. I tried to code ne_get_range_to_mem which
imitates the ne_get_range's behaviour (i mean instead of write i used
memcpy):
------------------------------------------------------------
struct get_context {
int error;
ne_session *session;
off_t total;
int fd; /* used in get_to_fd */
ne_content_range *range;
char *mem_buf; /* used in get_to_mem */ ///new
size_t buf_len; ///new
size_t read_bytes; ///new
};
...
...
// Like get_to_fd
static void get_to_mem(void *userdata, const char *block, size_t length)
{
struct get_context *ctx = userdata;
ssize_t ret;
if( ctx->buf_len < length ) {
length = ctx->buf_len;
}
if (!ctx->error) {
if(length > 0){
memcpy( ctx->mem_buf, block, length );
ctx->read_bytes += length;
}
}
}
...
...
// Like ne_get_range
int ne_get_range_to_mem(ne_session *sess, const char *uri,
ne_content_range *range, char *mem_buf, size_t buf_len, size_t
*read_bytes )
{
ne_request *req = ne_request_create(sess, "GET", uri);
struct get_context ctx;
const ne_status *status;
int ret;
if (range->end == -1) {
ctx.total = -1;
}
else {
ctx.total = (range->end - range->start) + 1;
}
NE_DEBUG(NE_DBG_HTTP, "Range total: %" NE_FMT_OFF_T "\n", ctx.total);
ctx.fd = -1; ///<U.K.>
ctx.error = 0;
ctx.range = range;
ctx.session = sess;
ctx.mem_buf = mem_buf;
ctx.buf_len = buf_len;
ctx.read_bytes = 0;
ne_add_response_header_handler(req, "Content-Length",
clength_hdr_handler, &ctx);
ne_add_response_header_handler(req, "Content-Range",
content_range_hdr_handler,
&ctx);
ne_add_response_body_reader(req, accept_206, get_to_mem, &ctx);
if (range->end == -1) {
ne_print_request_header(req, "Range", "bytes=%" NE_FMT_OFF_T "-",
range->start);
}
else {
ne_print_request_header(req, "Range",
"bytes=%" NE_FMT_OFF_T "-%" NE_FMT_OFF_T,
range->start, range->end);
}
ne_add_request_header(req, "Accept-Ranges", "bytes");
ret = ne_request_dispatch(req);
status = ne_get_status(req);
if (ctx.error) {
ret = NE_ERROR;
} else if (status && status->code == 416) {
/* connection is terminated too early with Apache/1.3, so we check
* this even if ret == NE_ERROR... */
ne_set_error(sess, _("Range is not satisfiable"));
ret = NE_ERROR;
}
else if (ret == NE_OK) {
if (status->klass == 2 && status->code != 206) {
ne_set_error(sess, _("Resource does not support ranged GETs."));
ret = NE_ERROR;
}
else if (status->klass != 2) {
ret = NE_ERROR;
}
}
ne_request_destroy(req);
*read_bytes = ctx.read_bytes;
return ret;
}
/// End of ne_get_range_to_mem
---------------------------------------------
The problem is that get_to_mem is always reads 0/1 as length, although
file is really big. Is there something so silly i'm missing?
thanks in advance,
umit
_______________________________________________
neon mailing list
[email protected]
http://mailman.webdav.org/mailman/listinfo/neon