static int acquire_body_simple(belle_sip_channel_t *obj, int end_of_stream){ int content_length=obj->input_stream.content_length; size_t to_read=obj->input_stream.write_ptr-obj->input_stream.read_ptr; belle_sip_message_t *msg=obj->input_stream.msg; belle_sip_body_handler_t *bh=belle_sip_message_get_body_handler(msg); size_t cursize=belle_sip_body_handler_get_transfered_size(bh); if ((cursize == 0) && (to_read == 0)) { /** * No data has been received yet, so do not call feed_body() with a size * of 0 that is meaning that the transfer is finished. */ } else { to_read=MIN(content_length-cursize, to_read); feed_body(obj,to_read); } if (end_of_stream || belle_sip_body_handler_get_transfered_size(bh)>=content_length){ /*great body completed*/ belle_sip_message("channel [%p] read [%i] bytes of body from [%s:%i]" ,obj ,content_length ,obj->peer_name ,obj->peer_port); belle_sip_channel_message_ready(obj); return BELLE_SIP_CONTINUE; } /*body is not finished, we need more data*/ return BELLE_SIP_STOP; }
static int acquire_chuncked_body(belle_sip_channel_t *obj){ belle_sip_channel_input_stream_t *st=&obj->input_stream; int readsize; do{ if (st->chunk_size==-1){ char *tmp; /*belle_sip_message("seeing: %s",st->read_ptr);*/ while ( (tmp=strstr(st->read_ptr,"\r\n"))==st->read_ptr){/*skip \r\n*/ st->read_ptr+=2; } if (tmp!=NULL){ /*the chunk length is there*/ long chunksize=strtol(st->read_ptr,NULL,16); if (chunksize>=0 && chunksize!=LONG_MAX){ if (chunksize==0){ belle_sip_message("Got end of chunked body"); st->read_ptr=tmp+4; /*last chunk indicator finishes with two \r\n*/ if (st->read_ptr>st->write_ptr) st->read_ptr=st->write_ptr; belle_sip_channel_message_ready(obj); return BELLE_SIP_CONTINUE; }else{ belle_sip_message("Will get a chunk of %i bytes",(int)chunksize); st->chunk_size=chunksize; st->chunk_read_size=0; st->read_ptr=tmp+2; } }else{ belle_sip_error("Chunk parse error"); belle_sip_channel_input_stream_reset(st); return BELLE_SIP_CONTINUE; } }else{ /*need more data*/ return BELLE_SIP_STOP; } } readsize=MIN(st->write_ptr-st->read_ptr,st->chunk_size-st->chunk_read_size); if (readsize>0){ feed_body(obj,readsize); st->chunk_read_size+=readsize; } if (st->chunk_size==st->chunk_read_size){ /*we have a chunk completed*/ st->content_length+=st->chunk_size; belle_sip_message("Chunk of [%i] bytes completed",st->chunk_size); st->chunk_size=-1;/*wait for next chunk indicator*/ }else{ /*need more data*/ return BELLE_SIP_STOP; } }while(st->write_ptr-st->read_ptr>0); /*no need to continue if nothing to read*/ return BELLE_SIP_STOP; }
static int acquire_body_simple(belle_sip_channel_t *obj, int end_of_stream){ int content_length=obj->input_stream.content_length; size_t to_read=obj->input_stream.write_ptr-obj->input_stream.read_ptr; belle_sip_message_t *msg=obj->input_stream.msg; belle_sip_body_handler_t *bh=belle_sip_message_get_body_handler(msg); size_t cursize=belle_sip_body_handler_get_transfered_size(bh); to_read=MIN(content_length-cursize, to_read); feed_body(obj,to_read); if (end_of_stream || belle_sip_body_handler_get_transfered_size(bh)>=content_length){ /*great body completed belle_sip_message("channel [%p] read [%i] bytes of body from %s:%i\n%s" ,obj ,content_length ,obj->peer_name ,obj->peer_port ,obj->input_stream.read_ptr);*/ belle_sip_channel_message_ready(obj); return BELLE_SIP_CONTINUE; } /*body is not finished, we need more data*/ return BELLE_SIP_STOP; }