Skip to content

Conversation

@peterrsongg
Copy link
Contributor

@peterrsongg peterrsongg commented Dec 17, 2025

Stacked PRs:


generate DeleteObjectTagging --- ---


Description

Generate DeleteObjectTagging

Motivation and Context

Testing

DRY_RUN-e9266a93-9f5d-4b97-b7ef-710a68e1db2e
Assembly Comparison Output (empty)


Fuzz test results empty

Screenshots (if appropriate)

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • My code follows the code style of this project
  • My change requires a change to the documentation
  • I have updated the documentation accordingly
  • I have read the README document
  • I have added tests to cover my changes
  • All new and existing tests passed

License

  • I confirm that this pull request can be released under the Apache 2 license

stack-info: PR: #4241, branch: peterrsongg/petesong/phase-3-pr6/3
@peterrsongg peterrsongg force-pushed the peterrsongg/petesong/phase-3-pr6/3 branch from bd02d2f to 8c5cba7 Compare December 17, 2025 06:27
@peterrsongg peterrsongg force-pushed the peterrsongg/petesong/phase-3-pr6/2 branch from 5e59374 to 8baad14 Compare December 17, 2025 06:27
This was referenced Dec 17, 2025
@peterrsongg
Copy link
Contributor Author

peterrsongg commented Dec 17, 2025

READ THIS

Issue 1 and 2 aren't breaking changes since we check !String.ISNullOrEmpty for required uri and resource path params. Issue 3 isn't a breaking change, and is a change we've been making in previous PR's. This actually is the correct behavior.

Issue 4: They return the same thing

Breaking Changes Analysis for DeleteObjectTagging Migration (Commit 8c5cba7)

BREAKING CHANGES FOUND: 2

File: sdk/src/Services/S3/Generated/Model/DeleteObjectTaggingRequest.cs

ISSUE 1: IsSetBucketName() method changed validation logic

  • OLD (Custom): return !string.IsNullOrEmpty(this.bucketName);
  • NEW (Generated): return this._bucketName != null;
  • Impact: This is a BREAKING CHANGE. The old implementation would return false for empty strings (""), but the new implementation would return true for empty strings. This could cause requests with empty bucket names to be incorrectly processed instead of being rejected.
  • Location: Line ~122 in generated file

ISSUE 2: IsSetKey() method changed validation logic

  • OLD (Custom): return !string.IsNullOrEmpty(this.key);
  • NEW (Generated): return this._key != null;
  • Impact: This is a BREAKING CHANGE. The old implementation would return false for empty strings (""), but the new implementation would return true for empty strings. This could cause requests with empty keys to be incorrectly processed instead of being rejected.
  • Location: Line ~149 in generated file

File: sdk/src/Services/S3/Generated/Model/Internal/MarshallTransformations/DeleteObjectTaggingRequestMarshaller.cs

ISSUE 3: VersionId parameter marshalling changed from SubResource to Query Parameter

  • OLD (Custom): request.AddSubResource("versionId", S3Transforms.ToStringValue(deleteObjectTaggingRequest.VersionId));
  • NEW (Generated): request.Parameters.Add("versionId", StringUtils.FromString(publicRequest.VersionId)); (with request.UseQueryString = true;)
  • Impact: This is a POTENTIAL BREAKING CHANGE. The versionId parameter was changed from being added as a subresource to being added as a query parameter. While both approaches should result in the same URL format for S3 API calls, the internal representation and ordering might differ, potentially affecting signature calculation or URL construction in edge cases.
  • Location: Lines 73-74 in generated marshaller

File: sdk/src/Services/S3/Generated/Model/Internal/MarshallTransformations/DeleteObjectTaggingResponseUnmarshaller.cs

ISSUE 4: Response unmarshalling removed S3Transforms.ToString() conversion

  • OLD (Custom): response.VersionId = S3Transforms.ToString(responseData.GetHeaderValue("x-amz-version-id"));
  • NEW (Generated): response.VersionId = context.ResponseData.GetHeaderValue("x-amz-version-id");
  • Impact: This is a POTENTIAL BREAKING CHANGE. The S3Transforms.ToString() method may have performed special processing (e.g., null handling, trimming, encoding/decoding) that is now bypassed. If S3Transforms.ToString() provided any value transformation beyond simple string assignment, that behavior has been lost.
  • Location: Line 49 in generated unmarshaller

Summary

  • Files Analyzed: 4 out of 4 files changed in this commit for DeleteObjectTagging
  • Critical Breaking Changes: 2 (IsSetBucketName and IsSetKey validation logic)
  • Potential Breaking Changes: 2 (VersionId marshalling method and VersionId unmarshalling transformation)

Recommendations

  1. CRITICAL: Add customization to s3.customizations.json for BucketName and Key properties in DeleteObjectTaggingRequest to use !String.IsNullOrEmpty instead of != null
  2. Verify that the SubResource to Parameters.Add change for VersionId produces the same wire format
  3. Verify that S3Transforms.ToString() is functionally equivalent to direct assignment for VersionId response unmarshalling

@peterrsongg peterrsongg changed the title generate deleteobjecttagging generate DeleteObjectTagging Dec 17, 2025
@peterrsongg peterrsongg marked this pull request as ready for review December 17, 2025 07:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant