/** * parse a HTTP header into a suitable metadata or sysmd * * @param header * @param value * @param metadatum_func optional * @param cb_arg for metadatum_func * @param metadata optional * @param sysmdp optional * * @return */ dpl_status_t dpl_cdmi_get_metadatum_from_header(const char *header, const char *value, dpl_metadatum_func_t metadatum_func, void *cb_arg, dpl_dict_t *metadata, dpl_sysmd_t *sysmdp) { dpl_status_t ret, ret2; if (!strncmp(header, DPL_X_OBJECT_META_PREFIX, strlen(DPL_X_OBJECT_META_PREFIX))) { char *key; key = (char *) header + strlen(DPL_X_OBJECT_META_PREFIX); ret2 = dpl_cdmi_get_metadatum_from_string(key, value, metadatum_func, cb_arg, metadata, sysmdp); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } else if (!strncmp(header, DPL_X_CONTAINER_META_PREFIX, strlen(DPL_X_CONTAINER_META_PREFIX))) { char *key; key = (char *) header + strlen(DPL_X_CONTAINER_META_PREFIX); ret2 = dpl_cdmi_get_metadatum_from_string(key, value, metadatum_func, cb_arg, metadata, sysmdp); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } else { if (sysmdp) { if (!strcmp(header, "content-length")) { sysmdp->mask |= DPL_SYSMD_MASK_SIZE; sysmdp->size = atoi(value); } if (!strcmp(header, "last-modified")) { sysmdp->mask |= DPL_SYSMD_MASK_MTIME; sysmdp->mtime = dpl_get_date(value, NULL); } if (!strcmp(header, "etag")) { int value_len = strlen(value); if (value_len < DPL_SYSMD_ETAG_SIZE && value_len >= 2) { sysmdp->mask |= DPL_SYSMD_MASK_ETAG; //supress double quotes strncpy(sysmdp->etag, value + 1, DPL_SYSMD_ETAG_SIZE); sysmdp->etag[value_len-2] = 0; } } } } ret = DPL_SUCCESS; end: return ret; }
/** * parse a HTTP header into a suitable metadata or sysmd * * @param header * @param value * @param metadatum_func optional * @param cb_arg for metadatum_func * @param metadata optional * @param sysmdp optional * * @return */ dpl_status_t dpl_s3_get_metadatum_from_header(const char *header, const char *value, dpl_metadatum_func_t metadatum_func, void *cb_arg, dpl_dict_t *metadata, dpl_sysmd_t *sysmdp) { dpl_status_t ret, ret2; if (!strncmp(header, DPL_X_AMZ_META_PREFIX, strlen(DPL_X_AMZ_META_PREFIX))) { char *key; key = (char *) header + strlen(DPL_X_AMZ_META_PREFIX); if (metadatum_func) { dpl_value_t val; val.type = DPL_VALUE_STRING; val.string = (char *) value; ret2 = metadatum_func(cb_arg, key, &val); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } if (metadata) { ret2 = dpl_dict_add(metadata, key, value, 1); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } } else { if (sysmdp) { if (!strcmp(header, "content-length")) { sysmdp->mask |= DPL_SYSMD_MASK_SIZE; sysmdp->size = atoi(value); } else if (!strcmp(header, "last-modified")) { sysmdp->mask |= DPL_SYSMD_MASK_MTIME; sysmdp->mtime = dpl_get_date(value, NULL); } else if (!strcmp(header, "etag")) { int value_len = strlen(value); if (value_len < DPL_SYSMD_ETAG_SIZE && value_len >= 2) { sysmdp->mask |= DPL_SYSMD_MASK_ETAG; //supress double quotes strncpy(sysmdp->etag, value + 1, DPL_SYSMD_ETAG_SIZE); sysmdp->etag[value_len-2] = 0; } } } } ret = DPL_SUCCESS; end: return ret; }