)]}'
{"metropolis/node/core/metrics/exporters.go":[{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"531c40f9a2c3270366146428b00bb536d167226c","unresolved":true,"context_lines":[{"line_number":50,"context_line":"\t\tHost:   net.JoinHostPort(\"127.0.0.1\", e.Port.PortString()),"},{"line_number":51,"context_line":"\t\tPath:   \"/metrics\","},{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tlogger.V(1).Infof(\"Forwarding %s to %s\", r.URL.String(), outreq.URL.String())"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"}],"source_content_type":"text/x-go","patch_set":1,"id":"5d3f2aa4_a532cf00","line":53,"updated":"2023-06-15 10:30:59.000000000","message":"might as well prefix this with the remote port:addr here (maybe in the other log statements as well?)","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"140947505e7cd376a27c37da4701bc880b90a9c7","unresolved":false,"context_lines":[{"line_number":50,"context_line":"\t\tHost:   net.JoinHostPort(\"127.0.0.1\", e.Port.PortString()),"},{"line_number":51,"context_line":"\t\tPath:   \"/metrics\","},{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tlogger.V(1).Infof(\"Forwarding %s to %s\", r.URL.String(), outreq.URL.String())"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"}],"source_content_type":"text/x-go","patch_set":1,"id":"7543c408_43c7e94d","line":53,"in_reply_to":"5d3f2aa4_a532cf00","updated":"2023-06-19 13:59:34.000000000","message":"Done","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"531c40f9a2c3270366146428b00bb536d167226c","unresolved":true,"context_lines":[{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tlogger.V(1).Infof(\"Forwarding %s to %s\", r.URL.String(), outreq.URL.String())"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"},{"line_number":57,"context_line":"\t}"},{"line_number":58,"context_line":"\tif outreq.Body !\u003d nil {"},{"line_number":59,"context_line":"\t\tdefer outreq.Body.Close()"},{"line_number":60,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":1,"id":"c11c8e1b_4b8d6e5c","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":0},"updated":"2023-06-15 10:30:59.000000000","message":"Why is this necessary? Since we\u0027re cloning `r`, would this not be nil already in the case of an empty body?","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"fcda0b35872eb5eb3f67d0585d1afdbe00bccd0c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tlogger.V(1).Infof(\"Forwarding %s to %s\", r.URL.String(), outreq.URL.String())"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"},{"line_number":57,"context_line":"\t}"},{"line_number":58,"context_line":"\tif outreq.Body !\u003d nil {"},{"line_number":59,"context_line":"\t\tdefer outreq.Body.Close()"},{"line_number":60,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":1,"id":"3a5df421_54680a6c","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":0},"in_reply_to":"be212706_fe233738","updated":"2023-06-19 15:25:45.000000000","message":"Ack, thanks for explaining!","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"140947505e7cd376a27c37da4701bc880b90a9c7","unresolved":true,"context_lines":[{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tlogger.V(1).Infof(\"Forwarding %s to %s\", r.URL.String(), outreq.URL.String())"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"},{"line_number":57,"context_line":"\t}"},{"line_number":58,"context_line":"\tif outreq.Body !\u003d nil {"},{"line_number":59,"context_line":"\t\tdefer outreq.Body.Close()"},{"line_number":60,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":1,"id":"be212706_fe233738","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":0},"in_reply_to":"c11c8e1b_4b8d6e5c","updated":"2023-06-19 13:59:34.000000000","message":"HTTP requests on the server side [always have a non-nil body](https://cs.opensource.google/go/go/+/refs/tags/go1.20.5:src/net/http/request.go;l\u003d177).\n\nBut for client-side requests have a slightly different semantic: they should be nil if no body should be sent.\n\nThis call (and the lower close) effectively covert between the two semantics. I also borrowed this from the stdlib http reverse proxy code, so it\u0027s even more likely to be correct :).","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"531c40f9a2c3270366146428b00bb536d167226c","unresolved":true,"context_lines":[{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"},{"line_number":57,"context_line":"\t}"},{"line_number":58,"context_line":"\tif outreq.Body !\u003d nil {"},{"line_number":59,"context_line":"\t\tdefer outreq.Body.Close()"},{"line_number":60,"context_line":"\t}"},{"line_number":61,"context_line":"\tres, err :\u003d http.DefaultTransport.RoundTrip(outreq)"},{"line_number":62,"context_line":"\tif err !\u003d nil {"},{"line_number":63,"context_line":"\t\tlogger.Errorf(\"Forwarding to %q failed: %v\", e.Name, err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"e7a2e00e_5f26c77f","line":60,"range":{"start_line":58,"start_character":0,"end_line":60,"end_character":0},"updated":"2023-06-15 10:30:59.000000000","message":"What exactly are the semantics of closing a request body? The defer will run even if the request fails, will this cause a crash if the `RoundTrip` call leaves us with a nil Body?","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"140947505e7cd376a27c37da4701bc880b90a9c7","unresolved":true,"context_lines":[{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"},{"line_number":57,"context_line":"\t}"},{"line_number":58,"context_line":"\tif outreq.Body !\u003d nil {"},{"line_number":59,"context_line":"\t\tdefer outreq.Body.Close()"},{"line_number":60,"context_line":"\t}"},{"line_number":61,"context_line":"\tres, err :\u003d http.DefaultTransport.RoundTrip(outreq)"},{"line_number":62,"context_line":"\tif err !\u003d nil {"},{"line_number":63,"context_line":"\t\tlogger.Errorf(\"Forwarding to %q failed: %v\", e.Name, err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"fff5e5ca_76644d6a","line":60,"range":{"start_line":58,"start_character":0,"end_line":60,"end_character":0},"in_reply_to":"e7a2e00e_5f26c77f","updated":"2023-06-19 13:59:34.000000000","message":"[RoundTrip should not modify the request other than consuming and closing the body](https://cs.opensource.google/go/go/+/refs/tags/go1.20.5:src/net/http/client.go;l\u003d129) so it should not leave us with a nil Body. And double-closing a Body is fine.","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"fcda0b35872eb5eb3f67d0585d1afdbe00bccd0c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\tif r.ContentLength \u003d\u003d 0 {"},{"line_number":56,"context_line":"\t\toutreq.Body \u003d nil"},{"line_number":57,"context_line":"\t}"},{"line_number":58,"context_line":"\tif outreq.Body !\u003d nil {"},{"line_number":59,"context_line":"\t\tdefer outreq.Body.Close()"},{"line_number":60,"context_line":"\t}"},{"line_number":61,"context_line":"\tres, err :\u003d http.DefaultTransport.RoundTrip(outreq)"},{"line_number":62,"context_line":"\tif err !\u003d nil {"},{"line_number":63,"context_line":"\t\tlogger.Errorf(\"Forwarding to %q failed: %v\", e.Name, err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"d60b0240_091c4a1f","line":60,"range":{"start_line":58,"start_character":0,"end_line":60,"end_character":0},"in_reply_to":"fff5e5ca_76644d6a","updated":"2023-06-19 15:25:45.000000000","message":"Ack","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"531c40f9a2c3270366146428b00bb536d167226c","unresolved":true,"context_lines":[{"line_number":76,"context_line":"\tres.Body.Close()"},{"line_number":77,"context_line":"}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"func copyHeader(dst, src http.Header) {"},{"line_number":80,"context_line":"\tfor k, vv :\u003d range src {"},{"line_number":81,"context_line":"\t\tfor _, v :\u003d range vv {"},{"line_number":82,"context_line":"\t\t\tdst.Add(k, v)"},{"line_number":83,"context_line":"\t\t}"},{"line_number":84,"context_line":"\t}"},{"line_number":85,"context_line":"}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"func (e *Exporter) externalPath() string {"},{"line_number":88,"context_line":"\treturn \"/metrics/\" + e.Name"},{"line_number":89,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"bc2fcc5f_0efbdae5","line":86,"range":{"start_line":79,"start_character":0,"end_line":86,"end_character":0},"updated":"2023-06-15 10:30:59.000000000","message":"Why not [Header.Clone()](https://pkg.go.dev/net/http#Header.Clone)? Not deep enough?","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"fcda0b35872eb5eb3f67d0585d1afdbe00bccd0c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"\tres.Body.Close()"},{"line_number":77,"context_line":"}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"func copyHeader(dst, src http.Header) {"},{"line_number":80,"context_line":"\tfor k, vv :\u003d range src {"},{"line_number":81,"context_line":"\t\tfor _, v :\u003d range vv {"},{"line_number":82,"context_line":"\t\t\tdst.Add(k, v)"},{"line_number":83,"context_line":"\t\t}"},{"line_number":84,"context_line":"\t}"},{"line_number":85,"context_line":"}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"func (e *Exporter) externalPath() string {"},{"line_number":88,"context_line":"\treturn \"/metrics/\" + e.Name"},{"line_number":89,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"2ea8cc48_2642aa53","line":86,"range":{"start_line":79,"start_character":0,"end_line":86,"end_character":0},"in_reply_to":"1247e6d9_2f9770a2","updated":"2023-06-19 15:25:45.000000000","message":"Ack","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"140947505e7cd376a27c37da4701bc880b90a9c7","unresolved":true,"context_lines":[{"line_number":76,"context_line":"\tres.Body.Close()"},{"line_number":77,"context_line":"}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"func copyHeader(dst, src http.Header) {"},{"line_number":80,"context_line":"\tfor k, vv :\u003d range src {"},{"line_number":81,"context_line":"\t\tfor _, v :\u003d range vv {"},{"line_number":82,"context_line":"\t\t\tdst.Add(k, v)"},{"line_number":83,"context_line":"\t\t}"},{"line_number":84,"context_line":"\t}"},{"line_number":85,"context_line":"}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"func (e *Exporter) externalPath() string {"},{"line_number":88,"context_line":"\treturn \"/metrics/\" + e.Name"},{"line_number":89,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"1247e6d9_2f9770a2","line":86,"range":{"start_line":79,"start_character":0,"end_line":86,"end_character":0},"in_reply_to":"bc2fcc5f_0efbdae5","updated":"2023-06-19 13:59:34.000000000","message":"That returns a new Header. I need to copy into an existing Header.","commit_id":"80b2ef56d93361532c22fc5de04eccfc50cb3037"}]}
