aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/handler.go29
-rw-r--r--app/request.go7
-rw-r--r--app/router.go4
-rw-r--r--app/status.go6
4 files changed, 41 insertions, 5 deletions
diff --git a/app/handler.go b/app/handler.go
index 50de29f..02f4b27 100644
--- a/app/handler.go
+++ b/app/handler.go
@@ -43,7 +43,7 @@ func userAgentHandler(request *Request) *Response {
}, []byte(header))
}
-func fileHandler(request *Request) *Response {
+func getFile(request *Request) *Response {
file, err := os.Open(filepath.Join(directory, strings.Split(request.Target(), "/")[2]))
if err != nil {
return NewResponse(NotFound, nil, nil)
@@ -56,12 +56,37 @@ func fileHandler(request *Request) *Response {
}, buf)
}
+func createFile(request *Request) *Response {
+ fPath := filepath.Join(directory, strings.Split(request.Target(), "/")[2])
+ fmt.Println("create file: ", fPath)
+
+ file, err := os.Create(fPath)
+ if err != nil {
+ return NewResponse(InternalServerError, nil, nil)
+ }
+
+ defer file.Close()
+
+ length, err := strconv.Atoi(request.Header("Content-Length"))
+ if err != nil {
+ return NewResponse(InternalServerError, nil, nil)
+ }
+
+ _, err = io.CopyN(file, request.Body(), int64(length))
+ if err != nil {
+ return NewResponse(InternalServerError, nil, nil)
+ }
+
+ return NewResponse(Created, nil, nil)
+}
+
func Register(builder *RouterBuilder) {
builder.Add("GET", regexp.MustCompile("^/$"), basePathHandler)
builder.Add("GET", regexp.MustCompile("^/echo/[a-zA-Z]+$"), echoHandler)
builder.Add("GET", regexp.MustCompile("^/user-agent$"), userAgentHandler)
if directory != "" {
- builder.Add("GET", regexp.MustCompile("^/files/.+$"), fileHandler)
+ builder.Add("GET", regexp.MustCompile("^/files/.+$"), getFile)
+ builder.Add("POST", regexp.MustCompile("^/files/.+$"), createFile)
}
}
diff --git a/app/request.go b/app/request.go
index 8dd161b..6b72108 100644
--- a/app/request.go
+++ b/app/request.go
@@ -19,6 +19,7 @@ type requestLine struct {
type Request struct {
line requestLine
headers requestHeaders
+ body *bufio.Reader
}
func newRequestHeaders(reader *bufio.Reader) (requestHeaders, error) {
@@ -72,7 +73,11 @@ func NewRequest(reader *bufio.Reader) (*Request, error) {
return nil, err
}
- return &Request{line, headers}, nil
+ return &Request{line: line, headers: headers, body: reader}, nil
+}
+
+func (r *Request) Body() *bufio.Reader {
+ return r.body
}
func (r *Request) Method() string {
diff --git a/app/router.go b/app/router.go
index d541b31..7921ae2 100644
--- a/app/router.go
+++ b/app/router.go
@@ -2,6 +2,7 @@ package main
import (
"bufio"
+ "fmt"
"io"
"net"
"regexp"
@@ -26,16 +27,19 @@ func (r *Router) handler(request *Request) func(*Request) *Response {
func (r *Router) write(writer io.Writer, response *Response) (err error) {
_, err = writer.Write(response.StatusLine())
if err != nil {
+ fmt.Println("Error writing status:", err)
return
}
_, err = writer.Write(response.Headers())
if err != nil {
+ fmt.Println("Error writing headers:", err)
return
}
_, err = writer.Write(response.Body())
if err != nil {
+ fmt.Println("Error writing body:", err)
return
}
diff --git a/app/status.go b/app/status.go
index 6a905c9..dccb508 100644
--- a/app/status.go
+++ b/app/status.go
@@ -11,8 +11,10 @@ type Status interface {
}
var (
- Ok Status = &status{200, "OK"}
- NotFound Status = &status{404, "Not Found"}
+ Ok Status = &status{200, "OK"}
+ Created Status = &status{201, "Created"}
+ NotFound Status = &status{404, "Not Found"}
+ InternalServerError Status = &status{500, "Internal Server Error"}
)
func (s *status) Code() int {