)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"97d8fd6c965ee172e74d4eea12a693fe030d2c75","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"01d7fd5c_640a2078","updated":"2024-08-20 16:35:49.000000000","message":"I rebased all commits, moved dns to /osbase/net/dns, and also added some code to register metrics in the core registry.","commit_id":"02f6afd72febd45bc74454c2e542cfa241684e3b"}],"net/dns/dns.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":18,"context_line":"// Service is a DNS server service with configurable handlers."},{"line_number":19,"context_line":"type Service struct {"},{"line_number":20,"context_line":"\thandlerNames []string"},{"line_number":21,"context_line":"\thandlers     []atomic.Pointer[Handler]"},{"line_number":22,"context_line":"}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"type serviceCtx struct {"}],"source_content_type":"text/x-go","patch_set":6,"id":"0e209381_cea92b59","line":21,"range":{"start_line":21,"start_character":16,"end_line":21,"end_character":30},"updated":"2024-08-06 16:16:01.000000000","message":"Please put a comment somewhere in this struct explaining how synchronization works if you\u0027re using \"complex\" synchronization primitives (basically anything more than a simple lock).","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":true,"context_lines":[{"line_number":18,"context_line":"// Service is a DNS server service with configurable handlers."},{"line_number":19,"context_line":"type Service struct {"},{"line_number":20,"context_line":"\thandlerNames []string"},{"line_number":21,"context_line":"\thandlers     []atomic.Pointer[Handler]"},{"line_number":22,"context_line":"}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"type serviceCtx struct {"}],"source_content_type":"text/x-go","patch_set":6,"id":"966e3dfa_b64ac523","line":21,"range":{"start_line":21,"start_character":16,"end_line":21,"end_character":30},"in_reply_to":"0e209381_cea92b59","updated":"2024-08-07 11:31:55.000000000","message":"Can you show an example of such a synchronization explanation comment? To me, atomic.Pointer seems quite self-documenting.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"97d8fd6c965ee172e74d4eea12a693fe030d2c75","unresolved":false,"context_lines":[{"line_number":18,"context_line":"// Service is a DNS server service with configurable handlers."},{"line_number":19,"context_line":"type Service struct {"},{"line_number":20,"context_line":"\thandlerNames []string"},{"line_number":21,"context_line":"\thandlers     []atomic.Pointer[Handler]"},{"line_number":22,"context_line":"}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"type serviceCtx struct {"}],"source_content_type":"text/x-go","patch_set":6,"id":"1becf7d5_235dbd08","line":21,"range":{"start_line":21,"start_character":16,"end_line":21,"end_character":30},"in_reply_to":"33643095_9836e07d","updated":"2024-08-20 16:35:49.000000000","message":"Thanks!","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"43fc5d7b89be19f18f1cc96fddf194ae96bea3f6","unresolved":true,"context_lines":[{"line_number":18,"context_line":"// Service is a DNS server service with configurable handlers."},{"line_number":19,"context_line":"type Service struct {"},{"line_number":20,"context_line":"\thandlerNames []string"},{"line_number":21,"context_line":"\thandlers     []atomic.Pointer[Handler]"},{"line_number":22,"context_line":"}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"type serviceCtx struct {"}],"source_content_type":"text/x-go","patch_set":6,"id":"33643095_9836e07d","line":21,"range":{"start_line":21,"start_character":16,"end_line":21,"end_character":30},"in_reply_to":"966e3dfa_b64ac523","updated":"2024-08-20 11:55:13.000000000","message":"I\u0027d put something like this:\n\nThe number and names of handlers is fixed when New is called. For each name in handlerNames there is a corresponding pointer to a handler in the handlers slice at the same index, which can be atomically updated at runtime through its atomic.Pointer via the SetHandler function.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":26,"context_line":"\tctx     context.Context"},{"line_number":27,"context_line":"}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"// New creates a Service instance."},{"line_number":30,"context_line":"// DNS handlers with the names given in handlerNames must be set"},{"line_number":31,"context_line":"// with SetHandler. When serving DNS queries, they will be"},{"line_number":32,"context_line":"// tried in the order they appear here."}],"source_content_type":"text/x-go","patch_set":6,"id":"8b71b3d1_8d09de96","line":29,"range":{"start_line":29,"start_character":3,"end_line":29,"end_character":33},"updated":"2024-08-06 16:16:01.000000000","message":"Reflow all comments to a maximum of 80 characters per line.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":false,"context_lines":[{"line_number":26,"context_line":"\tctx     context.Context"},{"line_number":27,"context_line":"}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"// New creates a Service instance."},{"line_number":30,"context_line":"// DNS handlers with the names given in handlerNames must be set"},{"line_number":31,"context_line":"// with SetHandler. When serving DNS queries, they will be"},{"line_number":32,"context_line":"// tried in the order they appear here."}],"source_content_type":"text/x-go","patch_set":6,"id":"62402829_4a39ec8f","line":29,"range":{"start_line":29,"start_character":3,"end_line":29,"end_character":33},"in_reply_to":"8b71b3d1_8d09de96","updated":"2024-08-07 11:31:55.000000000","message":"Done","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// Run runs the DNS service."},{"line_number":43,"context_line":"func (s *Service) Run(ctx context.Context) error {"},{"line_number":44,"context_line":"\treturn s.RunListenerAddr(ctx, \"127.0.0.1:53\")"},{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"// RunListenerAddr runs a DNS listener on a specific address."}],"source_content_type":"text/x-go","patch_set":6,"id":"e1209149_31df0217","line":44,"range":{"start_line":44,"start_character":32,"end_line":44,"end_character":41},"updated":"2024-08-06 16:16:01.000000000","message":"I\u0027d recommend listening on ::1 as I\u0027m pretty sure we have dual-stack listeners enabled, thus listening on IPv6 loopback should also work for v4, whereas this only works for v4. We currently have no tests relying on v6, but there is no good reason why this should be v4-only.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"43fc5d7b89be19f18f1cc96fddf194ae96bea3f6","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// Run runs the DNS service."},{"line_number":43,"context_line":"func (s *Service) Run(ctx context.Context) error {"},{"line_number":44,"context_line":"\treturn s.RunListenerAddr(ctx, \"127.0.0.1:53\")"},{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"// RunListenerAddr runs a DNS listener on a specific address."}],"source_content_type":"text/x-go","patch_set":6,"id":"b59b06b5_957b92e6","line":44,"range":{"start_line":44,"start_character":32,"end_line":44,"end_character":41},"in_reply_to":"5e0ec053_9837f199","updated":"2024-08-20 11:55:13.000000000","message":"Done","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":true,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// Run runs the DNS service."},{"line_number":43,"context_line":"func (s *Service) Run(ctx context.Context) error {"},{"line_number":44,"context_line":"\treturn s.RunListenerAddr(ctx, \"127.0.0.1:53\")"},{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"// RunListenerAddr runs a DNS listener on a specific address."}],"source_content_type":"text/x-go","patch_set":6,"id":"5e0ec053_9837f199","line":44,"range":{"start_line":44,"start_character":32,"end_line":44,"end_character":41},"in_reply_to":"e1209149_31df0217","updated":"2024-08-07 11:31:55.000000000","message":"Listening on ::1 only doesn\u0027t work for v4, so I changed it to listen on both. CoreDNS was also configured to listen on both.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"}],"net/dns/metrics.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"var ("},{"line_number":9,"context_line":"\t// rcode can be an uppercase rcode name,"},{"line_number":10,"context_line":"\t// a numeric rcode if the rcode is not known, or one of:"},{"line_number":11,"context_line":"\t//   * redirected: The query was redirected by CNAME, so the final rcode"},{"line_number":12,"context_line":"\t//     is not yet known."},{"line_number":13,"context_line":"\t//   * not_ready: The handler is not yet ready, SERVFAIL is replied."}],"source_content_type":"text/x-go","patch_set":6,"id":"77a54805_ee440b6a","line":10,"range":{"start_line":10,"start_character":6,"end_line":10,"end_character":19},"updated":"2024-08-06 16:16:01.000000000","message":"How can that happen?","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":true,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"var ("},{"line_number":9,"context_line":"\t// rcode can be an uppercase rcode name,"},{"line_number":10,"context_line":"\t// a numeric rcode if the rcode is not known, or one of:"},{"line_number":11,"context_line":"\t//   * redirected: The query was redirected by CNAME, so the final rcode"},{"line_number":12,"context_line":"\t//     is not yet known."},{"line_number":13,"context_line":"\t//   * not_ready: The handler is not yet ready, SERVFAIL is replied."}],"source_content_type":"text/x-go","patch_set":6,"id":"b1b08aa7_371c8aab","line":10,"range":{"start_line":10,"start_character":6,"end_line":10,"end_character":19},"in_reply_to":"77a54805_ee440b6a","updated":"2024-08-07 11:31:55.000000000","message":"This happens when an upstream DNS server returns an rcode that is not in this map: https://pkg.go.dev/github.com/miekg/dns#RcodeToString","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"43fc5d7b89be19f18f1cc96fddf194ae96bea3f6","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"var ("},{"line_number":9,"context_line":"\t// rcode can be an uppercase rcode name,"},{"line_number":10,"context_line":"\t// a numeric rcode if the rcode is not known, or one of:"},{"line_number":11,"context_line":"\t//   * redirected: The query was redirected by CNAME, so the final rcode"},{"line_number":12,"context_line":"\t//     is not yet known."},{"line_number":13,"context_line":"\t//   * not_ready: The handler is not yet ready, SERVFAIL is replied."}],"source_content_type":"text/x-go","patch_set":6,"id":"653c5b07_8b59527f","line":10,"range":{"start_line":10,"start_character":6,"end_line":10,"end_character":19},"in_reply_to":"b1b08aa7_371c8aab","updated":"2024-08-20 11:55:13.000000000","message":"Acknowledged","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"}],"net/dns/name.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":19,"context_line":"\t\treturn false"},{"line_number":20,"context_line":"\t}"},{"line_number":21,"context_line":"\tj :\u003d offset - 2"},{"line_number":22,"context_line":"\tfor j \u003e\u003d 0 \u0026\u0026 child[j] \u003d\u003d \u0027\\\\\u0027 {"},{"line_number":23,"context_line":"\t\tj--"},{"line_number":24,"context_line":"\t}"},{"line_number":25,"context_line":"\treturn (offset-j)%2 \u003d\u003d 0"}],"source_content_type":"text/x-go","patch_set":6,"id":"806504bc_01a6a1ee","line":22,"range":{"start_line":22,"start_character":27,"end_line":22,"end_character":31},"updated":"2024-08-06 16:16:01.000000000","message":"Can you tell me what rules/RFCs you followed with regards to backslash escaping in the DNS server implementation?","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":true,"context_lines":[{"line_number":19,"context_line":"\t\treturn false"},{"line_number":20,"context_line":"\t}"},{"line_number":21,"context_line":"\tj :\u003d offset - 2"},{"line_number":22,"context_line":"\tfor j \u003e\u003d 0 \u0026\u0026 child[j] \u003d\u003d \u0027\\\\\u0027 {"},{"line_number":23,"context_line":"\t\tj--"},{"line_number":24,"context_line":"\t}"},{"line_number":25,"context_line":"\treturn (offset-j)%2 \u003d\u003d 0"}],"source_content_type":"text/x-go","patch_set":6,"id":"bf8859ac_26de1abb","line":22,"range":{"start_line":22,"start_character":27,"end_line":22,"end_character":31},"in_reply_to":"806504bc_01a6a1ee","updated":"2024-08-07 11:31:55.000000000","message":"The backslash escaping is part of how the miekg/dns library represents names in memory, there is no such escaping in the wire format.\n\nThis here is a more efficient reimplementation of miekg/dns.IsSubDomain which doesn\u0027t allocate or do case-insensitive comparison, and follows the same escaping rules.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"43fc5d7b89be19f18f1cc96fddf194ae96bea3f6","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\t\treturn false"},{"line_number":20,"context_line":"\t}"},{"line_number":21,"context_line":"\tj :\u003d offset - 2"},{"line_number":22,"context_line":"\tfor j \u003e\u003d 0 \u0026\u0026 child[j] \u003d\u003d \u0027\\\\\u0027 {"},{"line_number":23,"context_line":"\t\tj--"},{"line_number":24,"context_line":"\t}"},{"line_number":25,"context_line":"\treturn (offset-j)%2 \u003d\u003d 0"}],"source_content_type":"text/x-go","patch_set":6,"id":"78aa0465_d4169033","line":22,"range":{"start_line":22,"start_character":27,"end_line":22,"end_character":31},"in_reply_to":"bf8859ac_26de1abb","updated":"2024-08-20 11:55:13.000000000","message":"I see, it\u0027s IMO unfortunate that miekg/dns is not using slices for these as that\u0027s what the wire format uses instead of convoluted escaping. But that\u0027s not something you can fix here.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"}],"net/dns/test/server.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":38,"context_line":"\t\t\tbreak"},{"line_number":39,"context_line":"\t\t}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"\t\t// perhaps UPD port is in use, try again"},{"line_number":42,"context_line":"\t\ts2.Listener.Close()"},{"line_number":43,"context_line":"\t\ts2.Listener \u003d nil"},{"line_number":44,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"3983d1e6_4f85a883","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":16},"updated":"2024-08-06 16:16:01.000000000","message":"```suggestion\n\t\t// perhaps UDP port is in use, try again\n```","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"\t\t\tbreak"},{"line_number":39,"context_line":"\t\t}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"\t\t// perhaps UPD port is in use, try again"},{"line_number":42,"context_line":"\t\ts2.Listener.Close()"},{"line_number":43,"context_line":"\t\ts2.Listener \u003d nil"},{"line_number":44,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"401dff1b_38a0ea68","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":16},"in_reply_to":"3983d1e6_4f85a883","updated":"2024-08-07 11:31:55.000000000","message":"Done","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"}],"net/dns/test/server_test.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":1,"context_line":"package test"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"// Taken and modified from CoreDNS, under Apache 2.0."},{"line_number":4,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"040037ba_51559734","line":1,"range":{"start_line":1,"start_character":8,"end_line":1,"end_character":12},"updated":"2024-08-06 16:16:01.000000000","message":"I\u0027d move server.go in here and move the file to net/dns/e2e_test.go or something. Makes it easier to understand the code organization.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":true,"context_lines":[{"line_number":1,"context_line":"package test"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"// Taken and modified from CoreDNS, under Apache 2.0."},{"line_number":4,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"c789e9c6_9f53ef6b","line":1,"range":{"start_line":1,"start_character":8,"end_line":1,"end_character":12},"in_reply_to":"040037ba_51559734","updated":"2024-08-07 11:31:55.000000000","message":"The dns/test package is also used by tests in dns/forward and dns/forward/proxy, this is why it\u0027s a separate package.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"43fc5d7b89be19f18f1cc96fddf194ae96bea3f6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"package test"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"// Taken and modified from CoreDNS, under Apache 2.0."},{"line_number":4,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"0ac4c5e0_55090cdc","line":1,"range":{"start_line":1,"start_character":8,"end_line":1,"end_character":12},"in_reply_to":"c789e9c6_9f53ef6b","updated":"2024-08-20 11:55:13.000000000","message":"Acknowledged","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"}],"net/dns/testhelpers.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4c4676694711086f52d70d8421d30f909da692cb","unresolved":true,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"func (t *testWriter) LocalAddr() net.Addr     { return t.addr }"},{"line_number":50,"context_line":"func (t *testWriter) RemoteAddr() net.Addr    { return t.addr }"},{"line_number":51,"context_line":"func (*testWriter) Write([]byte) (int, error) { return 0, errors.New(\"not implemented\") }"},{"line_number":52,"context_line":"func (*testWriter) Close() error              { return nil }"},{"line_number":53,"context_line":"func (*testWriter) TsigStatus() error         { return nil }"},{"line_number":54,"context_line":"func (*testWriter) TsigTimersOnly(bool)       {}"}],"source_content_type":"text/x-go","patch_set":6,"id":"d468264f_e6a37d47","line":51,"range":{"start_line":51,"start_character":70,"end_line":51,"end_character":85},"updated":"2024-08-06 16:16:01.000000000","message":"```suggestion\nfunc (*testWriter) Write([]byte) (int, error) { return 0, errors.New(\"testWriter only supports WriteMsg\") }\n```\nThis could be very confusing otherwise if anyone ever hits this.","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"af3d7b7c505f3ed1bc553ccd91938fc5d6bed9a3","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"func (t *testWriter) LocalAddr() net.Addr     { return t.addr }"},{"line_number":50,"context_line":"func (t *testWriter) RemoteAddr() net.Addr    { return t.addr }"},{"line_number":51,"context_line":"func (*testWriter) Write([]byte) (int, error) { return 0, errors.New(\"not implemented\") }"},{"line_number":52,"context_line":"func (*testWriter) Close() error              { return nil }"},{"line_number":53,"context_line":"func (*testWriter) TsigStatus() error         { return nil }"},{"line_number":54,"context_line":"func (*testWriter) TsigTimersOnly(bool)       {}"}],"source_content_type":"text/x-go","patch_set":6,"id":"b08f034e_bc54bcd8","line":51,"range":{"start_line":51,"start_character":70,"end_line":51,"end_character":85},"in_reply_to":"d468264f_e6a37d47","updated":"2024-08-07 11:31:55.000000000","message":"Done","commit_id":"cb0115b6831ff6ddbbeefae54030c8613712b29f"}]}
