|
@@ -1,6 +1,7 @@
|
|
package docker
|
|
package docker
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "bytes"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
"fmt"
|
|
"fmt"
|
|
"github.com/dotcloud/docker/auth"
|
|
"github.com/dotcloud/docker/auth"
|
|
@@ -9,6 +10,7 @@ import (
|
|
"io"
|
|
"io"
|
|
"log"
|
|
"log"
|
|
"net/http"
|
|
"net/http"
|
|
|
|
+ "os"
|
|
"strconv"
|
|
"strconv"
|
|
"strings"
|
|
"strings"
|
|
)
|
|
)
|
|
@@ -31,6 +33,13 @@ func parseForm(r *http.Request) error {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func parseMultipartForm(r *http.Request) error {
|
|
|
|
+ if err := r.ParseMultipartForm(4096); err != nil && !strings.HasPrefix(err.Error(), "mime:") {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
func httpError(w http.ResponseWriter, err error) {
|
|
func httpError(w http.ResponseWriter, err error) {
|
|
if strings.HasPrefix(err.Error(), "No such") {
|
|
if strings.HasPrefix(err.Error(), "No such") {
|
|
http.Error(w, err.Error(), http.StatusNotFound)
|
|
http.Error(w, err.Error(), http.StatusNotFound)
|
|
@@ -329,9 +338,15 @@ func postImagesInsert(srv *Server, w http.ResponseWriter, r *http.Request, vars
|
|
}
|
|
}
|
|
name := vars["name"]
|
|
name := vars["name"]
|
|
|
|
|
|
- if err := srv.ImageInsert(name, url, path, w); err != nil {
|
|
|
|
|
|
+ imgId, err := srv.ImageInsert(name, url, path, w)
|
|
|
|
+ if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ b, err := json.Marshal(&ApiId{Id: imgId})
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ writeJson(w, b)
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
@@ -585,6 +600,68 @@ func postImagesGetCache(srv *Server, w http.ResponseWriter, r *http.Request, var
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func Upload(w http.ResponseWriter, req *http.Request) {
|
|
|
|
+
|
|
|
|
+ mr, err := req.MultipartReader()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ length := req.ContentLength
|
|
|
|
+ for {
|
|
|
|
+
|
|
|
|
+ part, err := mr.NextPart()
|
|
|
|
+ if err == io.EOF {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ var read int64
|
|
|
|
+ var p float32
|
|
|
|
+ for {
|
|
|
|
+ buffer := make([]byte, 100000)
|
|
|
|
+ cBytes, err := part.Read(buffer)
|
|
|
|
+ if err == io.EOF {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ read = read + int64(cBytes)
|
|
|
|
+ //fmt.Printf("read: %v \n",read )
|
|
|
|
+ p = float32(read) / float32(length) * 100
|
|
|
|
+ fmt.Printf("progress: %v \n", p)
|
|
|
|
+ os.Stdout.Write(buffer)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func postBuild(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
|
+
|
|
|
|
+ Upload(w, r)
|
|
|
|
+
|
|
|
|
+ // io.Copy(os.Stderr, r.Body)
|
|
|
|
+
|
|
|
|
+ if err := r.ParseMultipartForm(409699); err != nil {
|
|
|
|
+ utils.Debugf("----- %s\n", err)
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mpr, err := r.MultipartReader()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ p, err := mpr.NextPart()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dockerfile := make([]byte, 4096)
|
|
|
|
+ p.Read(dockerfile)
|
|
|
|
+
|
|
|
|
+ utils.Debugf("Dockerfile >>>%s<<<\n", dockerfile)
|
|
|
|
+ b := NewBuildFile(srv, w)
|
|
|
|
+ if _, err := b.Build(bytes.NewReader(dockerfile)); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
func ListenAndServe(addr string, srv *Server, logging bool) error {
|
|
func ListenAndServe(addr string, srv *Server, logging bool) error {
|
|
r := mux.NewRouter()
|
|
r := mux.NewRouter()
|
|
log.Printf("Listening for HTTP on %s\n", addr)
|
|
log.Printf("Listening for HTTP on %s\n", addr)
|
|
@@ -607,6 +684,7 @@ func ListenAndServe(addr string, srv *Server, logging bool) error {
|
|
"POST": {
|
|
"POST": {
|
|
"/auth": postAuth,
|
|
"/auth": postAuth,
|
|
"/commit": postCommit,
|
|
"/commit": postCommit,
|
|
|
|
+ "/build": postBuild,
|
|
"/images/create": postImagesCreate,
|
|
"/images/create": postImagesCreate,
|
|
"/images/{name:.*}/insert": postImagesInsert,
|
|
"/images/{name:.*}/insert": postImagesInsert,
|
|
"/images/{name:.*}/push": postImagesPush,
|
|
"/images/{name:.*}/push": postImagesPush,
|