| 1201 | } |
| 1202 | |
| 1203 | static void |
| 1204 | maskOsCacheHeaders(TSHttpTxn txnp) |
| 1205 | { |
| 1206 | TSMBuffer bufp; |
| 1207 | TSMLoc hdr_loc; |
| 1208 | if (TSHttpTxnServerRespGet(txnp, &bufp, &hdr_loc) != TS_SUCCESS) { |
| 1209 | TSError("[esi][%s] Couldn't get server response from txn", __FUNCTION__); |
| 1210 | return; |
| 1211 | } |
| 1212 | int n_mime_headers = TSMimeHdrFieldsCount(bufp, hdr_loc); |
| 1213 | TSMLoc field_loc; |
| 1214 | const char *name, *value; |
| 1215 | int name_len, value_len, n_field_values; |
| 1216 | bool os_response_cacheable, mask_header; |
| 1217 | string masked_name; |
| 1218 | os_response_cacheable = true; |
| 1219 | for (int i = 0; i < n_mime_headers; ++i) { |
| 1220 | field_loc = TSMimeHdrFieldGet(bufp, hdr_loc, i); |
| 1221 | if (!field_loc) { |
| 1222 | Dbg(dbg_ctl_local, "[%s] Error while obtaining header field #%d", __FUNCTION__, i); |
| 1223 | continue; |
| 1224 | } |
| 1225 | name = TSMimeHdrFieldNameGet(bufp, hdr_loc, field_loc, &name_len); |
| 1226 | if (name) { |
| 1227 | mask_header = false; |
| 1228 | n_field_values = TSMimeHdrFieldValuesCount(bufp, hdr_loc, field_loc); |
| 1229 | for (int j = 0; j < n_field_values; ++j) { |
| 1230 | value = TSMimeHdrFieldValueStringGet(bufp, hdr_loc, field_loc, j, &value_len); |
| 1231 | if (nullptr == value || !value_len) { |
| 1232 | Dbg(dbg_ctl_local, "[%s] Error while getting value #%d of header [%.*s]", __FUNCTION__, j, name_len, name); |
| 1233 | } else { |
| 1234 | bool is_cache_header = checkForCacheHeader(name, name_len, value, value_len, os_response_cacheable); |
| 1235 | if (!os_response_cacheable) { |
| 1236 | break; |
| 1237 | } |
| 1238 | if (is_cache_header) { |
| 1239 | Dbg(dbg_ctl_local, "[%s] Masking OS cache header [%.*s] with value [%.*s]. ", __FUNCTION__, name_len, name, value_len, |
| 1240 | value); |
| 1241 | mask_header = true; |
| 1242 | } |
| 1243 | } // end if got value string |
| 1244 | } // end value iteration |
| 1245 | if (mask_header) { |
| 1246 | masked_name.assign(HEADER_MASK_PREFIX); |
| 1247 | masked_name.append(name, name_len); |
| 1248 | if (TSMimeHdrFieldNameSet(bufp, hdr_loc, field_loc, masked_name.data(), masked_name.size()) != TS_SUCCESS) { |
| 1249 | TSError("[esi][%s] Couldn't rename header [%.*s]", __FUNCTION__, name_len, name); |
| 1250 | } |
| 1251 | } |
| 1252 | } // end if got header name |
| 1253 | TSHandleMLocRelease(bufp, hdr_loc, field_loc); |
| 1254 | if (!os_response_cacheable) { |
| 1255 | break; |
| 1256 | } |
| 1257 | } // end header iteration |
| 1258 | TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); |
| 1259 | } |
| 1260 |
no test coverage detected