PerformOutboundPeekRequest implements api.FederationInternalAPI
( ctx context.Context, request *api.PerformOutboundPeekRequest, response *api.PerformOutboundPeekResponse, )
| 305 | |
| 306 | // PerformOutboundPeekRequest implements api.FederationInternalAPI |
| 307 | func (r *FederationInternalAPI) PerformOutboundPeek( |
| 308 | ctx context.Context, |
| 309 | request *api.PerformOutboundPeekRequest, |
| 310 | response *api.PerformOutboundPeekResponse, |
| 311 | ) error { |
| 312 | // Look up the supported room versions. |
| 313 | var supportedVersions []gomatrixserverlib.RoomVersion |
| 314 | for version := range version.SupportedRoomVersions() { |
| 315 | supportedVersions = append(supportedVersions, version) |
| 316 | } |
| 317 | |
| 318 | // Deduplicate the server names we were provided but keep the ordering |
| 319 | // as this encodes useful information about which servers are most likely |
| 320 | // to respond. |
| 321 | seenSet := make(map[gomatrixserverlib.ServerName]bool) |
| 322 | var uniqueList []gomatrixserverlib.ServerName |
| 323 | for _, srv := range request.ServerNames { |
| 324 | if seenSet[srv] { |
| 325 | continue |
| 326 | } |
| 327 | seenSet[srv] = true |
| 328 | uniqueList = append(uniqueList, srv) |
| 329 | } |
| 330 | request.ServerNames = uniqueList |
| 331 | |
| 332 | // See if there's an existing outbound peek for this room ID with |
| 333 | // one of the specified servers. |
| 334 | if peeks, err := r.db.GetOutboundPeeks(ctx, request.RoomID); err == nil { |
| 335 | for _, peek := range peeks { |
| 336 | if _, ok := seenSet[peek.ServerName]; ok { |
| 337 | return nil |
| 338 | } |
| 339 | } |
| 340 | } |
| 341 | |
| 342 | // Try each server that we were provided until we land on one that |
| 343 | // successfully completes the peek |
| 344 | var lastErr error |
| 345 | for _, serverName := range request.ServerNames { |
| 346 | if err := r.performOutboundPeekUsingServer( |
| 347 | ctx, |
| 348 | request.RoomID, |
| 349 | serverName, |
| 350 | supportedVersions, |
| 351 | ); err != nil { |
| 352 | logrus.WithError(err).WithFields(logrus.Fields{ |
| 353 | "server_name": serverName, |
| 354 | "room_id": request.RoomID, |
| 355 | }).Warnf("Failed to peek room through server") |
| 356 | lastErr = err |
| 357 | continue |
| 358 | } |
| 359 | |
| 360 | // We're all good. |
| 361 | return nil |
| 362 | } |
| 363 | |
| 364 | // If we reach here then we didn't complete a peek for some reason. |
nothing calls this directly
no test coverage detected