github.com/Ingenico-ePayments/connect-sdk-go@v0.0.0-20240318153750-1f8cd329b9c9/communicator/communication/MultipartFormDataObject.go (about) 1 package communication 2 3 import ( 4 "crypto/rand" 5 "errors" 6 "fmt" 7 "strings" 8 ) 9 10 // MultipartFormDataObject is a representation of a multipart/form-data object. 11 type MultipartFormDataObject struct { 12 boundary string 13 contentType string 14 values map[string]string 15 files map[string]UploadableFile 16 } 17 18 // GetBoundary returns the boundary. 19 func (multipart *MultipartFormDataObject) GetBoundary() string { 20 return multipart.boundary 21 } 22 23 // GetContentType returns the content type. 24 func (multipart *MultipartFormDataObject) GetContentType() string { 25 return multipart.contentType 26 } 27 28 // GetValues returns the values. 29 func (multipart *MultipartFormDataObject) GetValues() map[string]string { 30 return multipart.values 31 } 32 33 // GetFiles returns the files. 34 func (multipart *MultipartFormDataObject) GetFiles() map[string]UploadableFile { 35 return multipart.files 36 } 37 38 // AddValue adds a value parameter. 39 func (multipart *MultipartFormDataObject) AddValue(parameterName string, value string) error { 40 if strings.TrimSpace(parameterName) == "" { 41 return errors.New("parameterName is required") 42 } 43 if multipart.containsParameter(parameterName) { 44 return errors.New("duplicate parameterName: " + parameterName) 45 } 46 multipart.values[parameterName] = value 47 48 return nil 49 } 50 51 // AddFile adds a file parameter. 52 func (multipart *MultipartFormDataObject) AddFile(parameterName string, file UploadableFile) error { 53 if strings.TrimSpace(parameterName) == "" { 54 return errors.New("parameterName is required") 55 } 56 if multipart.containsParameter(parameterName) { 57 return errors.New("duplicate parameterName: " + parameterName) 58 } 59 multipart.files[parameterName] = file 60 61 return nil 62 } 63 64 func (multipart *MultipartFormDataObject) containsParameter(parameterName string) bool { 65 if _, contains := multipart.values[parameterName]; contains { 66 return true 67 } 68 if _, contains := multipart.files[parameterName]; contains { 69 return true 70 } 71 return false 72 } 73 74 // NewMultipartFormDataObject constructs a new MultipartFormDataObject 75 func NewMultipartFormDataObject() (*MultipartFormDataObject, error) { 76 boundary, err := pseudoUUID() 77 if err != nil { 78 return nil, err 79 } 80 81 contentType := "multipart/form-data; boundary=" + boundary 82 values := map[string]string{} 83 files := map[string]UploadableFile{} 84 85 return &MultipartFormDataObject{boundary, contentType, values, files}, nil 86 } 87 88 func pseudoUUID() (string, error) { 89 b := make([]byte, 16) 90 _, err := rand.Read(b) 91 if err != nil { 92 return "", err 93 } 94 return fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]), nil 95 }