diff --git a/net/packet-data-source.hh b/net/packet-data-source.hh new file mode 100644 index 0000000000..178607f989 --- /dev/null +++ b/net/packet-data-source.hh @@ -0,0 +1,35 @@ +#ifndef _PACKET_DATA_SOURCE_HH +#define _PACKET_DATA_SOURCE_HH + +#include "core/reactor.hh" +#include "net/packet.hh" + +namespace net { + +class packet_data_source final : public data_source_impl { + size_t _cur_frag = 0; + packet _p; +public: + explicit packet_data_source(net::packet&& p) + : _p(std::move(p)) + {} + + virtual future> get() override { + if (_cur_frag != _p.nr_frags()) { + auto& f = _p.fragments()[_cur_frag++]; + return make_ready_future>( + temporary_buffer(f.base, f.size, + make_deleter(deleter(), [p = _p.share()] () mutable {}))); + } + return make_ready_future>(temporary_buffer(0)); + } +}; + +static inline +input_stream as_input_stream(packet&& p) { + return input_stream(data_source(std::make_unique(std::move(p)))); +} + +} + +#endif