'Generic Commit'
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
#include "update_handler.hpp"
|
#include "update_handler.hpp"
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
#include <drogon/MultiPart.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
namespace simple_object_storage {
|
namespace simple_object_storage {
|
||||||
@@ -32,9 +33,41 @@ void UpdateHandler::handle_update_object(const drogon::HttpRequestPtr& req, std:
|
|||||||
callback(resp);
|
callback(resp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (contentType.find("multipart/form-data") != std::string::npos ||
|
} else if (contentType.find("multipart/form-data") != std::string::npos) {
|
||||||
contentType.find("application/x-www-form-urlencoded") != std::string::npos) {
|
// Handle multipart form data
|
||||||
// Handle form data
|
body = nlohmann::json::object();
|
||||||
|
|
||||||
|
// Parse the multipart form data
|
||||||
|
drogon::MultiPartParser formParser;
|
||||||
|
if (formParser.parse(req) != 0) {
|
||||||
|
resp->setStatusCode(drogon::k400BadRequest);
|
||||||
|
nlohmann::json response = {{"result", "error"}, {"error", "Failed to parse multipart data"}};
|
||||||
|
resp->setBody(response.dump());
|
||||||
|
resp->setContentTypeCode(drogon::CT_APPLICATION_JSON);
|
||||||
|
callback(resp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto ¶meters = formParser.getParameters();
|
||||||
|
|
||||||
|
// Get hash from form data
|
||||||
|
auto hash_it = parameters.find("hash");
|
||||||
|
if (hash_it != parameters.end()) {
|
||||||
|
body["hash"] = hash_it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse metadata if present
|
||||||
|
auto meta_it = parameters.find("metadata");
|
||||||
|
if (meta_it != parameters.end()) {
|
||||||
|
try {
|
||||||
|
body["metadata"] = nlohmann::json::parse(meta_it->second);
|
||||||
|
} catch (const nlohmann::json::parse_error& e) {
|
||||||
|
// If parsing as JSON fails, treat it as a string
|
||||||
|
body["metadata"] = meta_it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (contentType.find("application/x-www-form-urlencoded") != std::string::npos) {
|
||||||
|
// Handle URL-encoded form data
|
||||||
body = nlohmann::json::object();
|
body = nlohmann::json::object();
|
||||||
const auto& form = req->getParameters();
|
const auto& form = req->getParameters();
|
||||||
|
|
||||||
|
@@ -402,6 +402,81 @@ sleep 3
|
|||||||
# Now try a request with a valid token - should be rate limited
|
# Now try a request with a valid token - should be rate limited
|
||||||
echo "Attempting request with valid token (should NOT be rate limited)"
|
echo "Attempting request with valid token (should NOT be rate limited)"
|
||||||
RESPONSE=$(curl -s -X PUT -H "Authorization: Bearer ${WRITE_TOKEN}" -F "file=@${SCRIPT_DIR}/${SCRIPT_NAME}" -F "metadata={\"labeltags\":[\"test:latest\"]}" "${HOSTURL}/upload")
|
RESPONSE=$(curl -s -X PUT -H "Authorization: Bearer ${WRITE_TOKEN}" -F "file=@${SCRIPT_DIR}/${SCRIPT_NAME}" -F "metadata={\"labeltags\":[\"test:latest\"]}" "${HOSTURL}/upload")
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------------------------
|
||||||
|
title "8: Test update endpoint"
|
||||||
|
|
||||||
|
# First upload a test file
|
||||||
|
UPLOAD_RESPONSE=$(curl -s -X PUT \
|
||||||
|
-H "Authorization: Bearer ${WRITE_TOKEN}" \
|
||||||
|
-F "file=@${SCRIPT_DIR}/${SCRIPT_NAME}" \
|
||||||
|
-F "metadata={\"labeltags\":[\"test:update\"]}" \
|
||||||
|
"${HOSTURL}/upload")
|
||||||
|
|
||||||
|
HASH=$(echo "${UPLOAD_RESPONSE}" | jq -r '.hash')
|
||||||
|
if [ -z "${HASH}" ] || [ "${HASH}" = "null" ]; then
|
||||||
|
die "Failed to upload test file for update test"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test 8.1: Update metadata using JSON
|
||||||
|
UPDATED_METADATA='{"labeltags":["test:updated", "version:1.0"], "new_field":"test_value"}'
|
||||||
|
UPDATE_RESPONSE=$(curl -s -X PUT \
|
||||||
|
-H "Authorization: Bearer ${WRITE_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"hash\":\"${HASH}\", \"metadata\":${UPDATED_METADATA}}" \
|
||||||
|
"${HOSTURL}/update")
|
||||||
|
|
||||||
|
echo "Update response: ${UPDATE_RESPONSE}"
|
||||||
|
if [ "$(echo "${UPDATE_RESPONSE}" | jq -r '.result')" != "success" ]; then
|
||||||
|
die "Failed to update metadata via JSON"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify the update
|
||||||
|
UPDATED_METADATA_RESPONSE=$(curl -s "${HOSTURL}/meta/${HASH}")
|
||||||
|
if ! echo "${UPDATED_METADATA_RESPONSE}" | jq -e '.metadata.new_field == "test_value"' | grep -q true; then
|
||||||
|
die "Metadata was not updated correctly via JSON"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test 8.2: Update metadata using form data
|
||||||
|
# Update with form data using raw JSON string
|
||||||
|
UPDATE_FORM_RESPONSE=$(curl -s -X PUT \
|
||||||
|
-H "Authorization: Bearer ${WRITE_TOKEN}" \
|
||||||
|
-F "hash=${HASH}" \
|
||||||
|
-F 'metadata={"labeltags":["test:form_updated"], "form_field":"form_value"}' \
|
||||||
|
"${HOSTURL}/update")
|
||||||
|
|
||||||
|
echo "Form update response: ${UPDATE_FORM_RESPONSE}"
|
||||||
|
if [ "$(echo "${UPDATE_FORM_RESPONSE}" | jq -r '.result')" != "success" ]; then
|
||||||
|
die "Failed to update metadata via form data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify the form update
|
||||||
|
UPDATED_FORM_METADATA_RESPONSE=$(curl -s "${HOSTURL}/meta/${HASH}")
|
||||||
|
if ! echo "${UPDATED_FORM_METADATA_RESPONSE}" | jq -e '.metadata.form_field == "form_value"' | grep -q true; then
|
||||||
|
die "Metadata was not updated correctly via form data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test 8.3: Test error cases
|
||||||
|
# Missing hash
|
||||||
|
MISSING_HASH_RESPONSE=$(curl -s -X PUT \
|
||||||
|
-H "Authorization: Bearer ${WRITE_TOKEN}" \
|
||||||
|
-d '{"metadata":{}}' \
|
||||||
|
"${HOSTURL}/update")
|
||||||
|
if [ "$(echo "${MISSING_HASH_RESPONSE}" | jq -r '.error')" != "Missing 'hash' or 'metadata' field in request body" ]; then
|
||||||
|
die "Expected error for missing hash, got: ${MISSING_HASH_RESPONSE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Missing metadata
|
||||||
|
MISSING_METADATA_RESPONSE=$(curl -s -X PUT \
|
||||||
|
-H "Authorization: Bearer ${WRITE_TOKEN}" \
|
||||||
|
-d "{\"hash\":\"${HASH}\"}" \
|
||||||
|
"${HOSTURL}/update")
|
||||||
|
if [ "$(echo "${MISSING_METADATA_RESPONSE}" | jq -r '.error')" != "Missing 'hash' or 'metadata' field in request body" ]; then
|
||||||
|
die "Expected error for missing metadata, got: ${MISSING_METADATA_RESPONSE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
curl -s -H "Authorization: Bearer ${WRITE_TOKEN}" "${HOSTURL}/deleteobject?hash=${HASH}" > /dev/null
|
||||||
if echo "${RESPONSE}" | jq -r '.error' | grep -q "Too many authentication attempts"; then
|
if echo "${RESPONSE}" | jq -r '.error' | grep -q "Too many authentication attempts"; then
|
||||||
die "Expected no rate limit error, got: ${RESPONSE}"
|
die "Expected no rate limit error, got: ${RESPONSE}"
|
||||||
fi
|
fi
|
||||||
|
Reference in New Issue
Block a user