Add PutBucket and ListBuckets service

This commit is contained in:
Harshavardhana
2015-01-21 00:50:23 -08:00
parent e22ae2475a
commit 5b67da7d96
6 changed files with 197 additions and 25 deletions

View File

@@ -20,14 +20,24 @@ import (
"encoding/xml"
)
type ListResponse struct {
XMLName xml.Name `xml:"ListBucketResult"`
Name string `xml:"Name"`
storagerefix string
Marker string
MaxKeys int
IsTruncated bool
Contents []Content `xml:"Contents",innerxml`
type ObjectListResponse struct {
XMLName xml.Name `xml:"ListBucketResult"`
Name string `xml:"Name"`
Marker string
MaxKeys int
IsTruncated bool
Contents []Content `xml:"Contents",innerxml`
}
type BucketListResponse struct {
XMLName xml.Name `xml:"ListAllMyBucketsResult"`
Owner Owner
Buckets []Bucket `xml:"Buckets",innerxml`
}
type Bucket struct {
Name string
CreationDate string
}
type Content struct {

View File

@@ -42,7 +42,7 @@ func HttpHandler(storage *mstorage.Storage) http.Handler {
storage: storage,
}
mux.HandleFunc("/", api.listBucketsHandler).Methods("GET")
mux.HandleFunc("/{bucket}", api.listObjectsHandler).Methods("GET")
mux.HandleFunc("/{bucket}", api.putBucketHandler).Methods("PUT")
mux.HandleFunc("/{bucket}/", api.listObjectsHandler).Methods("GET")
mux.HandleFunc("/{bucket}/{object:.*}", api.getObjectHandler).Methods("GET")
mux.HandleFunc("/{bucket}/{object:.*}", api.putObjectHandler).Methods("PUT")
@@ -74,7 +74,31 @@ func (server *minioApi) getObjectHandler(w http.ResponseWriter, req *http.Reques
}
func (server *minioApi) listBucketsHandler(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("/"))
vars := mux.Vars(req)
prefix, ok := vars["prefix"]
if ok == false {
prefix = ""
}
contentType := "xml"
if req.Header["Accept"][0] == "application/json" {
contentType = "json"
}
buckets := server.storage.ListBuckets(prefix)
response := generateBucketsListResult(buckets)
var bytesBuffer bytes.Buffer
var encoder encoder
if contentType == "json" {
w.Header().Set("Content-Type", "application/json")
encoder = json.NewEncoder(&bytesBuffer)
} else {
w.Header().Set("Content-Type", "application/xml")
encoder = xml.NewEncoder(&bytesBuffer)
}
encoder.Encode(response)
w.Write(bytesBuffer.Bytes())
}
func (server *minioApi) listObjectsHandler(w http.ResponseWriter, req *http.Request) {
@@ -102,7 +126,7 @@ func (server *minioApi) listObjectsHandler(w http.ResponseWriter, req *http.Requ
}
objects := server.storage.ListObjects(bucket, prefix, 1000)
response := generateListResult(objects)
response := generateObjectsListResult(bucket, objects)
var bytesBuffer bytes.Buffer
var encoder encoder
@@ -130,7 +154,41 @@ func (server *minioApi) putObjectHandler(w http.ResponseWriter, req *http.Reques
}
}
func generateListResult(objects []mstorage.ObjectMetadata) ListResponse {
func (server *minioApi) putBucketHandler(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
bucket := vars["bucket"]
err := server.storage.StoreBucket(bucket)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(err.Error()))
return
}
}
func generateBucketsListResult(buckets []mstorage.BucketMetadata) (data BucketListResponse) {
listbuckets := []Bucket{}
owner := Owner{
ID: "minio",
DisplayName: "minio",
}
for _, bucket := range buckets {
listbucket := Bucket{
Name: bucket.Name,
CreationDate: formatDate(bucket.Created),
}
listbuckets = append(listbuckets, listbucket)
}
data = BucketListResponse{
Owner: owner,
Buckets: listbuckets,
}
return
}
func generateObjectsListResult(bucket string, objects []mstorage.ObjectMetadata) (data ObjectListResponse) {
contents := []Content{}
owner := Owner{
@@ -149,13 +207,13 @@ func generateListResult(objects []mstorage.ObjectMetadata) ListResponse {
}
contents = append(contents, content)
}
data := ListResponse{
Name: "name",
data = ObjectListResponse{
Name: bucket,
Contents: contents,
MaxKeys: len(objects),
IsTruncated: false,
}
return data
return
}
func formatDate(sec int64) string {