LargeFileReceive is the gRPC equivalent of LargeFileReceiveHTTP.
(stream pbx.Node_LargeFileReceiveServer)
| 445 | |
| 446 | // LargeFileReceive is the gRPC equivalent of LargeFileReceiveHTTP. |
| 447 | func (*grpcNodeServer) LargeFileReceive(stream pbx.Node_LargeFileReceiveServer) error { |
| 448 | now := types.TimeNow() |
| 449 | mh := store.Store.GetMediaHandler() |
| 450 | |
| 451 | writeResponse := func(msg *ServerComMessage, err error) { |
| 452 | stream.SendAndClose(&pbx.FileUpResp{Id: msg.Ctrl.Id, Code: int32(msg.Ctrl.Code), Text: msg.Ctrl.Text}) |
| 453 | if err != nil { |
| 454 | logs.Info.Println("media receive:", msg.Ctrl.Code, msg.Ctrl.Text, "/", err) |
| 455 | } |
| 456 | } |
| 457 | |
| 458 | req, err := stream.Recv() |
| 459 | if err != nil { |
| 460 | if errors.Is(err, io.EOF) { |
| 461 | writeResponse(ErrDisconnected("", "", now), err) |
| 462 | } else { |
| 463 | writeResponse(decodeStoreError(err, "", now, nil), err) |
| 464 | } |
| 465 | return nil |
| 466 | } |
| 467 | |
| 468 | msgID := req.GetId() |
| 469 | // Check authorization: auth information must be present (SID is not used for gRPC). |
| 470 | authMethod, secret := req.Auth.Scheme, req.Auth.Secret |
| 471 | var remoteAddr string |
| 472 | if p, ok := peer.FromContext(stream.Context()); ok { |
| 473 | remoteAddr = p.Addr.String() |
| 474 | } |
| 475 | uid, challenge, err := authFileRequest(authMethod, secret, "", remoteAddr) |
| 476 | if err != nil { |
| 477 | writeResponse(decodeStoreError(err, msgID, now, nil), err) |
| 478 | return nil |
| 479 | } |
| 480 | |
| 481 | if challenge != nil { |
| 482 | writeResponse(InfoChallenge(msgID, now, challenge), nil) |
| 483 | return nil |
| 484 | } |
| 485 | |
| 486 | if uid.IsZero() { |
| 487 | // Not authenticated |
| 488 | writeResponse(ErrAuthRequired(msgID, "", now, now), errors.New("user not authenticated")) |
| 489 | return nil |
| 490 | } |
| 491 | |
| 492 | // Check if uploads are handled elsewhere. |
| 493 | headers, statusCode, err := mh.Headers(http.MethodPost, nil, http.Header{}, false) |
| 494 | if err != nil { |
| 495 | logs.Info.Println("media upload: headers check failed", err) |
| 496 | writeResponse(decodeStoreError(err, "", now, nil), nil) |
| 497 | return nil |
| 498 | } |
| 499 | |
| 500 | if statusCode != 0 { |
| 501 | // The handler requested to terminate further processing. |
| 502 | err = stream.SendAndClose(&pbx.FileUpResp{ |
| 503 | Id: msgID, |
| 504 | Code: int32(statusCode), |
nothing calls this directly
no test coverage detected