Skip to content

Commit 58801d2

Browse files
committed
Added-json-header
1 parent 6454681 commit 58801d2

File tree

2 files changed

+94
-24
lines changed

2 files changed

+94
-24
lines changed

commands/curation/curationaudit.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,28 @@ const (
8484
waiverHeader = "X-Artifactory-Curation-Request-Waiver"
8585
)
8686

87-
// generateWaiverHeaderValue creates a header value with a unique batch ID
8887
func generateWaiverHeaderValue() string {
89-
batchID := fmt.Sprintf("batch_%s", uuid.New().String()[:8])
90-
return fmt.Sprintf("syn_JFrog-Curation-Client_%s", batchID)
88+
batchID := uuid.New().String()
89+
headerData := map[string]string{
90+
"batch_id": batchID,
91+
}
92+
jsonData, _ := json.Marshal(headerData)
93+
return string(jsonData)
94+
}
95+
96+
// addFieldToWaiverHeader adds a field to the existing waiver header JSON and returns the updated JSON string
97+
func addFieldToWaiverHeader(fieldName string, fieldValue interface{}) (string, error) {
98+
// Parse the existing header
99+
var headerData map[string]interface{}
100+
if err := json.Unmarshal([]byte(waiverHeaderValue), &headerData); err != nil {
101+
return "", fmt.Errorf("failed to parse waiver header: %v", err)
102+
}
103+
headerData[fieldName] = fieldValue
104+
updatedHeaderData, err := json.Marshal(headerData)
105+
if err != nil {
106+
return "", fmt.Errorf("failed to marshal updated header: %v", err)
107+
}
108+
return string(updatedHeaderData), nil
91109
}
92110

