디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[일반] 라우터 만들어보기

꿈돌리갤로그로 이동합니다. 2021.12.26 14:42:29
조회 109 추천 0 댓글 0
														
package router

import (
"bytes"
"encoding/json"
"io/fs"
"io/ioutil"
"log"
"mime"
"net/http"
"path"
"regexp"
"router-practice/logging"
"router-practice/variable"
"strings"
)

var StaticServer Handler

func New() *App {
app := &App{
DefaultRoute: func(c *Context) {
c.Text(http.StatusNotFound, "Not found")
},
MethodNotAllowed: func(c *Context) {
c.Text(http.StatusNotFound, "Method not allowed")
},
}

return app
}

func (a *App) Group(prefix string) *RouteGroup {
group := &RouteGroup{
App: a,
Prefix: prefix,
}

return group
}

func (g *RouteGroup) Handle(pattern string, handler Handler, methods ...string) {
g.App.Handle(g.Prefix+pattern, handler, methods...)
}

func (a *App) Handle(pattern string, handler Handler, methods ...string) {
re := regexp.MustCompile(pattern)
m := Methods{}

for _, method := range methods {
switch method {
case "*":
m["GET"] = true
m["HEAD"] = true
m["POST"] = true
m["PUT"] = true
m["PATCH"] = true
m["DELETE"] = true
default:
m[strings.ToUpper(method)] = true
}
}

route := Route{Pattern: re, Handler: handler, Methods: m}

a.Routes = append(a.Routes, route)
}

func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c := &Context{Request: r, ResponseWriter: w}

b, _ := ioutil.ReadAll(c.Body)
c.Body = ioutil.NopCloser(bytes.NewBuffer(b))

logger := logging.Object.Log()
if json.Valid(b) {
// logger = logger.RawJSON("body", bytes.ReplaceAll(b, []byte(" "), []byte("")))
bc := new(bytes.Buffer)
json.Compact(bc, b)
logger = logger.RawJSON("body", bc.Bytes())
} else {
// logger = logger.Fields(map[string]interface{}{"body": b})
logger = logger.Fields(map[string]interface{}{"body": bytes.ReplaceAll(b, []byte(" "), []byte(""))})
}

logger.Timestamp().
Str("method", c.Method).
Str("path", c.URL.Path).
Str("remote", c.RemoteAddr).
Str("user-agent", c.UserAgent()).
Fields(map[string]interface{}{"header": c.Request.Header}).
Send()

for _, rt := range a.Routes {
if matches := rt.Pattern.FindStringSubmatch(c.URL.Path); len(matches) > 0 {
log.Println("Route path regex:", rt.Pattern.String(), c.URL.Path)

if !rt.Methods[c.Method] {
// a.MethodNotAllowed(c)
a.DefaultRoute(c)
return
}

if len(matches) > 1 {
c.Params = matches[1:]
}

rt.Handler(c)
return
}
}

a.DefaultRoute(c)
}

func (c *Context) Text(code int, body string) {
c.ResponseWriter.Header().Set("Content-Type", "text/plain")
c.WriteHeader(code)

c.ResponseWriter.Write([]byte(body))
}

func (c *Context) Html(code int, body []byte) {
c.ResponseWriter.Header().Set("Content-Type", "text/html")
c.WriteHeader(code)

c.ResponseWriter.Write(body)
}

func (c *Context) File(code int, body []byte) {
c.ResponseWriter.Header().Set("Content-Type", mime.TypeByExtension(path.Ext(c.URL.Path)))
c.WriteHeader(code)

c.ResponseWriter.Write(body)
}

func SetupStaticServer() {
StaticContent, err := fs.Sub(fs.FS(variable.Static), "static")
if err != nil {
logging.Object.Warn().Err(err).Msg("SetupStatic")
}
s := http.StripPrefix("/static/", http.FileServer(http.FS(StaticContent))) // embed storage
// s := http.StripPrefix("/static/", http.FileServer(http.Dir("../static"))) // real storage
StaticServer = func(c *Context) { s.ServeHTTP(c.ResponseWriter, c.Request) }
}



누가 gists에 올려논 정규표현식 라우터 코드 베껴쓰기 ㅇㅂㅇ


출처 : https://gist.github.com/reagent/043da4661d2984e9ecb1ccb5343bf438


참고 : https://go.dev/doc/articles/wiki/



