Merge pull request #1197 from brendanashworth/improve-DRY-1

api: DRY code and add new test
master
Harshavardhana 9 years ago
commit 6f842124ad
  1. 37
      api-headers.go
  2. 40
      api-headers_test.go
  3. 2
      api-response.go
  4. 12
      bucket-handlers.go
  5. 8
      object-handlers.go

@ -50,10 +50,9 @@ func setCommonHeaders(w http.ResponseWriter) {
w.Header().Set("Accept-Ranges", "bytes") w.Header().Set("Accept-Ranges", "bytes")
} }
// Write error response headers // Encodes the response headers into XML format.
func encodeErrorResponse(response interface{}) []byte { func encodeResponse(response interface{}) []byte {
var bytesBuffer bytes.Buffer var bytesBuffer bytes.Buffer
// write common headers
bytesBuffer.WriteString(xml.Header) bytesBuffer.WriteString(xml.Header)
e := xml.NewEncoder(&bytesBuffer) e := xml.NewEncoder(&bytesBuffer)
e.Encode(response) e.Encode(response)
@ -63,40 +62,26 @@ func encodeErrorResponse(response interface{}) []byte {
// Write object header // Write object header
func setObjectHeaders(w http.ResponseWriter, metadata fs.ObjectMetadata, contentRange *httpRange) { func setObjectHeaders(w http.ResponseWriter, metadata fs.ObjectMetadata, contentRange *httpRange) {
// set common headers // set common headers
if contentRange != nil {
if contentRange.length > 0 {
w.Header().Set("Content-Length", strconv.FormatInt(contentRange.length, 10))
setCommonHeaders(w)
} else {
w.Header().Set("Content-Length", strconv.FormatInt(metadata.Size, 10))
setCommonHeaders(w) setCommonHeaders(w)
}
} else { // set object-related metadata headers
w.Header().Set("Content-Length", strconv.FormatInt(metadata.Size, 10))
setCommonHeaders(w)
}
// set object headers
lastModified := metadata.LastModified.UTC().Format(http.TimeFormat) lastModified := metadata.LastModified.UTC().Format(http.TimeFormat)
// object related headers w.Header().Set("Last-Modified", lastModified)
w.Header().Set("Content-Type", metadata.ContentType) w.Header().Set("Content-Type", metadata.ContentType)
if metadata.MD5 != "" { if metadata.MD5 != "" {
w.Header().Set("ETag", "\""+metadata.MD5+"\"") w.Header().Set("ETag", "\""+metadata.MD5+"\"")
} }
w.Header().Set("Last-Modified", lastModified)
// set content range w.Header().Set("Content-Length", strconv.FormatInt(metadata.Size, 10))
// for providing ranged content
if contentRange != nil { if contentRange != nil {
if contentRange.start > 0 || contentRange.length > 0 { if contentRange.start > 0 || contentRange.length > 0 {
// override content-length
w.Header().Set("Content-Length", strconv.FormatInt(contentRange.length, 10))
w.Header().Set("Content-Range", contentRange.String()) w.Header().Set("Content-Range", contentRange.String())
w.WriteHeader(http.StatusPartialContent) w.WriteHeader(http.StatusPartialContent)
} }
} }
} }
func encodeSuccessResponse(response interface{}) []byte {
var bytesBuffer bytes.Buffer
bytesBuffer.WriteString(xml.Header)
e := xml.NewEncoder(&bytesBuffer)
e.Encode(response)
return bytesBuffer.Bytes()
}

@ -0,0 +1,40 @@
/*
* Minio Cloud Storage, (C) 2015, 2016 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package main
import (
"testing"
)
func TestGenerateRequestID(t *testing.T) {
// Ensure that it returns an alphanumeric result of length 16.
var id []byte = generateRequestID()
if len(id) != 16 {
t.Fail()
}
var e rune
for _, char := range id {
e = rune(char)
// Ensure that it is alphanumeric, in this case, between 0-9 and A-Z.
if !(('0' <= e && e <= '9') || ('A' <= e && e <= 'Z')) {
t.Fail()
}
}
}

@ -436,7 +436,7 @@ func writeErrorResponse(w http.ResponseWriter, req *http.Request, errorType int,
error := getErrorCode(errorType) error := getErrorCode(errorType)
// generate error response // generate error response
errorResponse := getErrorResponse(error, resource) errorResponse := getErrorResponse(error, resource)
encodedErrorResponse := encodeErrorResponse(errorResponse) encodedErrorResponse := encodeResponse(errorResponse)
// set common headers // set common headers
setCommonHeaders(w) setCommonHeaders(w)
// write Header // write Header

@ -63,9 +63,9 @@ func (api storageAPI) GetBucketLocationHandler(w http.ResponseWriter, r *http.Re
} }
// Generate response. // Generate response.
encodedSuccessResponse := encodeSuccessResponse(LocationResponse{}) encodedSuccessResponse := encodeResponse(LocationResponse{})
if api.Region != "us-east-1" { if api.Region != "us-east-1" {
encodedSuccessResponse = encodeSuccessResponse(LocationResponse{ encodedSuccessResponse = encodeResponse(LocationResponse{
Location: api.Region, Location: api.Region,
}) })
} }
@ -117,7 +117,7 @@ func (api storageAPI) ListMultipartUploadsHandler(w http.ResponseWriter, r *http
} }
// generate response // generate response
response := generateListMultipartUploadsResponse(bucket, resources) response := generateListMultipartUploadsResponse(bucket, resources)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// write headers. // write headers.
setCommonHeaders(w) setCommonHeaders(w)
// write success response. // write success response.
@ -160,7 +160,7 @@ func (api storageAPI) ListObjectsHandler(w http.ResponseWriter, r *http.Request)
if err == nil { if err == nil {
// generate response // generate response
response := generateListObjectsResponse(bucket, prefix, marker, delimiter, maxkeys, listResp) response := generateListObjectsResponse(bucket, prefix, marker, delimiter, maxkeys, listResp)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// Write headers // Write headers
setCommonHeaders(w) setCommonHeaders(w)
// Write success response. // Write success response.
@ -201,7 +201,7 @@ func (api storageAPI) ListBucketsHandler(w http.ResponseWriter, r *http.Request)
if err == nil { if err == nil {
// generate response // generate response
response := generateListBucketsResponse(buckets) response := generateListBucketsResponse(buckets)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// write headers // write headers
setCommonHeaders(w) setCommonHeaders(w)
// write response // write response
@ -475,7 +475,7 @@ func (api storageAPI) GetBucketACLHandler(w http.ResponseWriter, r *http.Request
} }
// Generate response // Generate response
response := generateAccessControlPolicyResponse(bucketMetadata.ACL) response := generateAccessControlPolicyResponse(bucketMetadata.ACL)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// Write headers // Write headers
setCommonHeaders(w) setCommonHeaders(w)
// Write success response. // Write success response.

@ -392,7 +392,7 @@ func (api storageAPI) CopyObjectHandler(w http.ResponseWriter, r *http.Request)
return return
} }
response := generateCopyObjectResponse(metadata.MD5, metadata.LastModified) response := generateCopyObjectResponse(metadata.MD5, metadata.LastModified)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// write headers // write headers
setCommonHeaders(w) setCommonHeaders(w)
// write success response. // write success response.
@ -534,7 +534,7 @@ func (api storageAPI) NewMultipartUploadHandler(w http.ResponseWriter, r *http.R
} }
response := generateInitiateMultipartUploadResponse(bucket, object, uploadID) response := generateInitiateMultipartUploadResponse(bucket, object, uploadID)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// write headers // write headers
setCommonHeaders(w) setCommonHeaders(w)
// write success response. // write success response.
@ -723,7 +723,7 @@ func (api storageAPI) ListObjectPartsHandler(w http.ResponseWriter, r *http.Requ
return return
} }
response := generateListPartsResponse(objectResourcesMetadata) response := generateListPartsResponse(objectResourcesMetadata)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// write headers. // write headers.
setCommonHeaders(w) setCommonHeaders(w)
// write success response. // write success response.
@ -802,7 +802,7 @@ func (api storageAPI) CompleteMultipartUploadHandler(w http.ResponseWriter, r *h
location := getLocation(r) location := getLocation(r)
// Generate complete multipart response. // Generate complete multipart response.
response := generateCompleteMultpartUploadResponse(bucket, object, location, metadata.MD5) response := generateCompleteMultpartUploadResponse(bucket, object, location, metadata.MD5)
encodedSuccessResponse := encodeSuccessResponse(response) encodedSuccessResponse := encodeResponse(response)
// write headers // write headers
setCommonHeaders(w) setCommonHeaders(w)
// write success response. // write success response.

Loading…
Cancel
Save