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  }