(ctx context.Context, derpRegion string)
| 212 | } |
| 213 | |
| 214 | func checkDerp(ctx context.Context, derpRegion string) (err error) { |
| 215 | bus := eventbus.New() |
| 216 | defer bus.Close() |
| 217 | ht := health.NewTracker(bus) |
| 218 | req, err := http.NewRequestWithContext(ctx, "GET", ipn.DefaultControlURL+"/derpmap/default", nil) |
| 219 | if err != nil { |
| 220 | return fmt.Errorf("create derp map request: %w", err) |
| 221 | } |
| 222 | res, err := http.DefaultClient.Do(req) |
| 223 | if err != nil { |
| 224 | return fmt.Errorf("fetch derp map failed: %w", err) |
| 225 | } |
| 226 | defer res.Body.Close() |
| 227 | b, err := io.ReadAll(io.LimitReader(res.Body, 1<<20)) |
| 228 | if err != nil { |
| 229 | return fmt.Errorf("fetch derp map failed: %w", err) |
| 230 | } |
| 231 | if res.StatusCode != 200 { |
| 232 | return fmt.Errorf("fetch derp map: %v: %s", res.Status, b) |
| 233 | } |
| 234 | var dmap tailcfg.DERPMap |
| 235 | if err = json.Unmarshal(b, &dmap); err != nil { |
| 236 | return fmt.Errorf("fetch DERP map: %w", err) |
| 237 | } |
| 238 | getRegion := func() *tailcfg.DERPRegion { |
| 239 | for _, r := range dmap.Regions { |
| 240 | if r.RegionCode == derpRegion { |
| 241 | return r |
| 242 | } |
| 243 | } |
| 244 | for _, r := range dmap.Regions { |
| 245 | log.Printf("Known region: %q", r.RegionCode) |
| 246 | } |
| 247 | log.Fatalf("unknown region %q", derpRegion) |
| 248 | panic("unreachable") |
| 249 | } |
| 250 | |
| 251 | priv1 := key.NewNode() |
| 252 | priv2 := key.NewNode() |
| 253 | |
| 254 | c1 := derphttp.NewRegionClient(priv1, log.Printf, nil, getRegion) |
| 255 | c2 := derphttp.NewRegionClient(priv2, log.Printf, nil, getRegion) |
| 256 | c1.HealthTracker = ht |
| 257 | c2.HealthTracker = ht |
| 258 | defer func() { |
| 259 | if err != nil { |
| 260 | c1.Close() |
| 261 | c2.Close() |
| 262 | } |
| 263 | }() |
| 264 | |
| 265 | c2.NotePreferred(true) // just to open it |
| 266 | |
| 267 | m, err := c2.Recv() |
| 268 | log.Printf("c2 got %T, %v", m, err) |
| 269 | |
| 270 | t0 := time.Now() |
| 271 | if err := c1.Send(priv2.Public(), []byte("hello")); err != nil { |
no test coverage detected
searching dependent graphs…