1
#pragma once
2

            
3
#include <string>
4

            
5
#include "envoy/http/header_map.h"
6
#include "envoy/http/message.h"
7

            
8
#include "source/common/buffer/buffer_impl.h"
9
#include "source/common/common/non_copyable.h"
10
#include "source/common/http/header_map_impl.h"
11

            
12
namespace Envoy {
13
namespace Http {
14

            
15
/**
16
 * Implementation of Http::Message. This implementation does not support streaming.
17
 */
18
template <class HeadersInterfaceType, class HeadersImplType, class TrailersInterfaceType,
19
          class TrailersImplType>
20
class MessageImpl : public Message<HeadersInterfaceType, TrailersInterfaceType> {
21
public:
22
3252
  MessageImpl() : headers_(HeadersImplType::create()) {}
23
957
  MessageImpl(std::unique_ptr<HeadersInterfaceType>&& headers) : headers_(std::move(headers)) {}
24

            
25
  // Http::Message
26
32002
  HeadersInterfaceType& headers() override { return *headers_; }
27
2376
  Buffer::Instance& body() override { return body_; }
28
25
  TrailersInterfaceType* trailers() override { return trailers_.get(); }
29
16
  void trailers(std::unique_ptr<TrailersInterfaceType>&& trailers) override {
30
16
    trailers_ = std::move(trailers);
31
16
  }
32
217
  std::string bodyAsString() const override { return body_.toString(); }
33

            
34
private:
35
  std::unique_ptr<HeadersInterfaceType> headers_;
36
  Buffer::OwnedImpl body_;
37
  std::unique_ptr<TrailersInterfaceType> trailers_;
38
};
39

            
40
using RequestMessageImpl =
41
    MessageImpl<RequestHeaderMap, RequestHeaderMapImpl, RequestTrailerMap, RequestTrailerMapImpl>;
42
using ResponseMessageImpl = MessageImpl<ResponseHeaderMap, ResponseHeaderMapImpl,
43
                                        ResponseTrailerMap, ResponseTrailerMapImpl>;
44

            
45
} // namespace Http
46
} // namespace Envoy