@@ -14,6 +14,7 @@ import (
14
14
)
15
15
16
16
type FileServerOptions struct {
17
+ ID string
17
18
EncKey []byte
18
19
StorageRoot string
19
20
PathTransformFunc PathTransformFunc
@@ -37,6 +38,10 @@ func NewFileServer(opts FileServerOptions) *FileServer {
37
38
PathTransformFunc : opts .PathTransformFunc ,
38
39
}
39
40
41
+ if len (opts .ID ) == 0 {
42
+ opts .ID = generateID ()
43
+ }
44
+
40
45
return & FileServer {
41
46
FileServerOptions : opts ,
42
47
storage : NewStorage (storageOpts ),
@@ -45,16 +50,6 @@ func NewFileServer(opts FileServerOptions) *FileServer {
45
50
}
46
51
}
47
52
48
- func (server * FileServer ) stream (msg * Message ) error {
49
- peers := []io.Writer {}
50
- for _ , peer := range server .peers {
51
- peers = append (peers , peer )
52
- }
53
-
54
- mw := io .MultiWriter (peers ... )
55
- return gob .NewEncoder (mw ).Encode (msg )
56
- }
57
-
58
53
func (server * FileServer ) broadcast (msg * Message ) error {
59
54
/* encode the message */
60
55
buf := new (bytes.Buffer )
@@ -78,26 +73,29 @@ type Message struct {
78
73
}
79
74
80
75
type MessageStoreFile struct {
76
+ ID string
81
77
Key string
82
78
Size int64
83
79
}
84
80
85
81
type MessageGetFile struct {
82
+ ID string
86
83
Key string
87
84
}
88
85
89
86
func (server * FileServer ) Get (key string ) (io.Reader , error ) {
90
- if server .storage .Has (key ) {
87
+ if server .storage .Has (server . ID , key ) {
91
88
fmt .Printf ("[%s] serving file (%s) from local disk\n " , server .Transport .ListenAddr (), key )
92
- _ , r , err := server .storage .Read (key )
89
+ _ , r , err := server .storage .Read (server . ID , key )
93
90
return r , err
94
91
}
95
92
96
93
fmt .Printf ("[%s] don't have file (%s) locally, fetching from network...\n " , server .Transport .ListenAddr (), key )
97
94
98
95
msg := Message {
99
96
Payload : MessageGetFile {
100
- Key : key ,
97
+ ID : server .ID ,
98
+ Key : hashKey (key ),
101
99
},
102
100
}
103
101
@@ -109,10 +107,11 @@ func (server *FileServer) Get(key string) (io.Reader, error) {
109
107
110
108
for _ , peer := range server .peers {
111
109
/* first read the file size so we can limit the amount of bytes
112
- that wee need from the connection so it will not keep hanging */
110
+ that we need from the connection so it will not keep hanging */
113
111
var fileSize int64
114
112
binary .Read (peer , binary .LittleEndian , & fileSize )
115
- n , err := server .storage .Write (key , io .LimitReader (peer , 22 ))
113
+
114
+ n , err := server .storage .writeDecrypt (server .EncKey , server .ID , key , io .LimitReader (peer , fileSize ))
116
115
if err != nil {
117
116
return nil , err
118
117
}
@@ -122,7 +121,7 @@ func (server *FileServer) Get(key string) (io.Reader, error) {
122
121
peer .CloseStream ()
123
122
}
124
123
125
- _ , r , err := server .storage .Read (key )
124
+ _ , r , err := server .storage .Read (server . ID , key )
126
125
return r , err
127
126
}
128
127
@@ -137,14 +136,15 @@ func (server *FileServer) Store(key string, r io.Reader) error {
137
136
tee = io .TeeReader (r , fileBuffer )
138
137
)
139
138
140
- size , err := server .storage .Write (key , tee )
139
+ size , err := server .storage .Write (server . ID , key , tee )
141
140
if err != nil {
142
141
return nil
143
142
}
144
143
145
144
msg := Message {
146
145
Payload : MessageStoreFile {
147
- Key : key ,
146
+ ID : server .ID ,
147
+ Key : hashKey (key ),
148
148
Size : size + 16 ,
149
149
},
150
150
}
@@ -155,17 +155,20 @@ func (server *FileServer) Store(key string, r io.Reader) error {
155
155
156
156
time .Sleep (time .Millisecond * 5 )
157
157
158
- // TODO: use a multiwriter here.
158
+ peers := []io. Writer {}
159
159
for _ , peer := range server .peers {
160
- peer .Send ([]byte {p2p .IncomingStream })
161
- n , err := copyEncrypt (server .EncKey , fileBuffer , peer )
162
- if err != nil {
163
- return err
164
- }
160
+ peers = append (peers , peer )
161
+ }
165
162
166
- fmt .Println ("received and written to disk: " , n )
163
+ mw := io .MultiWriter (peers ... )
164
+ mw .Write ([]byte {p2p .IncomingStream })
165
+ n , err := copyEncrypt (server .EncKey , fileBuffer , mw )
166
+ if err != nil {
167
+ return err
167
168
}
168
169
170
+ fmt .Printf ("[%s] received and written (%d) bytes to disk\n " , server .Transport .ListenAddr (), n )
171
+
169
172
return nil
170
173
}
171
174
@@ -219,13 +222,13 @@ func (server *FileServer) handleMessage(from string, msg *Message) error {
219
222
}
220
223
221
224
func (server * FileServer ) handleMessageGetFile (from string , msg MessageGetFile ) error {
222
- if ! server .storage .Has (msg .Key ) {
225
+ if ! server .storage .Has (msg .ID , msg . Key ) {
223
226
return fmt .Errorf ("[%s] need to serve file (%s) but it doesn't exist on disk" , server .Transport .ListenAddr (), msg .Key )
224
227
}
225
228
226
229
fmt .Printf ("[%s] serving file (%s) over the network\n " , server .Transport .ListenAddr (), msg .Key )
227
230
228
- fileSize , r , err := server .storage .Read (msg .Key )
231
+ fileSize , r , err := server .storage .Read (msg .ID , msg . Key )
229
232
if err != nil {
230
233
return err
231
234
}
@@ -261,7 +264,7 @@ func (server *FileServer) handleMessageStoreFile(from string, msg MessageStoreFi
261
264
return fmt .Errorf ("peer (%s) could not be found in the peer list" , from )
262
265
}
263
266
264
- n , err := server .storage .Write (msg .Key , io .LimitReader (peer , msg .Size ))
267
+ n , err := server .storage .Write (msg .ID , msg . Key , io .LimitReader (peer , msg .Size ))
265
268
if err != nil {
266
269
return err
267
270
}
@@ -280,7 +283,7 @@ func (server *FileServer) bootstrapNetwork() error {
280
283
}
281
284
282
285
go func (addr string ) {
283
- fmt .Println ( " attempting to connect with remote: " , addr )
286
+ fmt .Printf ( "[%s] attempting to connect with remote %s \n " , server . Transport . ListenAddr () , addr )
284
287
285
288
if err := server .Transport .Dial (addr ); err != nil {
286
289
log .Println ("dial error: " , err )
@@ -292,6 +295,7 @@ func (server *FileServer) bootstrapNetwork() error {
292
295
}
293
296
294
297
func (server * FileServer ) Start () error {
298
+ fmt .Printf ("[%s] starting fileserver...\n " , server .Transport .ListenAddr ())
295
299
if err := server .Transport .ListenAndAccept (); err != nil {
296
300
return err
297
301
}
0 commit comments