Réception d'un fichier et sauvegarde de celui-ci terminée

This commit is contained in:
Benjamin 2022-03-08 20:37:49 +01:00
parent a987a7eb64
commit 6fa5f6c1c4
7 changed files with 53 additions and 22 deletions

View File

@ -30,12 +30,13 @@ func (server ServerUnicast) Run() {
return return
} else { } else {
for { // TODO : Extraire cette partie de code for { // TODO : Extraire cette partie de code
line, err := bufio.NewReader(con).ReadString('\n') reader := bufio.NewReader(con)
line, err := reader.ReadString('\n')
println("[REQUEST] " + line) println("[REQUEST] " + line)
if err != nil { if err != nil {
return return
} }
result := server.ReqManager.Execute(line, con) result := server.ReqManager.Execute(line, reader)
println("[RESPONSE] : ", result) println("[RESPONSE] : ", result)
_, _ = con.Write(append([]byte(result), '\n')) // TODO : ATTENTION laisser les \n _, _ = con.Write(append([]byte(result), '\n')) // TODO : ATTENTION laisser les \n
} }

View File

@ -1,7 +1,7 @@
package protocol package protocol
import ( import (
"net" "bufio"
) )
// IProtocolReader Représentation abstraite d'un protocol // IProtocolReader Représentation abstraite d'un protocol
@ -10,7 +10,7 @@ type IProtocolReader interface {
GetCmd() string GetCmd() string
// Execute Permet d'exécuter l'action implémentée par une règle. Retourne le message (rule) de retour et bool pour savoir si tout s'est bien passé ou non // Execute Permet d'exécuter l'action implémentée par une règle. Retourne le message (rule) de retour et bool pour savoir si tout s'est bien passé ou non
Execute(data string) (string, bool, func(r net.Conn) (string, bool)) Execute(data string) (string, bool, func(reader *bufio.Reader) (string, bool))
// Match Permet de vérifier la validité d'une donnée censée suivre les règles d'un protocol // Match Permet de vérifier la validité d'une donnée censée suivre les règles d'un protocol
Match(data string) bool Match(data string) bool

View File

@ -2,14 +2,14 @@ package managers
import ( import (
"StoreBackEnd/pkg/protocol/repository" "StoreBackEnd/pkg/protocol/repository"
"net" "bufio"
) )
type RequestManager struct { type RequestManager struct {
Repository *repository.ProtocolRepository Repository *repository.ProtocolRepository
} }
func (receiver RequestManager) Execute(request string, reader net.Conn) string { func (receiver RequestManager) Execute(request string, reader *bufio.Reader) string {
// On lis ce que l'on reçoit // On lis ce que l'on reçoit
result, executed, readCb := receiver.Repository.ExecuteReader(request) result, executed, readCb := receiver.Repository.ExecuteReader(request)

View File

@ -2,7 +2,7 @@ package repository
import ( import (
"StoreBackEnd/pkg/protocol" "StoreBackEnd/pkg/protocol"
"net" "bufio"
) )
func CreateProtocolRepository() *ProtocolRepository { func CreateProtocolRepository() *ProtocolRepository {
@ -36,7 +36,7 @@ func (repo ProtocolRepository) AddWriter(writer *protocol.IProtocolWriter) {
/* /*
ExecuteReader Permet d'exécuter un Reader et de récupérer la commande à renvoyer. La deuxième valeur de retour permet de savoir si une commande a put être exécuté ExecuteReader Permet d'exécuter un Reader et de récupérer la commande à renvoyer. La deuxième valeur de retour permet de savoir si une commande a put être exécuté
*/ */
func (repo ProtocolRepository) ExecuteReader(data string) (string, bool, func(r net.Conn) (string, bool)) { func (repo ProtocolRepository) ExecuteReader(data string) (string, bool, func(reader *bufio.Reader) (string, bool)) {
for _, reader := range repo.protocolReaders { for _, reader := range repo.protocolReaders {
if (*reader).Match(data) { // Exécuter si match if (*reader).Match(data) { // Exécuter si match
// Récupérer résultat à renvoyer (Donc donner ProtocolRepository aux reader ?!) // Récupérer résultat à renvoyer (Donc donner ProtocolRepository aux reader ?!)

View File

@ -2,7 +2,7 @@ package readers
import ( import (
"StoreBackEnd/pkg/protocol" "StoreBackEnd/pkg/protocol"
"net" "bufio"
) )
// EraseFileRulePrefix Identifiant de cette règle // EraseFileRulePrefix Identifiant de cette règle
@ -29,7 +29,7 @@ func (rule EraseFileRule) GetCmd() string {
return rule.Cmd return rule.Cmd
} }
func (rule EraseFileRule) Execute(data string) (string, bool, func(r net.Conn) (string, bool)) { func (rule EraseFileRule) Execute(data string) (string, bool, func(r *bufio.Reader) (string, bool)) {
if rule.Match(data) { if rule.Match(data) {
values := rule.matcher.Parse(data) values := rule.matcher.Parse(data)
println(values[1], " est le hash du fichier à supprimer") println(values[1], " est le hash du fichier à supprimer")

View File

@ -2,10 +2,9 @@ package readers
import ( import (
"StoreBackEnd/pkg/protocol" "StoreBackEnd/pkg/protocol"
"fmt" "StoreBackEnd/pkg/utils"
"io" "bufio"
"net" "strconv"
"os"
) )
// SendFileRulePrefix Rule command prefix // SendFileRulePrefix Rule command prefix
@ -33,13 +32,13 @@ func (rule SendFileRule) GetCmd() string {
} }
// Execute the Rule with a string command. // Execute the Rule with a string command.
func (rule SendFileRule) Execute(data string) (string, bool, func(r net.Conn) (string, bool)) { func (rule SendFileRule) Execute(data string) (string, bool, func(reader *bufio.Reader) (string, bool)) {
if rule.Match(data) { // TODO : cloture this command. if rule.Match(data) { // TODO : cloture this command.
values := rule.matcher.Parse(data) values := rule.matcher.Parse(data)
// Values // Values
fileName := values[1] fileName := values[1]
// fileSize := values[2] fileSize, _ := strconv.Atoi(values[2])
// fileContentHash := values[3] // fileContentHash := values[3]
// print received data // print received data
@ -48,15 +47,22 @@ func (rule SendFileRule) Execute(data string) (string, bool, func(r net.Conn) (s
println(values[3], " File Content Hash") println(values[3], " File Content Hash")
// function callback // function callback
callback := func(con net.Conn) (string, bool) { callback := func(reader *bufio.Reader) (string, bool) {
file, _ := os.Create(fmt.Sprintf("D:\\tmp\\%s", fileName)) hasReceive := utils.ReceiveFile(fileName, fileSize, reader)
println("HEY1")
_, err := io.Copy(file, con) /*
file, _ := os.Create(fmt.Sprintf("/home/benjamin/sbe/%s", fileName))
_, err := io.Copy(file, reader)
println("HEY1") println("HEY1")
if err != nil { if err != nil {
println("Can't copy file") println("Can't copy file")
return "SEND_ERROR\r", false return "SEND_ERROR\r", false
} }
*/
if !hasReceive {
return "SEND_ERROR\r", false
}
println("HEY2") println("HEY2")
return "SEND_OK\r", true return "SEND_OK\r", true
} }

View File

@ -1 +1,25 @@
package utils package utils
import (
"bufio"
"fmt"
"io"
"os"
)
// ReceiveFile Permet de récupérer un fichier sur un reader
func ReceiveFile(fileName string, fileSize int, reader *bufio.Reader) bool {
file, fileErr := os.Create(fmt.Sprintf("/home/benjamin/sbe/%s", fileName))
if fileErr != nil {
return false
}
println(1)
defer file.Close()
_, err := io.CopyN(file, reader, int64(fileSize))
println(2)
if err != nil {
return false
}
return true
}