Monorepo for Tangled

appview/pulls: compress patch blobs using gzip

there is a very strange bug in the bluesky-pds implementation that
prevents blobs with the text `<svg` from being uploaded. it triggers a
500 because the underlying MIME type detection library assumes XML but
the provided MIME type does not match.

ref: https://github.com/bluesky-social/atproto/issues/3151

gzipping the content lets us upload this without any issues.

Signed-off-by: oppiliappan <me@oppi.li>

+16 -5
+16 -5
appview/pulls/pulls.go
··· 1 1 package pulls 2 2 3 3 import ( 4 + "bytes" 5 + "compress/gzip" 4 6 "context" 5 7 "database/sql" 6 8 "encoding/json" 7 9 "errors" 8 10 "fmt" 11 + "io" 9 12 "log" 10 13 "log/slog" 11 14 "net/http" ··· 1241 1244 return 1242 1245 } 1243 1246 1244 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, strings.NewReader(patch)) 1247 + blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 1245 1248 if err != nil { 1246 1249 log.Println("failed to upload patch", err) 1247 1250 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.") ··· 1335 1338 // apply all record creations at once 1336 1339 var writes []*comatproto.RepoApplyWrites_Input_Writes_Elem 1337 1340 for _, p := range stack { 1338 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, strings.NewReader(p.LatestPatch())) 1341 + blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(p.LatestPatch())) 1339 1342 if err != nil { 1340 1343 log.Println("failed to upload patch blob", err) 1341 1344 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.") ··· 1885 1888 return 1886 1889 } 1887 1890 1888 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, strings.NewReader(patch)) 1891 + blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 1889 1892 if err != nil { 1890 1893 log.Println("failed to upload patch blob", err) 1891 1894 s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") ··· 2027 2030 return 2028 2031 } 2029 2032 2030 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, strings.NewReader(patch)) 2033 + blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 2031 2034 if err != nil { 2032 2035 log.Println("failed to upload patch blob", err) 2033 2036 s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") ··· 2069 2072 return 2070 2073 } 2071 2074 2072 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, strings.NewReader(patch)) 2075 + blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 2073 2076 if err != nil { 2074 2077 log.Println("failed to upload patch blob", err) 2075 2078 s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") ··· 2452 2455 2453 2456 return stack, nil 2454 2457 } 2458 + 2459 + func gz(s string) io.Reader { 2460 + var b bytes.Buffer 2461 + w := gzip.NewWriter(&b) 2462 + w.Write([]byte(s)) 2463 + w.Close() 2464 + return &b 2465 + }