Documentation
      ¶
    
    
  
    
  
    Index ¶
- Constants
 - Variables
 - func Attach(r *mux.Router, domains []string, m MaxClients, h Handler, center auth.Center, ...)
 - func AttachUserAuth(router *mux.Router, center auth.Center, log *zap.Logger)
 - func EncodeResponse(response any) []byte
 - func EncodeToResponse(w http.ResponseWriter, response any) error
 - func GetContextRequestID(ctx context.Context) string
 - func GetSourceIP(r *http.Request) string
 - func GetWriterRequestID(w http.ResponseWriter) string
 - func IsAnonymousRequest(ctx context.Context) bool
 - func SetReqInfo(ctx context.Context, req *ReqInfo) context.Context
 - func WriteErrorResponse(w http.ResponseWriter, reqInfo *ReqInfo, err error) int
 - func WriteResponse(w http.ResponseWriter, statusCode int, response []byte, mType mimeType)
 - func WriteSuccessResponseHeadersOnly(w http.ResponseWriter)
 - type ErrorResponse
 - type Handler
 - type KeyVal
 - type KeyWrapper
 - type MaxClients
 - type ObjectRequest
 - type ReqInfo
 
Constants ¶
const ( MetadataPrefix = "X-Amz-Meta-" AmzMetadataDirective = "X-Amz-Metadata-Directive" AmzTaggingDirective = "X-Amz-Tagging-Directive" AmzVersionID = "X-Amz-Version-Id" AmzTaggingCount = "X-Amz-Tagging-Count" AmzTagging = "X-Amz-Tagging" AmzDeleteMarker = "X-Amz-Delete-Marker" AmzCopySource = "X-Amz-Copy-Source" AmzCopySourceRange = "X-Amz-Copy-Source-Range" LastModified = "Last-Modified" Date = "Date" ETag = "ETag" ContentType = "Content-Type" ContentMD5 = "Content-Md5" ContentEncoding = "Content-Encoding" Expires = "Expires" ContentLength = "Content-Length" ContentLanguage = "Content-Language" ContentRange = "Content-Range" AcceptRanges = "Accept-Ranges" AmzBucketRegion = "X-Amz-Bucket-Region" CacheControl = "Cache-Control" ContentDisposition = "Content-Disposition" Authorization = "Authorization" IfModifiedSince = "If-Modified-Since" IfUnmodifiedSince = "If-Unmodified-Since" IfMatch = "If-Match" IfNoneMatch = "If-None-Match" AmzCopyIfModifiedSince = "X-Amz-Copy-Source-If-Modified-Since" AmzCopyIfUnmodifiedSince = "X-Amz-Copy-Source-If-Unmodified-Since" AmzCopyIfMatch = "X-Amz-Copy-Source-If-Match" AmzCopyIfNoneMatch = "X-Amz-Copy-Source-If-None-Match" AmzACL = "X-Amz-Acl" AmzGrantFullControl = "X-Amz-Grant-Full-Control" AmzGrantRead = "X-Amz-Grant-Read" AmzGrantWrite = "X-Amz-Grant-Write" AmzExpectedBucketOwner = "X-Amz-Expected-Bucket-Owner" AmzSourceExpectedBucketOwner = "X-Amz-Source-Expected-Bucket-Owner" AmzBucketObjectLockEnabled = "X-Amz-Bucket-Object-Lock-Enabled" AmzObjectLockLegalHold = "X-Amz-Object-Lock-Legal-Hold" AmzObjectLockMode = "X-Amz-Object-Lock-Mode" AmzObjectLockRetainUntilDate = "X-Amz-Object-Lock-Retain-Until-Date" AmzBypassGovernanceRetention = "X-Amz-Bypass-Governance-Retention" AmzObjectAttributes = "X-Amz-Object-Attributes" AmzMaxParts = "X-Amz-Max-Parts" AmzPartNumberMarker = "X-Amz-Part-Number-Marker" AmzServerSideEncryptionCustomerAlgorithm = "x-amz-server-side-encryption-customer-algorithm" AmzServerSideEncryptionCustomerKey = "x-amz-server-side-encryption-customer-key" AmzServerSideEncryptionCustomerKeyMD5 = "x-amz-server-side-encryption-customer-key-MD5" ContainerID = "X-Container-Id" AccessControlAllowOrigin = "Access-Control-Allow-Origin" AccessControlAllowMethods = "Access-Control-Allow-Methods" AccessControlExposeHeaders = "Access-Control-Expose-Headers" AccessControlAllowHeaders = "Access-Control-Allow-Headers" AccessControlMaxAge = "Access-Control-Max-Age" AccessControlAllowCredentials = "Access-Control-Allow-Credentials" Origin = "Origin" AccessControlRequestMethod = "Access-Control-Request-Method" AccessControlRequestHeaders = "Access-Control-Request-Headers" Vary = "Vary" DefaultLocationConstraint = "default" )
Standard S3 HTTP request/response constants.
const ( // SlashSeparator -- slash separator. SlashSeparator = "/" // MimeNone means no response type. MimeNone mimeType = "" // MimeXML means response type is XML. MimeXML mimeType = "application/xml" )
const (
	QueryVersionID = "versionId"
)
    S3 request query params.
Variables ¶
var AnonymousRequest = KeyWrapper("__context_anonymous_request")
    AnonymousRequest is a boolean flag to show explicitly that request was made without authorization. Typical usage with `--no-sign-request`.
var BoxData = KeyWrapper("__context_box_key")
    BoxData is an ID used to store accessbox.Box in a context.
var ClientTime = KeyWrapper("__context_client_time")
    ClientTime is an ID used to store client time.Time in a context.
var ResponseModifiers = map[string]string{ "response-content-type": ContentType, "response-content-language": ContentLanguage, "response-expires": Expires, "response-cache-control": CacheControl, "response-content-disposition": ContentDisposition, "response-content-encoding": ContentEncoding, }
ResponseModifiers maps response modifies headers to regular headers.
var SystemMetadata = map[string]struct{}{ Date: {}, CacheControl: {}, ContentDisposition: {}, ContentLength: {}, ContentType: {}, LastModified: {}, ETag: {}, }
Functions ¶
func Attach ¶
func Attach(r *mux.Router, domains []string, m MaxClients, h Handler, center auth.Center, log *zap.Logger)
Attach adds S3 API handlers from h to r for domains with m client limit using center authentication and log logger.
func AttachUserAuth ¶
AttachUserAuth adds user authentication via center to router using log for logging.
func EncodeResponse ¶
EncodeResponse encodes the response headers into XML format.
func EncodeToResponse ¶
func EncodeToResponse(w http.ResponseWriter, response any) error
EncodeToResponse encodes the response into ResponseWriter.
func GetContextRequestID ¶ added in v0.32.0
GetContextRequestID returns the request ID from the context.
func GetSourceIP ¶
GetSourceIP retrieves the IP from the X-Forwarded-For, X-Real-IP and RFC7239 Forwarded headers (in that order), falls back to r.RemoteAddr when everything else fails.
func GetWriterRequestID ¶ added in v0.32.0
func GetWriterRequestID(w http.ResponseWriter) string
GetWriterRequestID extracts request ID from the response writer.
func IsAnonymousRequest ¶ added in v0.28.0
IsAnonymousRequest helps to check the request was made as an anonymous user.
func SetReqInfo ¶
SetReqInfo sets ReqInfo in the context.
func WriteErrorResponse ¶
func WriteErrorResponse(w http.ResponseWriter, reqInfo *ReqInfo, err error) int
WriteErrorResponse writes error headers.
func WriteResponse ¶
func WriteResponse(w http.ResponseWriter, statusCode int, response []byte, mType mimeType)
WriteResponse writes given statusCode and response into w (with mType header if set).
func WriteSuccessResponseHeadersOnly ¶
func WriteSuccessResponseHeadersOnly(w http.ResponseWriter)
WriteSuccessResponseHeadersOnly writes HTTP (200) OK response with no data to the client.
Types ¶
type ErrorResponse ¶
type ErrorResponse struct {
	XMLName    xml.Name `xml:"Error" json:"-"`
	Code       string
	Message    string
	Key        string `xml:"Key,omitempty" json:"Key,omitempty"`
	BucketName string `xml:"BucketName,omitempty" json:"BucketName,omitempty"`
	Resource   string
	RequestID  string `xml:"RequestId" json:"RequestId"`
	HostID     string `xml:"HostId" json:"HostId"`
	// The region where the bucket is located. This header is returned
	// only in HEAD bucket and ListObjects response.
	Region string `xml:"Region,omitempty" json:"Region,omitempty"`
	// Captures the server string returned in response header.
	Server string `xml:"-" json:"-"`
	// Underlying HTTP status code for the returned error.
	StatusCode int `xml:"-" json:"-"`
}
    ErrorResponse -- error response format.
func (ErrorResponse) Error ¶
func (e ErrorResponse) Error() string
Error -- Returns S3 error string.
type Handler ¶
type Handler interface {
	HeadObjectHandler(http.ResponseWriter, *http.Request)
	GetObjectACLHandler(http.ResponseWriter, *http.Request)
	PutObjectACLHandler(http.ResponseWriter, *http.Request)
	GetObjectTaggingHandler(http.ResponseWriter, *http.Request)
	PutObjectTaggingHandler(http.ResponseWriter, *http.Request)
	DeleteObjectTaggingHandler(http.ResponseWriter, *http.Request)
	SelectObjectContentHandler(http.ResponseWriter, *http.Request)
	GetObjectRetentionHandler(http.ResponseWriter, *http.Request)
	GetObjectLegalHoldHandler(http.ResponseWriter, *http.Request)
	GetObjectHandler(http.ResponseWriter, *http.Request)
	GetObjectAttributesHandler(http.ResponseWriter, *http.Request)
	CopyObjectHandler(http.ResponseWriter, *http.Request)
	PutObjectRetentionHandler(http.ResponseWriter, *http.Request)
	PutObjectLegalHoldHandler(http.ResponseWriter, *http.Request)
	PutObjectHandler(http.ResponseWriter, *http.Request)
	DeleteObjectHandler(http.ResponseWriter, *http.Request)
	GetBucketLocationHandler(http.ResponseWriter, *http.Request)
	GetBucketPolicyHandler(http.ResponseWriter, *http.Request)
	GetBucketLifecycleHandler(http.ResponseWriter, *http.Request)
	GetBucketEncryptionHandler(http.ResponseWriter, *http.Request)
	GetBucketACLHandler(http.ResponseWriter, *http.Request)
	PutBucketACLHandler(http.ResponseWriter, *http.Request)
	GetBucketCorsHandler(http.ResponseWriter, *http.Request)
	PutBucketCorsHandler(http.ResponseWriter, *http.Request)
	DeleteBucketCorsHandler(http.ResponseWriter, *http.Request)
	GetBucketWebsiteHandler(http.ResponseWriter, *http.Request)
	GetBucketAccelerateHandler(http.ResponseWriter, *http.Request)
	GetBucketRequestPaymentHandler(http.ResponseWriter, *http.Request)
	GetBucketLoggingHandler(http.ResponseWriter, *http.Request)
	PutBucketLoggingHandler(http.ResponseWriter, *http.Request)
	GetBucketReplicationHandler(http.ResponseWriter, *http.Request)
	GetBucketTaggingHandler(http.ResponseWriter, *http.Request)
	DeleteBucketWebsiteHandler(http.ResponseWriter, *http.Request)
	DeleteBucketTaggingHandler(http.ResponseWriter, *http.Request)
	GetBucketObjectLockConfigHandler(http.ResponseWriter, *http.Request)
	GetBucketVersioningHandler(http.ResponseWriter, *http.Request)
	GetBucketNotificationHandler(http.ResponseWriter, *http.Request)
	ListenBucketNotificationHandler(http.ResponseWriter, *http.Request)
	ListObjectsV2MHandler(http.ResponseWriter, *http.Request)
	ListObjectsV2Handler(http.ResponseWriter, *http.Request)
	ListBucketObjectVersionsHandler(http.ResponseWriter, *http.Request)
	ListObjectsV1Handler(http.ResponseWriter, *http.Request)
	PutBucketLifecycleHandler(http.ResponseWriter, *http.Request)
	PutBucketEncryptionHandler(http.ResponseWriter, *http.Request)
	PutBucketPolicyHandler(http.ResponseWriter, *http.Request)
	PutBucketObjectLockConfigHandler(http.ResponseWriter, *http.Request)
	PutBucketTaggingHandler(http.ResponseWriter, *http.Request)
	PutBucketVersioningHandler(http.ResponseWriter, *http.Request)
	PutBucketNotificationHandler(http.ResponseWriter, *http.Request)
	CreateBucketHandler(http.ResponseWriter, *http.Request)
	HeadBucketHandler(http.ResponseWriter, *http.Request)
	PostObject(http.ResponseWriter, *http.Request)
	DeleteMultipleObjectsHandler(http.ResponseWriter, *http.Request)
	DeleteBucketPolicyHandler(http.ResponseWriter, *http.Request)
	GetBucketPolicyStatusHandler(http.ResponseWriter, *http.Request)
	DeleteBucketLifecycleHandler(http.ResponseWriter, *http.Request)
	DeleteBucketEncryptionHandler(http.ResponseWriter, *http.Request)
	DeleteBucketHandler(http.ResponseWriter, *http.Request)
	ListBucketsHandler(http.ResponseWriter, *http.Request)
	Preflight(w http.ResponseWriter, r *http.Request)
	AppendCORSHeaders(w http.ResponseWriter, r *http.Request)
	CreateMultipartUploadHandler(http.ResponseWriter, *http.Request)
	UploadPartHandler(http.ResponseWriter, *http.Request)
	UploadPartCopy(w http.ResponseWriter, r *http.Request)
	CompleteMultipartUploadHandler(http.ResponseWriter, *http.Request)
	AbortMultipartUploadHandler(http.ResponseWriter, *http.Request)
	ListPartsHandler(w http.ResponseWriter, r *http.Request)
	ListMultipartUploadsHandler(http.ResponseWriter, *http.Request)
	GetObjectTorrentHandler(http.ResponseWriter, *http.Request)
	PutPublicAccessBlockHandler(http.ResponseWriter, *http.Request)
	GetPublicAccessBlockHandler(http.ResponseWriter, *http.Request)
	PutBucketOwnershipControlsHandler(http.ResponseWriter, *http.Request)
	GetBucketOwnershipControlsHandler(http.ResponseWriter, *http.Request)
	DeleteBucketOwnershipControlsHandler(http.ResponseWriter, *http.Request)
}
    Handler is an S3 API handler interface.
type MaxClients ¶
type MaxClients interface {
	Handle(http.HandlerFunc) http.HandlerFunc
}
    MaxClients provides HTTP handler wrapper with the client limit.
func NewMaxClientsMiddleware ¶
func NewMaxClientsMiddleware(count int, timeout time.Duration) MaxClients
NewMaxClientsMiddleware returns MaxClients interface with handler wrapper based on the provided count and the timeout limits.
type ObjectRequest ¶
ObjectRequest represents object request data.
type ReqInfo ¶
type ReqInfo struct {
	sync.RWMutex
	RemoteHost   string   // Client Host/IP
	Host         string   // Node Host/IP
	UserAgent    string   // User Agent
	DeploymentID string   // random generated s3-deployment-id
	RequestID    string   // x-amz-request-id
	API          string   // API name -- GetObject PutObject NewMultipartUpload etc.
	BucketName   string   // Bucket name
	ObjectName   string   // Object name
	URL          *url.URL // Request url
	// contains filtered or unexported fields
}
    ReqInfo stores the request info.
func NewReqInfo ¶
func NewReqInfo(w http.ResponseWriter, r *http.Request, req ObjectRequest) *ReqInfo
NewReqInfo returns new ReqInfo based on parameters.
func (*ReqInfo) AppendTags ¶
AppendTags -- appends key/val to ReqInfo.tags.