diff options
| author | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 17:01:32 +0000 |
|---|---|---|
| committer | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 17:01:32 +0000 |
| commit | 6df68cb970c6ec2d57a6d68fb901df70b67693bf (patch) | |
| tree | 1b53efd58b754184d6743d757abb0479c6e7a87d | |
| parent | bac4fe6af92603eb0d5c22fed3f1c15a8d7c51f2 (diff) | |
| download | http-server-go-6df68cb970c6ec2d57a6d68fb901df70b67693bf.tar.gz http-server-go-6df68cb970c6ec2d57a6d68fb901df70b67693bf.zip | |
codecrafters submit [skip ci]
| -rw-r--r-- | app/handler.go | 29 | ||||
| -rw-r--r-- | app/request.go | 7 | ||||
| -rw-r--r-- | app/router.go | 4 | ||||
| -rw-r--r-- | app/status.go | 6 |
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 { |