practice-golang/router-practice: Route handler practice (github.com)


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2856 설문 주위 눈치 안 보고(어쩌면 눈치 없이) MZ식 '직설 화법' 날릴 것 같은 스타는? 운영자 24/04/29 - -
477 질문 서로 다른 배열인데 왜 값이 바뀌는 지 의문 [2] 뉴비(1.226) 22.04.11 134 0
475 일반 go언어로 씹덕 디스코드봇 만드는중 [2] ㅇㅇ(39.7) 22.04.08 312 3
474 질문 국내에 container 개발회사 많나여 [1] ㄷㅈㄹㅇㄴ(14.4) 22.04.06 162 0
472 정보 Go Proverbs By Rob Pike [1] ㅇㅇ(128.134) 22.04.04 103 1
471 일반 인터페이스를 위한 I 접투어는 끔찍하냐? [2] ㅇㅇ(128.134) 22.04.04 119 0
468 일반 저는 c처럼 쓰고 싶어서 go를 쓰는건데 [5] 꿈돌리갤로그로 이동합니다. 22.03.27 268 0
467 일반 제네릭 컨테이너 나올때까지 숨 참는다 [3] ㅇㅇ(39.7) 22.03.25 131 0
466 질문 go언어 별론가요? [4] ㅇㅇ(39.7) 22.03.24 283 0
464 질문 go exex.Command 출력 [2] ㅇㅇ(119.69) 22.03.21 96 0
463 일반 딴거 필요없고 STL 내놓으라고 [5] ㅇㅇ(118.235) 22.03.18 215 0
462 일반 go work [1] 꿈돌리갤로그로 이동합니다. 22.03.17 202 0
460 일반 workspace mode , go.work [1] 꿈돌리갤로그로 이동합니다. 22.03.02 95 1
459 일반 윈도우에서 cgo 찍먹 꿈돌리갤로그로 이동합니다. 22.03.01 114 0
457 질문 포트없이 사용 방법 있나요? [2] ㅇㅇ(122.199) 22.02.21 102 0
455 질문 localhost, 127.0.0.1 포트가 안먹히는 이유가 있을까요? [3] ㅇㅇ(122.199) 22.02.17 126 0
454 일반 뉴비 다운로더 만들거임 [3] ㅇㅇ(61.98) 22.02.17 146 0
453 질문 go 이제 터커꺼 한번 다 돌렸는데 할만한 미니 프로젝트 추천 부탁드립니 [2] 후잉(39.7) 22.02.15 192 0
452 일반 설리 [1] 설리장인갤로그로 이동합니다. 22.02.15 69 0
451 일반 이런 갤러리가 있었네.. [3] 오늘갤로그로 이동합니다. 22.02.07 127 1
448 일반 고 언어가 삼항 연산자를 지원한다면 어떠한 모습이였을까요. [1] ㅇㅂㅇ(121.152) 22.02.01 165 0
447 일반 hello world [2] 꿈돌리갤로그로 이동합니다. 22.01.31 95 0
445 일반 다른 파일에 정의되어있는 구조체를 가져온 다음에 이용하기 릴본(113.43) 22.01.26 65 1
444 일반 golang if 조건문의 초기화문 [3] 릴본(113.43) 22.01.25 127 0
443 일반 fsnotify 꿈돌리갤로그로 이동합니다. 22.01.24 64 0
442 일반 프갤 식민지 순회중 [1] ㅇㅇ(203.10) 22.01.24 91 0
441 정보 7년간 Go 쓰면서 느낀점 (의식의 흐름) [4] Go 7~8년차(118.33) 22.01.24 895 4
439 질문 게이트웨이? w 응답 r 요청은 어떻게 다른 컨테이너로 전달하나요? [3] ㅇㅇ(119.56) 22.01.19 108 0
438 일반 단어 marshalling에 대해서 릴본겧이(113.43) 22.01.18 57 0
437 정보 구조체 테그 릴본겧이(113.43) 22.01.18 38 0
431 일반 원래 구글에서 권장하던 IDE는 꿈돌리갤로그로 이동합니다. 22.01.12 254 0
429 일반 vscode-go 디버그 콘솔 입력 문제 [3] 꿈돌리갤로그로 이동합니다. 22.01.11 258 0
426 질문 고린이 포인터 질문 [2] 고린이(218.235) 22.01.10 127 0
425 질문 도커 빌드할때 고 빌드안하고 이미지 만들수 있나요? [7] ㅇㅇ(119.56) 22.01.09 125 0
424 질문 모듈화 진짜 스트레스 받습니다. [3] ㅇㅇ(223.38) 22.01.06 230 0
423 일반 유닛 테스트 [1] 꿈돌리갤로그로 이동합니다. 22.01.04 119 0
422 일반 요일 계산 [4] 꿈돌리갤로그로 이동합니다. 22.01.02 94 0
421 질문 한주를 계산하는 방법이 있나요? [1] ㅇㅇ(122.199) 22.01.02 78 0
420 정보 replace를 이용한 local 패키지 사용법 ㅇㅇ(211.46) 22.01.01 114 2
419 질문 import 에러 이거 왜이러는거임? [3] ㅇㅇ(121.134) 21.12.31 119 0
418 질문 초보 패키지, 모듈 관리 질문... [1] ㅇㅇ(121.134) 21.12.31 107 0
416 일반 와 진짜 일중독 심해진듯 [1] ㅇㅇ(120.50) 21.12.30 147 1
일반 라우터 만들어보기 꿈돌리갤로그로 이동합니다. 21.12.26 109 0
412 일반 httprouter 찍먹 꿈돌리갤로그로 이동합니다. 21.12.24 49 0
411 질문 서버 api 만들때 key 같은건 어떻게 전달하나요? [1] ㅇㅇ(122.199) 21.12.23 103 0
410 정보 golang time.Time zero value에 대해서 leewoooo갤로그로 이동합니다. 21.12.22 70 3
409 일반 godom 찍먹 꿈돌리갤로그로 이동합니다. 21.12.22 98 0
408 질문 forr select로 계속 도는 고루틴 이름 어케 지어야 좋을까 [2] ㅇㅇ(128.134) 21.12.21 73 1
405 정보 gRPC 인터셉터 공부한 것 공유합니다. leewoooo갤로그로 이동합니다. 21.12.11 80 2
403 일반 go 1.17.5 가 나왔군요 꿈돌리갤로그로 이동합니다. 21.12.10 127 0
399 정보 gRPC 통신 패턴 공부한 것 공유합니다. [3] leewoooo갤로그로 이동합니다. 21.12.07 248 2
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2