/** Receive all HTTP content as a single std::string */ std::string osl::http_connection::receive(void) { std::string lengthStr=receive_header("Content-Length"); int length=0; sscanf(lengthStr.c_str(),"%d",&length); p.status(1,"Retrieving "+int2str(length/1024)+" KiB of HTTP data from "+host); std::string data(length,0x00); enum {chunkSize=8*1024}; for (int start=0;start<length;start+=chunkSize) { int amt=my_min(data.size()-start,chunkSize); skt_recvN(s,&data[start],amt); p.status(2,"Retrieved "+int2str((start+amt)/1024)+" KiB so far from "+host); } if (length<1024) p.status(3,"Incoming data: "+data); return data; }
void EtagStoreResource::handle_etag(const Http::Request& request, Http::Response& response) { // TODO http://redmine.webtoolkit.eu/issues/2471 // const std::string* cookie_value = request.getCookieValue(cookie_name_); std::string cookies = request.headerValue("Cookie"); if (cookies.empty()) { return; } std::string pattern = cookie_name_ + "="; int cookie_begin = cookies.find(pattern); if (cookie_begin == std::string::npos) { return; } cookie_begin += pattern.length(); int cookie_end = cookies.find(';', cookie_begin); int cookie_length = (cookie_end == -1) ? -1 : (cookie_end - cookie_begin); std::string cookie_value = cookies.substr(cookie_begin, cookie_length); // std::string etag_value = request.headerValue(receive_header()); boost::mutex::scoped_lock lock(cookie_to_etag_mutex_); Map::iterator it = cookie_to_etag_.find(cookie_value); if (it == cookie_to_etag_.end()) { return; } Etag& etag = it->second; if (etag_value.empty()) { etag_value = etag.def; } etag.from_client = etag_value; if (!etag.to_client.empty()) { response.addHeader(send_header(), etag.to_client); etag.to_client.clear(); } else { etag.handler(etag.from_client); } if (!etag.from_client.empty()) { response.addHeader(send_header(), etag.from_client); } }
static void virtio_net_receive(void *opaque, const uint8_t *buf, int size) { VirtIONet *n = opaque; struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL; size_t hdr_len, offset, i; if (!do_virtio_net_can_receive(n, size)) return; /* hdr_len refers to the header we supply to the guest */ hdr_len = n->mergeable_rx_bufs ? sizeof(struct virtio_net_hdr_mrg_rxbuf) : sizeof(struct virtio_net_hdr); offset = i = 0; while (offset < size) { VirtQueueElement elem; int len, total; struct iovec sg[VIRTQUEUE_MAX_SIZE]; len = total = 0; if ((i != 0 && !n->mergeable_rx_bufs) || virtqueue_pop(n->rx_vq, &elem) == 0) { if (i == 0) return; fprintf(stderr, "virtio-net truncating packet\n"); exit(1); } if (elem.in_num < 1) { fprintf(stderr, "virtio-net receive queue contains no in buffers\n"); exit(1); } if (!n->mergeable_rx_bufs && elem.in_sg[0].iov_len != hdr_len) { fprintf(stderr, "virtio-net header not in first element\n"); exit(1); } memcpy(&sg, &elem.in_sg[0], sizeof(sg[0]) * elem.in_num); if (i == 0) { if (n->mergeable_rx_bufs) mhdr = (struct virtio_net_hdr_mrg_rxbuf *)sg[0].iov_base; offset += receive_header(n, sg, elem.in_num, buf + offset, size - offset, hdr_len); total += hdr_len; } /* copy in packet. ugh */ len = iov_fill(sg, elem.in_num, buf + offset, size - offset); total += len; /* signal other side */ virtqueue_fill(n->rx_vq, &elem, total, i++); offset += len; } if (mhdr) mhdr->num_buffers = i; virtqueue_flush(n->rx_vq, i); virtio_notify(&n->vdev, n->rx_vq); }