diff options
| author | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 16:57:16 +0000 |
|---|---|---|
| committer | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 16:57:16 +0000 |
| commit | bac4fe6af92603eb0d5c22fed3f1c15a8d7c51f2 (patch) | |
| tree | c6e7c8180ecab438b17f70baac9fc6d7bb422782 | |
| parent | 06d59369fee711cf1e9cd64cfcf5bc291cadcf77 (diff) | |
| download | http-server-go-bac4fe6af92603eb0d5c22fed3f1c15a8d7c51f2.tar.gz http-server-go-bac4fe6af92603eb0d5c22fed3f1c15a8d7c51f2.zip | |
codecrafters submit [skip ci]
| -rw-r--r-- | app/handler.go | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/app/handler.go b/app/handler.go index 634e4a9..50de29f 100644 --- a/app/handler.go +++ b/app/handler.go @@ -1,11 +1,28 @@ package main import ( + "fmt" + "io" + "os" + "path/filepath" "regexp" + "slices" "strconv" "strings" ) +var directory = "" + +func init() { + args := os.Args + index := slices.Index(args, "--directory") + if index > 0 { + directory = args[index+1] + } + + fmt.Println("directory: ", directory) +} + func basePathHandler(request *Request) *Response { return NewResponse(Ok, nil, nil) } @@ -26,8 +43,25 @@ func userAgentHandler(request *Request) *Response { }, []byte(header)) } +func fileHandler(request *Request) *Response { + file, err := os.Open(filepath.Join(directory, strings.Split(request.Target(), "/")[2])) + if err != nil { + return NewResponse(NotFound, nil, nil) + } + + buf, _ := io.ReadAll(file) + return NewResponse(Ok, map[string]string{ + "Content-Type": "application/octet-stream", + "Content-Length": strconv.Itoa(len(buf)), + }, buf) +} + 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) + } } |