From dcdf45743eab1126a76aba34e555fb2575f67a3b Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Mon, 17 Jun 2024 09:36:07 -0500 Subject: [PATCH] feat: Add idempotency (#1790) --- .../Commands/CommandRunner/PFCommandRunningConstants.h | 1 + .../Commands/CommandRunner/PFCommandRunningConstants.m | 1 + .../URLRequestConstructor/PFCommandURLRequestConstructor.m | 2 +- Parse/Parse/Source/PFConstants.h | 4 ++++ Parse/Tests/Unit/CommandURLRequestConstructorTests.m | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h index 2ad5558bf..d4eac99da 100644 --- a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h +++ b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h @@ -27,6 +27,7 @@ extern NSString *const PFCommandHeaderNameAppBuildVersion; extern NSString *const PFCommandHeaderNameAppDisplayVersion; extern NSString *const PFCommandHeaderNameOSVersion; extern NSString *const PFCommandHeaderNameSessionToken; +extern NSString *const PFCommandHeaderNameRequestId; ///-------------------------------------- #pragma mark - HTTP Method Override diff --git a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m index 3ea747f49..ff93a58c6 100644 --- a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m +++ b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m @@ -19,5 +19,6 @@ NSString *const PFCommandHeaderNameAppDisplayVersion = @"X-Parse-App-Display-Version"; NSString *const PFCommandHeaderNameOSVersion = @"X-Parse-OS-Version"; NSString *const PFCommandHeaderNameSessionToken = @"X-Parse-Session-Token"; +NSString *const PFCommandHeaderNameRequestId = @"X-Parse-Request-Id"; NSString *const PFCommandParameterNameMethodOverride = @"_method"; diff --git a/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m b/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m index 157db303e..7457445e3 100644 --- a/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m +++ b/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m @@ -141,7 +141,7 @@ + (NSDictionary *)defaultURLRequestHeadersForApplicationId:(NSString *)applicati if (clientKey) { mutableHeaders[PFCommandHeaderNameClientKey] = clientKey; } - + mutableHeaders[PFCommandHeaderNameRequestId] = [[NSUUID UUID] UUIDString]; mutableHeaders[PFCommandHeaderNameClientVersion] = [versionPrefix stringByAppendingString:PARSE_VERSION]; mutableHeaders[PFCommandHeaderNameOSVersion] = [PFDevice currentDevice].operatingSystemFullVersion; diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index 845cdd815..063a4bffa 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -284,6 +284,10 @@ typedef NS_ENUM(NSInteger, PFErrorCode) { Application has exceeded its request limit. */ kPFErrorRequestLimitExceeded = 155, + /** + Request was a duplicate and has been discarded due to idempotency rules. + */ + kPFErrorDuplicateRequest = 159, /** Invalid event name. */ diff --git a/Parse/Tests/Unit/CommandURLRequestConstructorTests.m b/Parse/Tests/Unit/CommandURLRequestConstructorTests.m index 33040187c..7b9127bc8 100644 --- a/Parse/Tests/Unit/CommandURLRequestConstructorTests.m +++ b/Parse/Tests/Unit/CommandURLRequestConstructorTests.m @@ -155,6 +155,7 @@ - (void)testDefaultURLRequestHeaders { XCTAssertNotNil(headers[PFCommandHeaderNameOSVersion]); XCTAssertNotNil(headers[PFCommandHeaderNameAppBuildVersion]); XCTAssertNotNil(headers[PFCommandHeaderNameAppDisplayVersion]); + XCTAssertNotNil(headers[PFCommandHeaderNameRequestId]); } - (void)testBailOnEncodingError {