* @brief Set a header to a specific value. * * This will avoid going to through a remove / add sequence in case of an existing header but clean. * * @param bufp request's buffer * @param hdrLoc request's header location * @param header header name * @param headerlen header name len * @param value the new value * @param valuelen length of the value * @return true - OK, false - failed */
| 133 | * @return true - OK, false - failed |
| 134 | */ |
| 135 | bool |
| 136 | setHeader(TSMBuffer bufp, TSMLoc hdrLoc, const char *header, int headerlen, const char *value, int valuelen) |
| 137 | { |
| 138 | if (!bufp || !hdrLoc || !header || headerlen <= 0 || !value || valuelen <= 0) { |
| 139 | return false; |
| 140 | } |
| 141 | |
| 142 | bool ret = false; |
| 143 | TSMLoc fieldLoc = TSMimeHdrFieldFind(bufp, hdrLoc, header, headerlen); |
| 144 | |
| 145 | if (!fieldLoc) { |
| 146 | // No existing header, so create one |
| 147 | if (TS_SUCCESS == TSMimeHdrFieldCreateNamed(bufp, hdrLoc, header, headerlen, &fieldLoc)) { |
| 148 | if (TS_SUCCESS == TSMimeHdrFieldValueStringSet(bufp, hdrLoc, fieldLoc, -1, value, valuelen)) { |
| 149 | TSMimeHdrFieldAppend(bufp, hdrLoc, fieldLoc); |
| 150 | ret = true; |
| 151 | } |
| 152 | TSHandleMLocRelease(bufp, hdrLoc, fieldLoc); |
| 153 | } |
| 154 | } else { |
| 155 | TSMLoc tmp = nullptr; |
| 156 | bool first = true; |
| 157 | |
| 158 | while (fieldLoc) { |
| 159 | tmp = TSMimeHdrFieldNextDup(bufp, hdrLoc, fieldLoc); |
| 160 | if (first) { |
| 161 | first = false; |
| 162 | if (TS_SUCCESS == TSMimeHdrFieldValueStringSet(bufp, hdrLoc, fieldLoc, -1, value, valuelen)) { |
| 163 | ret = true; |
| 164 | } |
| 165 | } else { |
| 166 | TSMimeHdrFieldDestroy(bufp, hdrLoc, fieldLoc); |
| 167 | } |
| 168 | TSHandleMLocRelease(bufp, hdrLoc, fieldLoc); |
| 169 | fieldLoc = tmp; |
| 170 | } |
| 171 | } |
| 172 | |
| 173 | return ret; |
| 174 | } |
| 175 | |
| 176 | /** |
| 177 | * @brief Dump a header on stderr |
no test coverage detected