s for simple

I'm working on an iOS app that uses Amazon S3 to store images. It's just put/get/delete into a bucket, and without authentication on the bucket, it took less than 100 lines of NSURL* code to get working.

Now I need to restrict the bucket to only the app, so I figured I might as well try using Amazon's SDK. It's easy enough to set up; just add the AWSiOSSDK/S3 CocoaPod to the project. So how much code does that add?

$ cd Pods/AWSiOSSDK/src
$ find . -name "*.m" | xargs wc -l
      83 ./Amazon.Runtime/AmazonAbstractJsonWebServiceClient.m
     434 ./Amazon.Runtime/AmazonAbstractWebServiceClient.m
     272 ./Amazon.Runtime/AmazonAuthUtils.m
      59 ./Amazon.Runtime/AmazonBoolValueUnmarshaller.m
      59 ./Amazon.Runtime/AmazonClientException.m
      63 ./Amazon.Runtime/AmazonCredentials.m
      93 ./Amazon.Runtime/AmazonDictionaryUnmarshaller.m
     483 ./Amazon.Runtime/AmazonEndpoints.m
     116 ./Amazon.Runtime/AmazonErrorHandler.m
      43 ./Amazon.Runtime/AmazonJSON.m
      68 ./Amazon.Runtime/AmazonListUnmarshaller.m
      74 ./Amazon.Runtime/AmazonLogger.m
      90 ./Amazon.Runtime/AmazonMD5Util.m
      98 ./Amazon.Runtime/AmazonRequestDelegate.m
     705 ./Amazon.Runtime/AmazonSDKUtil.m
     104 ./Amazon.Runtime/AmazonServiceException.m
      81 ./Amazon.Runtime/AmazonServiceExceptionUnmarshaller.m
     278 ./Amazon.Runtime/AmazonServiceRequest.m
      46 ./Amazon.Runtime/AmazonServiceRequestConfig.m
     325 ./Amazon.Runtime/AmazonServiceResponse.m
      67 ./Amazon.Runtime/AmazonServiceResponseUnmarshaller.m
      20 ./Amazon.Runtime/AmazonSignatureException.m
      56 ./Amazon.Runtime/AmazonStaticCredentialsProvider.m
     107 ./Amazon.Runtime/AmazonUnmarshallerXMLParserDelegate.m
      32 ./Amazon.Runtime/AmazonURLRequest.m
      58 ./Amazon.Runtime/AmazonValueUnmarshaller.m
      32 ./Amazon.Runtime/AmazonWebServiceClient.m
     718 ./Amazon.S3/AmazonS3Client.m
      61 ./Amazon.S3/Model/BucketWebsiteConfiguration.m
      31 ./Amazon.S3/Model/DeletedObject.m
      32 ./Amazon.S3/Model/DeleteError.m
      54 ./Amazon.S3/Model/S3AbortMultipartUploadRequest.m
      21 ./Amazon.S3/Model/S3AbortMultipartUploadResponse.m
     164 ./Amazon.S3/Model/S3AbortMultipartUploadsOperation_Internal.m
     101 ./Amazon.S3/Model/S3AbstractPutRequest.m
     179 ./Amazon.S3/Model/S3AccessControlList.m
      77 ./Amazon.S3/Model/S3AccessControlListUnmarshaller.m
      32 ./Amazon.S3/Model/S3Bucket.m
      48 ./Amazon.S3/Model/S3BucketCrossOriginConfiguration.m
      51 ./Amazon.S3/Model/S3BucketCrossOriginConfigurationUnmarshaller.m
      48 ./Amazon.S3/Model/S3BucketLifecycleConfiguration.m
      99 ./Amazon.S3/Model/S3BucketLifecycleConfigurationRule.m
      96 ./Amazon.S3/Model/S3BucketLifecycleConfigurationRuleUnmarshaller.m
      84 ./Amazon.S3/Model/S3BucketLifecycleConfigurationTransition.m
      76 ./Amazon.S3/Model/S3BucketLifecycleConfigurationTransitionUnmarshaller.m
      51 ./Amazon.S3/Model/S3BucketLifecycleConfigurationUnmarshaller.m
      96 ./Amazon.S3/Model/S3BucketNameUtilities.m
      38 ./Amazon.S3/Model/S3BucketPolicy.m
      48 ./Amazon.S3/Model/S3BucketTaggingConfiguration.m
      51 ./Amazon.S3/Model/S3BucketTaggingConfigurationUnmarshaller.m
      51 ./Amazon.S3/Model/S3BucketTagSet.m
      79 ./Amazon.S3/Model/S3BucketTagSetUnmarshaller.m
      71 ./Amazon.S3/Model/S3BucketUnmarshaller.m
      64 ./Amazon.S3/Model/S3BucketVersioningConfiguration.m
      69 ./Amazon.S3/Model/S3BucketVersioningConfigurationUnmarshaller.m
     106 ./Amazon.S3/Model/S3CannedACL.m
      67 ./Amazon.S3/Model/S3CommonPrefixesUnmarshaller.m
      91 ./Amazon.S3/Model/S3CompleteMultipartUploadRequest.m
      55 ./Amazon.S3/Model/S3CompleteMultipartUploadResponse.m
      36 ./Amazon.S3/Model/S3CompleteMultipartUploadResult.m
      73 ./Amazon.S3/Model/S3CompleteMultipartUploadResultUnmarshaller.m
     120 ./Amazon.S3/Model/S3CopyObjectRequest.m
      44 ./Amazon.S3/Model/S3CopyObjectResponse.m
      32 ./Amazon.S3/Model/S3CopyObjectResult.m
      71 ./Amazon.S3/Model/S3CopyObjectResultUnmarshaller.m
      87 ./Amazon.S3/Model/S3CopyPartRequest.m
      47 ./Amazon.S3/Model/S3CopyPartResponse.m
      32 ./Amazon.S3/Model/S3CopyPartResult.m
      71 ./Amazon.S3/Model/S3CopyPartResultUnmarshaller.m
      71 ./Amazon.S3/Model/S3CORSRule.m
      95 ./Amazon.S3/Model/S3CORSRuleUnmarshaller.m
      99 ./Amazon.S3/Model/S3CreateBucketRequest.m
      20 ./Amazon.S3/Model/S3CreateBucketResponse.m
      47 ./Amazon.S3/Model/S3DeleteBucketCrossOriginRequest.m
      20 ./Amazon.S3/Model/S3DeleteBucketCrossOriginResponse.m
      47 ./Amazon.S3/Model/S3DeleteBucketLifecycleConfigurationRequest.m
      20 ./Amazon.S3/Model/S3DeleteBucketLifecycleConfigurationResponse.m
      39 ./Amazon.S3/Model/S3DeleteBucketPolicyRequest.m
      21 ./Amazon.S3/Model/S3DeleteBucketPolicyResponse.m
      59 ./Amazon.S3/Model/S3DeleteBucketRequest.m
      20 ./Amazon.S3/Model/S3DeleteBucketResponse.m
      47 ./Amazon.S3/Model/S3DeleteBucketTaggingRequest.m
      20 ./Amazon.S3/Model/S3DeleteBucketTaggingResponse.m
      47 ./Amazon.S3/Model/S3DeleteBucketWebsiteConfigurationRequest.m
      20 ./Amazon.S3/Model/S3DeleteBucketWebsiteConfigurationResponse.m
      79 ./Amazon.S3/Model/S3DeletedObjectUnmarshaller.m
      79 ./Amazon.S3/Model/S3DeleteErrorUnmarshaller.m
      40 ./Amazon.S3/Model/S3DeleteObjectRequest.m
      20 ./Amazon.S3/Model/S3DeleteObjectResponse.m
      81 ./Amazon.S3/Model/S3DeleteObjectsRequest.m
      46 ./Amazon.S3/Model/S3DeleteObjectsResponse.m
      74 ./Amazon.S3/Model/S3DeleteObjectsResultUnmarshaller.m
      50 ./Amazon.S3/Model/S3DeleteVersionRequest.m
      20 ./Amazon.S3/Model/S3DeleteVersionResponse.m
      75 ./Amazon.S3/Model/S3ErrorResponseHandler.m
      32 ./Amazon.S3/Model/S3GetACLRequest.m
      52 ./Amazon.S3/Model/S3GetACLResponse.m
      47 ./Amazon.S3/Model/S3GetBucketCrossOriginRequest.m
      37 ./Amazon.S3/Model/S3GetBucketCrossOriginResponse.m
      47 ./Amazon.S3/Model/S3GetBucketLifecycleConfigurationRequest.m
      37 ./Amazon.S3/Model/S3GetBucketLifecycleConfigurationResponse.m
      32 ./Amazon.S3/Model/S3GetBucketPolicyRequest.m
      41 ./Amazon.S3/Model/S3GetBucketPolicyResponse.m
      47 ./Amazon.S3/Model/S3GetBucketTaggingRequest.m
      37 ./Amazon.S3/Model/S3GetBucketTaggingResponse.m
      32 ./Amazon.S3/Model/S3GetBucketVersioningConfigurationRequest.m
      44 ./Amazon.S3/Model/S3GetBucketVersioningConfigurationResponse.m
      47 ./Amazon.S3/Model/S3GetBucketWebsiteConfigurationRequest.m
      37 ./Amazon.S3/Model/S3GetBucketWebsiteConfigurationResponse.m
      58 ./Amazon.S3/Model/S3GetBucketWebsiteConfigurationResultUnmarshaller.m
      31 ./Amazon.S3/Model/S3GetObjectMetadataRequest.m
      59 ./Amazon.S3/Model/S3GetObjectMetadataResponse.m
     570 ./Amazon.S3/Model/S3GetObjectOperation_Internal.m
     173 ./Amazon.S3/Model/S3GetObjectRequest.m
     106 ./Amazon.S3/Model/S3GetObjectResponse.m
     120 ./Amazon.S3/Model/S3GetPreSignedURLRequest.m
      53 ./Amazon.S3/Model/S3Grant.m
     132 ./Amazon.S3/Model/S3Grantee.m
      86 ./Amazon.S3/Model/S3GrantUnmarshaller.m
      99 ./Amazon.S3/Model/S3InitiateMultipartUploadRequest.m
      55 ./Amazon.S3/Model/S3InitiateMultipartUploadResponse.m
      69 ./Amazon.S3/Model/S3InitiateMultipartUploadResultUnmarshaller.m
      69 ./Amazon.S3/Model/S3KeyVersion.m
     118 ./Amazon.S3/Model/S3ListBucketResultUnmarshaller.m
      46 ./Amazon.S3/Model/S3ListBucketsRequest.m
      51 ./Amazon.S3/Model/S3ListBucketsResponse.m
      40 ./Amazon.S3/Model/S3ListBucketsResult.m
      83 ./Amazon.S3/Model/S3ListBucketsResultUnmarshaller.m
      83 ./Amazon.S3/Model/S3ListMultipartUploadsRequest.m
      45 ./Amazon.S3/Model/S3ListMultipartUploadsResponse.m
      63 ./Amazon.S3/Model/S3ListMultipartUploadsResult.m
     103 ./Amazon.S3/Model/S3ListMultipartUploadsResultUnmarshaller.m
      79 ./Amazon.S3/Model/S3ListObjectsRequest.m
      60 ./Amazon.S3/Model/S3ListObjectsResponse.m
      68 ./Amazon.S3/Model/S3ListObjectsResult.m
      70 ./Amazon.S3/Model/S3ListPartsRequest.m
      45 ./Amazon.S3/Model/S3ListPartsResponse.m
      45 ./Amazon.S3/Model/S3ListPartsResult.m
     103 ./Amazon.S3/Model/S3ListPartsResultUnmarshaller.m
      71 ./Amazon.S3/Model/S3ListVersionsRequest.m
      60 ./Amazon.S3/Model/S3ListVersionsResponse.m
      82 ./Amazon.S3/Model/S3ListVersionsResult.m
     126 ./Amazon.S3/Model/S3ListVersionsResultUnmarshaller.m
      48 ./Amazon.S3/Model/S3LocationConstraintUnmarshaller.m
      41 ./Amazon.S3/Model/S3MultiFactorAuthentication.m
      41 ./Amazon.S3/Model/S3MultipartUpload.m
     738 ./Amazon.S3/Model/S3MultipartUploadOperation_Internal.m
      93 ./Amazon.S3/Model/S3MultipartUploadUnmarshaller.m
      37 ./Amazon.S3/Model/S3ObjectSummary.m
     101 ./Amazon.S3/Model/S3ObjectSummaryUnmarshaller.m
      62 ./Amazon.S3/Model/S3Owner.m
      70 ./Amazon.S3/Model/S3OwnerUnmarshaller.m
      29 ./Amazon.S3/Model/S3Part.m
      73 ./Amazon.S3/Model/S3PartUnmarshaller.m
     112 ./Amazon.S3/Model/S3Permission.m
     239 ./Amazon.S3/Model/S3PutObjectOperation_Internal.m
     212 ./Amazon.S3/Model/S3PutObjectRequest.m
      20 ./Amazon.S3/Model/S3PutObjectResponse.m
     178 ./Amazon.S3/Model/S3Region.m
     152 ./Amazon.S3/Model/S3Request.m
     290 ./Amazon.S3/Model/S3Response.m
     103 ./Amazon.S3/Model/S3ResponseHeaderOverrides.m
      70 ./Amazon.S3/Model/S3RestoreObjectRequest.m
      20 ./Amazon.S3/Model/S3RestoreObjectResponse.m
      45 ./Amazon.S3/Model/S3SetACLRequest.m
      21 ./Amazon.S3/Model/S3SetACLResponse.m
      77 ./Amazon.S3/Model/S3SetBucketCrossOriginRequest.m
      22 ./Amazon.S3/Model/S3SetBucketCrossOriginResponse.m
      78 ./Amazon.S3/Model/S3SetBucketLifecycleConfigurationRequest.m
      22 ./Amazon.S3/Model/S3SetBucketLifecycleConfigurationResponse.m
      44 ./Amazon.S3/Model/S3SetBucketPolicyRequest.m
      21 ./Amazon.S3/Model/S3SetBucketPolicyResponse.m
      78 ./Amazon.S3/Model/S3SetBucketTaggingRequest.m
      22 ./Amazon.S3/Model/S3SetBucketTaggingResponse.m
      55 ./Amazon.S3/Model/S3SetBucketVersioningConfigurationRequest.m
      21 ./Amazon.S3/Model/S3SetBucketVersioningConfigurationResponse.m
      73 ./Amazon.S3/Model/S3SetBucketWebsiteConfigurationRequest.m
      22 ./Amazon.S3/Model/S3SetBucketWebsiteConfigurationResponse.m
      69 ./Amazon.S3/Model/S3TransferOperation.m
     151 ./Amazon.S3/Model/S3UploadInputStream.m
      74 ./Amazon.S3/Model/S3UploadPartRequest.m
      21 ./Amazon.S3/Model/S3UploadPartResponse.m
      51 ./Amazon.S3/Model/S3VersionSummary.m
     116 ./Amazon.S3/Model/S3VersionSummaryUnmarshaller.m
     748 ./Amazon.S3/S3TransferManager.m
     104 ./ThirdParty/JSON/AWS_SBJsonParser.m
     251 ./ThirdParty/JSON/AWS_SBJsonStreamParser.m
      51 ./ThirdParty/JSON/AWS_SBJsonStreamParserAccumulator.m
     171 ./ThirdParty/JSON/AWS_SBJsonStreamParserAdapter.m
     347 ./ThirdParty/JSON/AWS_SBJsonStreamParserState.m
     375 ./ThirdParty/JSON/AWS_SBJsonStreamWriter.m
      56 ./ThirdParty/JSON/AWS_SBJsonStreamWriterAccumulator.m
     139 ./ThirdParty/JSON/AWS_SBJsonStreamWriterState.m
     463 ./ThirdParty/JSON/AWS_SBJsonTokeniser.m
     143 ./ThirdParty/JSON/AWS_SBJsonUTF8Stream.m
     113 ./ThirdParty/JSON/AWS_SBJsonWriter.m
   19187 total

Good grief.

Porting only the bits of code I needed to support authentication added another 70 lines to my original 100. I guess I'll stick with that until I really need an S3BucketLifecycleConfigurationTransitionUnmarshaller.