void i2c::write( const buffer_t& data ) { setAddress(); if( ::write(mDevice, data.data(), data.size()) < 0 ) { ostringstream os; os << "unable to write: " << strerror( errno ); throw runtime_error{ move( os.str() ) }; } }
virtual size_t read(buffer_t& buffer, size_t len) { auto l = buffer_.read(buffer.data(), len); if(buffer_.size() < buffer_update*frame_size_) fill_buffer(); return l; }
void Client_connection::recv_response(buffer_t buf) { if (buf->empty()) { end_response({Error::NO_REPLY}); return; } const std::string data{(char*) buf->data(), buf->size()}; // restart timer since we got data if(timer_.is_running()) timer_.restart(timeout_dur_); // create response if not exist if(res_ == nullptr) { try { res_ = make_response(data); // this also parses } catch(...) { end_response({Error::INVALID}); return; } } // if there already is a response else { // this is the case when Status line is received, but not yet headers. if(not res_->headers_complete() && req_->method() != HEAD) { *res_ << data; res_->parse(); } // here we assume all headers has already been received (could not be true?) else { // add chunks of body data res_->add_chunk(data); } } const auto& header = res_->header(); // TODO: Temporary, not good enough // if(res_->is_complete()) // Assume we want some headers if(!header.is_empty()) { if(header.has_field(header::Content_Length)) { try { const unsigned conlen = std::stoul(std::string(header.value(header::Content_Length))); const unsigned body_size = res_->body().size(); //printf("<http::Connection> [%s] Data: %u ConLen: %u Body:%u\n", // req_->uri().to_string().to_string().c_str(), data.size(), conlen, body_size); // risk buffering forever if no timeout if(body_size == conlen) { end_response(); } else if(body_size > conlen) { end_response({Error::INVALID}); } } catch(...) { end_response({Error::INVALID}); } } else end_response(); } else if(req_->method() == HEAD) { end_response(); } }