Monorepo for Tangled tangled.org
856
fork

Configure Feed

Select the types of activity you want to include in your feed.

knotserver: limit request size #21

open opened by oppi.li targeting master from op/nzqqortvpnzz
Labels

None yet.

assignee

None yet.

Participants 1
AT URI
at://did:plc:qfpnj4og54vl56wngdriaxug/sh.tangled.repo.pull/3mkhpdja67w22
+35 -3
Diff #0
+30 -3
knotserver/xrpc/xrpc.go
··· 1 1 package xrpc 2 2 3 3 import ( 4 + "bytes" 4 5 "encoding/json" 6 + "errors" 5 7 "log/slog" 6 8 "net/http" 7 9 "os" ··· 122 124 json.NewEncoder(w).Encode(e) 123 125 } 124 126 127 + type limitWriter struct { 128 + buf bytes.Buffer 129 + limit int 130 + written int 131 + } 132 + 133 + var errResponseTooLarge = errors.New("response too large") 134 + 135 + func (lw *limitWriter) Write(p []byte) (int, error) { 136 + if lw.written+len(p) > lw.limit { 137 + return 0, errResponseTooLarge 138 + } 139 + n, err := lw.buf.Write(p) 140 + lw.written += n 141 + return n, err 142 + } 143 + 144 + const maxResponseBytes = 5 * 1024 * 1024 145 + 125 146 func writeJson(w http.ResponseWriter, response any) { 126 - w.Header().Set("Content-Type", "application/json") 127 - if err := json.NewEncoder(w).Encode(response); err != nil { 128 - writeError(w, xrpcerr.GenericError(err), http.StatusInternalServerError) 147 + lw := &limitWriter{limit: maxResponseBytes} 148 + if err := json.NewEncoder(lw).Encode(response); err != nil { 149 + if errors.Is(err, errResponseTooLarge) { 150 + writeError(w, xrpcerr.RequestTooLargeError, http.StatusRequestEntityTooLarge) 151 + } else { 152 + writeError(w, xrpcerr.GenericError(err), http.StatusInternalServerError) 153 + } 129 154 return 130 155 } 156 + w.Header().Set("Content-Type", "application/json") 157 + w.Write(lw.buf.Bytes()) 131 158 }
+5
xrpc/errors/errors.go
··· 66 66 WithMessage("failed to access ref"), 67 67 ) 68 68 69 + var RequestTooLargeError = NewXrpcError( 70 + WithTag("RequestTooLarge"), 71 + WithMessage("request was too large"), 72 + ) 73 + 69 74 var AuthError = func(err error) XrpcError { 70 75 return NewXrpcError( 71 76 WithTag("Auth"),

History

2 rounds 0 comments
sign up or login to add to the discussion
1 commit
expand
knotserver: limit request size
merge conflicts detected
expand
  • knotserver/config/config.go:23
  • knotserver/xrpc/create_repo.go:109
  • knotserver/xrpc/list_keys.go:45
  • knotserver/xrpc/owner.go:18
  • knotserver/xrpc/repo_blob.go:58
  • knotserver/xrpc/repo_branch.go:81
  • knotserver/xrpc/repo_branches.go:45
  • knotserver/xrpc/repo_compare.go:99
  • knotserver/xrpc/repo_diff.go:37
  • knotserver/xrpc/repo_get_default_branch.go:35
  • knotserver/xrpc/repo_languages.go:72
  • knotserver/xrpc/repo_log.go:82
  • knotserver/xrpc/repo_tag.go:81
  • knotserver/xrpc/repo_tags.go:75
  • knotserver/xrpc/repo_tree.go:142
  • knotserver/xrpc/version.go:56
  • knotserver/xrpc/xrpc.go:1
  • nix/modules/knot.nix:177
  • xrpc/errors/errors.go:66
expand 0 comments
oppi.li submitted #0
1 commit
expand
knotserver: limit request size
expand 0 comments