* Main I/O routines
*/
+static inline void
+http_client_rbuf_cut( http_client_t *hc, size_t cut )
+{
+ size_t len = hc->hc_rpos - cut;
+ memmove(hc->hc_rbuf, hc->hc_rbuf + cut, len);
+ hc->hc_rpos = len;
+}
+
static void
http_client_cmd_destroy( http_client_t *hc, http_client_wcmd_t *cmd )
{
if (res < 0)
return http_client_flush(hc, res);
}
- len = hc->hc_rpos - hc->hc_hsize;
- hc->hc_rpos = 0;
if (hc->hc_code == HTTP_STATUS_CONTINUE) {
- memmove(hc->hc_rbuf, hc->hc_rbuf + hc->hc_hsize, len);
- hc->hc_rpos = len;
+ http_client_rbuf_cut(hc, hc->hc_hsize);
goto next_header;
}
if (hc->hc_version == RTSP_VERSION_1_0 &&
(hc->hc_csize == -1 || !hc->hc_csize)) {
hc->hc_csize = -1;
hc->hc_in_data = 0;
- memmove(hc->hc_rbuf, hc->hc_rbuf + hc->hc_hsize, len);
- hc->hc_rpos = len;
+ http_client_rbuf_cut(hc, hc->hc_hsize);
return http_client_finish(hc);
} else {
hc->hc_in_data = 1;
}
+ len = hc->hc_rpos - hc->hc_hsize;
+ hc->hc_rpos = 0;
res = http_client_data_received(hc, hc->hc_rbuf + hc->hc_hsize, len, 1);
if (res < 0)
return http_client_flush(hc, res);
rtsp_data:
/* RTSP embedded data */
r = 0;
- res = HTTP_CON_RECEIVING;
hc->hc_in_data = 0;
hc->hc_in_rtp_data = 0;
while (hc->hc_rpos > r + 3) {
+ if (hc->hc_rbuf[r] != '$')
+ break;
hc->hc_csize = 4 + ((hc->hc_rbuf[r+2] << 8) | hc->hc_rbuf[r+3]);
hc->hc_chunked = 0;
if (r + hc->hc_csize > hc->hc_rpos) {
- memmove(hc->hc_rbuf, hc->hc_rbuf + r, hc->hc_rpos - r);
- hc->hc_rpos -= r;
+ http_client_rbuf_cut(hc, r);
hc->hc_in_rtp_data = 1;
if (r == 0)
goto retry;
http_client_put(hc);
if (res < 0)
return res;
- } else {
- res = 0;
}
r += hc->hc_csize;
hc->hc_in_rtp_data = 1;
hc->hc_in_rtp_data = 0;
if (res < 0)
return http_client_flush(hc, res);
- res = HTTP_CON_RECEIVING;
- if (hc->hc_rpos < r + 4 || hc->hc_rbuf[r] != '$') {
- memmove(hc->hc_rbuf, hc->hc_rbuf + r, hc->hc_rpos - r);
- hc->hc_rpos -= r;
- goto next_header;
- }
}
- return res;
+ if (r > 0) {
+ http_client_rbuf_cut(hc, r);
+ goto next_header;
+ }
+ return HTTP_CON_RECEIVING;
}
int