-
Notifications
You must be signed in to change notification settings - Fork 0
/
filehandler_client.go
114 lines (95 loc) · 2.86 KB
/
filehandler_client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package filehandler
import (
"bufio"
"context"
"io"
"os"
"strings"
"time"
"github.com/thomas-osgood/OGOR/misc/crosscompile"
"github.com/thomas-osgood/OGOR/protobufs/definitions/filehandler"
"github.com/thomas-osgood/OGOR/protobufs/general"
"google.golang.org/grpc/metadata"
)
// function deisgned to download a file from the
// server to the client machine..
func DownloadFile(client filehandler.FileserviceClient, targetfilename string, outfilename string) (err error) {
var cancel context.CancelFunc
var dlctx context.Context
var fclnt filehandler.Fileservice_UploadFileClient
var fptr *os.File
dlctx, cancel = context.WithTimeout(context.Background(), time.Duration(10*time.Second))
defer cancel()
// send request to the server, asking for it to
// send an UploadFileClient object so the contents
// of the target file down to it can be streamed to
// the client.
//
// if this request does not complete within 10 seconds
// a timeout error will be thrown. this timeout does
// not apply to the actual streaming of data, only the
// UploadFileClient object request.
fclnt, err = client.UploadFile(dlctx, &filehandler.FileRequest{Filename: targetfilename})
if err != nil {
return err
}
// open file to save data in. if the file does not
// exist, it will be created. if the file does exist,
// it will be overwritten.
fptr, err = os.OpenFile(outfilename, os.O_RDWR|os.O_TRUNC|os.O_CREATE, os.FileMode(0644))
if err != nil {
return err
}
defer fptr.Close()
if err = general.ReceiveFileBytes(fclnt, fptr); err != nil {
fptr.Close()
os.Remove(outfilename)
return err
}
err = fclnt.CloseSend()
if err != nil {
return err
}
return nil
}
// function designed to upload a file from the client to
// the server.
func UploadFile(client filehandler.FileserviceClient, filename string) (err error) {
var cancel context.CancelFunc
var cleanfilename string
var cutfilename []string
var filescanner *bufio.Reader
var fptr *os.File
var headerdata metadata.MD = make(metadata.MD)
var ulclient filehandler.Fileservice_DownloadFileClient
var ulctx context.Context
cutfilename = strings.Split(filename, crosscompile.PATH_SEPARATOR)
cleanfilename = cutfilename[len(cutfilename)-1]
fptr, err = os.Open(filename)
if err != nil {
return err
}
defer fptr.Close()
ulctx, cancel = context.WithTimeout(context.Background(), time.Duration(general.DEFAULTTIMEOUT*int(time.Second)))
defer cancel()
// add filename to outgoing headers (ie metadata)
// in the context attached to the upload request.
headerdata.Set("filename", cleanfilename)
ulclient, err = client.DownloadFile(ulctx)
if err != nil {
return err
}
filescanner = bufio.NewReader(fptr)
err = general.TransmitFileBytes(ulclient, filescanner)
if err != nil {
return err
}
_, err = ulclient.CloseAndRecv()
if err != nil {
if err == io.EOF {
return nil
}
return err
}
return nil
}