| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -109,9 +109,9 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter := router.PathPrefix("/").Subrouter() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Readiness Probe
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.Methods("GET").Path("/status").HandlerFunc(s3a.StatusHandler) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.Methods(http.MethodGet).Path("/status").HandlerFunc(s3a.StatusHandler) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.Methods("OPTIONS").HandlerFunc( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.Methods(http.MethodOptions).HandlerFunc( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							func(w http.ResponseWriter, r *http.Request) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								origin := r.Header.Get("Origin") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if origin != "" { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -161,135 +161,135 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// objects with query
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// CopyObjectPart
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", `.*?(\/|%2F).*?`).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", `.*?(\/|%2F).*?`).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObjectPart
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// CompleteMultipartUpload
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CompleteMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPost).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CompleteMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// NewMultipartUpload
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.NewMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploads", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPost).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.NewMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploads", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// AbortMultipartUpload
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.AbortMultipartUploadHandler, ACTION_WRITE)), "DELETE")).Queries("uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.AbortMultipartUploadHandler, ACTION_WRITE)), "DELETE")).Queries("uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// ListObjectParts
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectPartsHandler, ACTION_READ)), "GET")).Queries("uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectPartsHandler, ACTION_READ)), "GET")).Queries("uploadId", "{uploadId:.*}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// ListMultipartUploads
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListMultipartUploadsHandler, ACTION_READ)), "GET")).Queries("uploads", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListMultipartUploadsHandler, ACTION_READ)), "GET")).Queries("uploads", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetObjectTagging
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectTaggingHandler, ACTION_READ)), "GET")).Queries("tagging", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectTaggingHandler, ACTION_READ)), "GET")).Queries("tagging", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObjectTagging
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectTaggingHandler, ACTION_TAGGING)), "PUT")).Queries("tagging", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectTaggingHandler, ACTION_TAGGING)), "PUT")).Queries("tagging", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteObjectTagging
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectTaggingHandler, ACTION_TAGGING)), "DELETE")).Queries("tagging", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectTaggingHandler, ACTION_TAGGING)), "DELETE")).Queries("tagging", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObjectACL
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObjectRetention
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectRetentionHandler, ACTION_WRITE)), "PUT")).Queries("retention", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectRetentionHandler, ACTION_WRITE)), "PUT")).Queries("retention", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObjectLegalHold
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLegalHoldHandler, ACTION_WRITE)), "PUT")).Queries("legal-hold", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLegalHoldHandler, ACTION_WRITE)), "PUT")).Queries("legal-hold", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObjectLockConfiguration
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLockConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("object-lock", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLockConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("object-lock", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetObjectACL
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// objects with query
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// raw objects
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// HeadObject
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadObjectHandler, ACTION_READ)), "GET")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodHead).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadObjectHandler, ACTION_READ)), "GET")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetObject, but directory listing is not supported
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectHandler, ACTION_READ)), "GET")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectHandler, ACTION_READ)), "GET")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// CopyObject
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectHandler, ACTION_WRITE)), "COPY")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectHandler, ACTION_WRITE)), "COPY")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutObject
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectHandler, ACTION_WRITE)), "PUT")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectHandler, ACTION_WRITE)), "PUT")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteObject
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectHandler, ACTION_WRITE)), "DELETE")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectHandler, ACTION_WRITE)), "DELETE")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// raw objects
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// buckets with query
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteMultipleObjects
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("POST").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteMultipleObjectsHandler, ACTION_WRITE)), "DELETE")).Queries("delete", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPost).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteMultipleObjectsHandler, ACTION_WRITE)), "DELETE")).Queries("delete", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketACL
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutBucketACL
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketPolicy
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketPolicyHandler, ACTION_READ)), "GET")).Queries("policy", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketPolicyHandler, ACTION_READ)), "GET")).Queries("policy", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutBucketPolicy
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketPolicyHandler, ACTION_WRITE)), "PUT")).Queries("policy", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketPolicyHandler, ACTION_WRITE)), "PUT")).Queries("policy", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteBucketPolicy
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketPolicyHandler, ACTION_WRITE)), "DELETE")).Queries("policy", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketPolicyHandler, ACTION_WRITE)), "DELETE")).Queries("policy", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketCors
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketCorsHandler, ACTION_READ)), "GET")).Queries("cors", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketCorsHandler, ACTION_READ)), "GET")).Queries("cors", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutBucketCors
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketCorsHandler, ACTION_WRITE)), "PUT")).Queries("cors", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketCorsHandler, ACTION_WRITE)), "PUT")).Queries("cors", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteBucketCors
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketCorsHandler, ACTION_WRITE)), "DELETE")).Queries("cors", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketCorsHandler, ACTION_WRITE)), "DELETE")).Queries("cors", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketLifecycleConfiguration
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLifecycleConfigurationHandler, ACTION_READ)), "GET")).Queries("lifecycle", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLifecycleConfigurationHandler, ACTION_READ)), "GET")).Queries("lifecycle", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutBucketLifecycleConfiguration
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketLifecycleConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("lifecycle", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketLifecycleConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("lifecycle", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteBucketLifecycleConfiguration
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketLifecycleHandler, ACTION_WRITE)), "DELETE")).Queries("lifecycle", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketLifecycleHandler, ACTION_WRITE)), "DELETE")).Queries("lifecycle", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketLocation
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLocationHandler, ACTION_READ)), "GET")).Queries("location", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLocationHandler, ACTION_READ)), "GET")).Queries("location", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketRequestPayment
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketRequestPaymentHandler, ACTION_READ)), "GET")).Queries("requestPayment", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketRequestPaymentHandler, ACTION_READ)), "GET")).Queries("requestPayment", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// GetBucketVersioning
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketVersioningHandler, ACTION_READ)), "GET")).Queries("versioning", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketVersioningHandler, ACTION_WRITE)), "PUT")).Queries("versioning", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketVersioningHandler, ACTION_READ)), "GET")).Queries("versioning", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketVersioningHandler, ACTION_WRITE)), "PUT")).Queries("versioning", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// ListObjectsV2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV2Handler, ACTION_LIST)), "LIST")).Queries("list-type", "2") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV2Handler, ACTION_LIST)), "LIST")).Queries("list-type", "2") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// buckets with query
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutBucketOwnershipControls
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.PutBucketOwnershipControls, ACTION_ADMIN), "PUT")).Queries("ownershipControls", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.PutBucketOwnershipControls, ACTION_ADMIN), "PUT")).Queries("ownershipControls", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							//GetBucketOwnershipControls
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.GetBucketOwnershipControls, ACTION_READ), "GET")).Queries("ownershipControls", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.GetBucketOwnershipControls, ACTION_READ), "GET")).Queries("ownershipControls", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							//DeleteBucketOwnershipControls
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.DeleteBucketOwnershipControls, ACTION_ADMIN), "DELETE")).Queries("ownershipControls", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.DeleteBucketOwnershipControls, ACTION_ADMIN), "DELETE")).Queries("ownershipControls", "") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// raw buckets
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PostPolicy
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("POST").HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PostPolicyBucketHandler, ACTION_WRITE)), "POST")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPost).HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PostPolicyBucketHandler, ACTION_WRITE)), "POST")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// HeadBucket
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("HEAD").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadBucketHandler, ACTION_READ)), "GET")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodHead).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadBucketHandler, ACTION_READ)), "GET")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// PutBucket
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketHandler, ACTION_ADMIN)), "PUT")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketHandler, ACTION_ADMIN)), "PUT")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// DeleteBucket
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketHandler, ACTION_DELETE_BUCKET)), "DELETE")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketHandler, ACTION_DELETE_BUCKET)), "DELETE")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// ListObjectsV1 (Legacy)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV1Handler, ACTION_LIST)), "LIST")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV1Handler, ACTION_LIST)), "LIST")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// raw buckets
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// ListBuckets
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.Methods(http.MethodGet).Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// NotFound
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						apiRouter.NotFoundHandler = http.HandlerFunc(s3err.NotFoundHandler) | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |