| 77 | } |
| 78 | |
| 79 | int HeadersBase::insert(std::string_view key, std::string_view value, int allow_dup) { |
| 80 | if (!allow_dup) { |
| 81 | auto it = find(key); |
| 82 | if (it != end()) return -EEXIST; |
| 83 | } |
| 84 | uint64_t vbegin = m_buf_size + key.size() + 2; |
| 85 | uint64_t new_size = vbegin + value.size() + 2; |
| 86 | if (new_size + (m_kv_size + 1) * sizeof(KV) > m_buf_capacity) |
| 87 | LOG_ERROR_RETURN(ENOBUFS, -1, "no buffer"); |
| 88 | auto ptr = m_buf + m_buf_size; |
| 89 | buf_append(ptr, key); |
| 90 | buf_append(ptr, ": "); |
| 91 | buf_append(ptr, value); |
| 92 | buf_append(ptr, "\r\n"); |
| 93 | m_last_kv = kv_add_sort({{m_buf_size, (uint16_t)key.size()}, |
| 94 | {(uint16_t)vbegin, (uint16_t)value.size()}}) - kv_begin(); |
| 95 | m_buf_size = (uint16_t)new_size; |
| 96 | return 0; |
| 97 | } |
| 98 | |
| 99 | bool HeadersBase::value_append(std::string_view value) { |
| 100 | if (m_last_kv >= m_kv_size) return false; |