93111
// createRequestDetails creates a copy of httpClientDetails for thread-safe header modification
@@ -919,9 +937,7 @@ func (nc *treeAnalyzer) fetchNodeStatus(node xrayUtils.GraphNode, p *sync.Map) e
919937
func (nc *treeAnalyzer) getBlockedPackageDetails(packageUrl string, name string, version string) (*PackageStatus, error) {
920938
// Create a copy of httpClientDetails for this request to avoid modifying the shared one
921939
requestDetails := nc.createRequestDetails()
922-
923-
// Set the header for regular GET request
924-
requestDetails.Headers[waiverHeader] = waiverHeaderValue
940+
requestDetails.Headers[waiverHeader] = "syn"
925941

926942
getResp, respBody, _, err := nc.rtManager.Client().SendGet(packageUrl, true, &requestDetails)
927943
if err != nil {
@@ -963,16 +979,14 @@ func (nc *treeAnalyzer) getBlockedPackageDetails(packageUrl string, name string,
963979
return nil, nil
964980
}
965981

966-
// sendCompletedRequest sends a final request with the _completed header
967982
func (nc *treeAnalyzer) sendCompletedRequest(packageUrl string) error {
968-
// Create a copy of httpClientDetails for this request
969983
requestDetails := nc.createRequestDetails()
970-
971-
// Set the header with _completed suffix
972-
requestDetails.Headers[waiverHeader] = waiverHeaderValue + "_completed"
973-
974-
// Send a HEAD request with the completed header
975-
_, _, err := nc.rtManager.Client().SendHead(packageUrl, &requestDetails)
984+
completedHeaderData, err := addFieldToWaiverHeader("completed", true)
985+
if err != nil {
986+
return err
987+
}
988+
requestDetails.Headers[waiverHeader] = completedHeaderData
989+
_, _, err = nc.rtManager.Client().SendHead(packageUrl, &requestDetails)
976990
return err
977991
}
978992

commands/curation/curationaudit_test.go

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -488,10 +488,15 @@ func createTempHomeDirWithConfig(t *testing.T, basePathToTests string, testCase
488488
func TestCurationHeaders(t *testing.T) {
489489
// Test that batch ID generation works correctly
490490
headerValue := generateWaiverHeaderValue()
491-
assert.True(t, strings.HasPrefix(headerValue, "syn_JFrog-Curation-Client_batch_"))
492-
assert.Len(t, strings.Split(headerValue, "_"), 4) // syn_JFrog-Curation-Client_batch_<id>
493491

494-
// Test that completed request adds "_completed" suffix
492+
// Verify it's valid JSON with batch_id
493+
var headerData map[string]interface{}
494+
err := json.Unmarshal([]byte(headerValue), &headerData)
495+
require.NoError(t, err)
496+
assert.Contains(t, headerData, "batch_id")
497+
assert.NotEmpty(t, headerData["batch_id"])
498+
499+
// Test that completed request adds "completed" flag
495500
var capturedHeader http.Header
496501
testHandler := func(w http.ResponseWriter, r *http.Request) {
497502
capturedHeader = r.Header.Clone()
@@ -506,22 +511,73 @@ func TestCurationHeaders(t *testing.T) {
506511
require.NoError(t, err)
507512
rtManager, err := rtUtils.CreateServiceManager(mockServerDetails, 2, 0, false)
508513
require.NoError(t, err)
509-
510514
analyzer := &treeAnalyzer{
511515
rtManager: rtManager,
512516
httpClientDetails: rtAuth.CreateHttpClientDetails(),
513517
}
514-
515-
// Use real header format like: syn_JFrog-Curation-Client_batch_a3404ff3
516-
waiverHeaderValue = "syn_JFrog-Curation-Client_batch_a3404ff3"
518+
// Use JSON header format like: {"batch_id":"196c55b0-5724-4a94-aa45-9b0bfd658985"}
519+
waiverHeaderValue = `{"batch_id":"196c55b0-5724-4a94-aa45-9b0bfd658985"}`
517520
testUrl := mockServerDetails.GetArtifactoryUrl() + "/test/pkg"
518521
err = analyzer.sendCompletedRequest(testUrl)
519522
assert.NoError(t, err)
520-
521-
// Verify the header has "_completed" suffix
522523
assert.NotNil(t, capturedHeader)
523524
waiverHeader := capturedHeader["X-Artifactory-Curation-Request-Waiver"]
524-
assert.Equal(t, "syn_JFrog-Curation-Client_batch_a3404ff3_completed", waiverHeader[0])
525+
526+
// Parse the completed header JSON
527+
var completedHeaderData map[string]interface{}
528+
err = json.Unmarshal([]byte(waiverHeader[0]), &completedHeaderData)
529+
require.NoError(t, err)
530+
assert.Equal(t, "196c55b0-5724-4a94-aa45-9b0bfd658985", completedHeaderData["batch_id"])
531+
assert.Equal(t, true, completedHeaderData["completed"])
532+
}
533+
534+
func TestCurationSynHeader(t *testing.T) {
535+
// Test that syn field is added correctly to the header
536+
headerValue := generateWaiverHeaderValue()
537+
538+
// Verify it's valid JSON with batch_id
539+
var headerData map[string]interface{}
540+
err := json.Unmarshal([]byte(headerValue), &headerData)
541+
require.NoError(t, err)
542+
assert.Contains(t, headerData, "batch_id")
543+
assert.NotEmpty(t, headerData["batch_id"])
544+
545+
// Add syn field (simulating what happens in getBlockedPackageDetails)
546+
headerData["syn"] = true
547+
synHeaderData, err := json.Marshal(headerData)
548+
require.NoError(t, err)
549+
550+
// Verify the final JSON contains both batch_id and syn
551+
var finalHeaderData map[string]interface{}
552+
err = json.Unmarshal(synHeaderData, &finalHeaderData)
553+
require.NoError(t, err)
554+
assert.Equal(t, true, finalHeaderData["syn"])
555+
assert.Contains(t, finalHeaderData, "batch_id")
556+
}
557+
558+
func TestAddFieldToWaiverHeader(t *testing.T) {
559+
// Test the helper function directly
560+
waiverHeaderValue = `{"batch_id":"test-batch-123"}`
561+
562+
// Add syn field
563+
synHeader, err := addFieldToWaiverHeader("syn", true)
564+
require.NoError(t, err)
565+
566+
var synData map[string]interface{}
567+
err = json.Unmarshal([]byte(synHeader), &synData)
568+
require.NoError(t, err)
569+
assert.Equal(t, "test-batch-123", synData["batch_id"])
570+
assert.Equal(t, true, synData["syn"])
571+
572+
// Add completed field
573+
completedHeader, err := addFieldToWaiverHeader("completed", true)
574+
require.NoError(t, err)
575+
576+
var completedData map[string]interface{}
577+
err = json.Unmarshal([]byte(completedHeader), &completedData)
578+
require.NoError(t, err)
579+
assert.Equal(t, "test-batch-123", completedData["batch_id"])
580+
assert.Equal(t, true, completedData["completed"])
525581
}
526582

527583
func setCurationFlagsForTest(t *testing.T) func() {

0 commit comments

Comments
 (0)