diff --git a/cmd/handler-utils.go b/cmd/handler-utils.go index 491ba9963..c701cd8a1 100644 --- a/cmd/handler-utils.go +++ b/cmd/handler-utils.go @@ -189,6 +189,15 @@ func extractReqParams(r *http.Request) map[string]string { } } +// Extract response elements to be sent with event notifiation. +func extractRespElements(w http.ResponseWriter) map[string]string { + + return map[string]string{ + "content-length": w.Header().Get("Content-Length"), + // Add more fields here. + } +} + // Trims away `aws-chunked` from the content-encoding header if present. // Streaming signature clients can have custom content-encoding such as // `aws-chunked,gzip` here we need to only save `gzip`. diff --git a/cmd/notification.go b/cmd/notification.go index 0274b2e66..a25f53474 100644 --- a/cmd/notification.go +++ b/cmd/notification.go @@ -449,13 +449,14 @@ func NewNotificationSys(config *serverConfig, endpoints EndpointList) *Notificat } type eventArgs struct { - EventName event.Name - BucketName string - Object ObjectInfo - ReqParams map[string]string - Host string - Port string - UserAgent string + EventName event.Name + BucketName string + Object ObjectInfo + ReqParams map[string]string + RespElements map[string]string + Host string + Port string + UserAgent string } // ToEvent - converts to notification event. @@ -474,6 +475,13 @@ func (args eventArgs) ToEvent() event.Event { eventTime := UTCNow() uniqueID := fmt.Sprintf("%X", eventTime.UnixNano()) + respElements := map[string]string{ + "x-amz-request-id": uniqueID, + "x-minio-origin-endpoint": getOriginEndpoint(), // Minio specific custom elements. + } + if args.RespElements["content-length"] != "" { + respElements["content-length"] = args.RespElements["content-length"] + } newEvent := event.Event{ EventVersion: "2.0", EventSource: "minio:s3", @@ -482,10 +490,7 @@ func (args eventArgs) ToEvent() event.Event { EventName: args.EventName, UserIdentity: event.Identity{creds.AccessKey}, RequestParameters: args.ReqParams, - ResponseElements: map[string]string{ - "x-amz-request-id": uniqueID, - "x-minio-origin-endpoint": getOriginEndpoint(), // Minio specific custom elements. - }, + ResponseElements: respElements, S3: event.Metadata{ SchemaVersion: "1.0", ConfigurationID: "Config", diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index e22dcde0b..4f7f111c1 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -405,13 +405,14 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req // Notify object accessed via a GET request. sendEvent(eventArgs{ - EventName: event.ObjectAccessedGet, - BucketName: bucket, - Object: objInfo, - ReqParams: extractReqParams(r), - UserAgent: r.UserAgent(), - Host: host, - Port: port, + EventName: event.ObjectAccessedGet, + BucketName: bucket, + Object: objInfo, + ReqParams: extractReqParams(r), + RespElements: extractRespElements(w), + UserAgent: r.UserAgent(), + Host: host, + Port: port, }) } @@ -509,13 +510,14 @@ func (api objectAPIHandlers) HeadObjectHandler(w http.ResponseWriter, r *http.Re // Notify object accessed via a HEAD request. sendEvent(eventArgs{ - EventName: event.ObjectAccessedHead, - BucketName: bucket, - Object: objInfo, - ReqParams: extractReqParams(r), - UserAgent: r.UserAgent(), - Host: host, - Port: port, + EventName: event.ObjectAccessedHead, + BucketName: bucket, + Object: objInfo, + ReqParams: extractReqParams(r), + RespElements: extractRespElements(w), + UserAgent: r.UserAgent(), + Host: host, + Port: port, }) }