MCPcopy
hub / github.com/tinode/chat / LargeFileReceive

Method LargeFileReceive

server/hdl_files.go:447–576  ·  view source on GitHub ↗

LargeFileReceive is the gRPC equivalent of LargeFileReceiveHTTP.

(stream pbx.Node_LargeFileReceiveServer)

Source from the content-addressed store, hash-verified

445
446// LargeFileReceive is the gRPC equivalent of LargeFileReceiveHTTP.
447func (*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),

Callers

nothing calls this directly

Calls 15

TimeNowFunction · 0.92
ErrDisconnectedFunction · 0.85
decodeStoreErrorFunction · 0.85
authFileRequestFunction · 0.85
InfoChallengeFunction · 0.85
ErrAuthRequiredFunction · 0.85
PrintlnMethod · 0.80
GetMimeTypeMethod · 0.80
InitTimesMethod · 0.80
WriteMethod · 0.80
GetMediaHandlerMethod · 0.65
SendAndCloseMethod · 0.65

Tested by

no test coverage detected