comparison vamp-client/CapnpRRClient.h @ 146:c4f841ccb208

Allow the completeness checker to report failure (invalid message) as well as incompleteness
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 19 Jan 2017 09:57:58 +0000
parents 228a66adfb30
children 96488e9e9096
comparison
equal deleted inserted replaced
145:228a66adfb30 146:c4f841ccb208
73 // unsigned to avoid undefined behaviour on possible wrap 73 // unsigned to avoid undefined behaviour on possible wrap
74 typedef uint32_t ReqId; 74 typedef uint32_t ReqId;
75 75
76 class CompletenessChecker : public MessageCompletenessChecker { 76 class CompletenessChecker : public MessageCompletenessChecker {
77 public: 77 public:
78 bool isComplete(const std::vector<char> &message) const override { 78 State check(const std::vector<char> &message) const override {
79
79 auto karr = toKJArray(message); 80 auto karr = toKJArray(message);
80 size_t words = karr.size(); 81 size_t words = karr.size();
81 size_t expected = capnp::expectedSizeInWordsFromPrefix(karr); 82 size_t expected = capnp::expectedSizeInWordsFromPrefix(karr);
83
84 // Lacking a way to definitively check whether a message
85 // is valid or not, we would still like to trap obvious
86 // cases where a programming mistake results in garbage
87 // being returned from the server. We impose a limit on
88 // message size and, if a prefix is projected to exceed
89 // that limit, call it invalid. If an extractor wants to
90 // return a feature set greater than a gigaword in size,
91 // it'll just have to do it across multiple process calls.
92 size_t limit = size_t(1) << 30;
93
82 // cerr << "CompletenessChecker: message.size() = " << message.size() 94 // cerr << "CompletenessChecker: message.size() = " << message.size()
83 // << ", words = " << words << ", expected = " << expected << endl; 95 // << ", words = " << words << ", limit = " << limit << ", expected = " << expected << endl;
96
84 if (words > expected) { 97 if (words > expected) {
85 std::cerr << "WARNING: obtained more data than expected (" 98 std::cerr << "WARNING: obtained more data than expected ("
86 << words << " " << sizeof(capnp::word) 99 << words << " " << sizeof(capnp::word)
87 << "-byte words, expected " 100 << "-byte words, expected "
88 << expected << ")" << std::endl; 101 << expected << ")" << std::endl;
102 return Complete;
103 } else if (words == expected) {
104 return Complete;
105 } else if (expected > limit) {
106 return Invalid;
107 } else {
108 return Incomplete;
89 } 109 }
90 return words >= expected;
91 } 110 }
92 }; 111 };
93 112
94 public: 113 public:
95 CapnpRRClient(SynchronousTransport *transport, //!!! ownership? shared ptr? 114 CapnpRRClient(SynchronousTransport *transport, //!!! ownership? shared ptr?