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

Reply via email to