   * the agent checks that the FINGERPRINT Attribute is present and contains the correct value. If any errors
   * are detected, the Message is silently discarded. In the case when STUN is being multiplexed with another Protocol,
   * an error may indicate that this is not really a STUN Message; in this case, the agent should try to parse
   * the Message as a different Protocol.
   *
   * Since all STUN attributes are padded to a multiple of 4 bytes, the last 2 bits of this field are always zero.
   * This provides another way to distinguish STUN packets from packets of other protocols.
   */
  std::optional<std::pair<Header, uint16_t>> Header::parse(BufferReader &reader) {
    MS_GET(raw_header, reader.read_raw(header_length), std::nullopt)
    NetworkHeader raw{net::ntoh(*reinterpret_cast<const NetworkHeader *>(raw_header))};
