@@ -422,3 +422,68 @@ func logUploadProgress(file *os.File, fileSize int64, sugar *zap.SugaredLogger)
422422 }
423423 }
424424}
425+
426+ // DoImageMultiPartUpload performs a multipart request with a specifically formatted payload.
427+ // This is designed for APIs that expect a very specific multipart format, where the payload
428+ // needs to be constructed manually rather than using the standard multipart writer.
429+ func (c * Client ) DoImageMultiPartUpload (method , endpoint string , fileName string , base64Data string , customBoundary string , out interface {}) (* http.Response , error ) {
430+ if method != http .MethodPost && method != http .MethodPut {
431+ c .Sugar .Error ("HTTP method not supported for multipart request" , zap .String ("method" , method ))
432+ return nil , fmt .Errorf ("unsupported HTTP method: %s" , method )
433+ }
434+
435+ // Format the multipart payload with the specified boundary
436+ payload := fmt .Sprintf ("%s\r \n " +
437+ "Content-Disposition: form-data; name=\" file\" ; filename=\" %s\" \r \n " +
438+ "Content-Type: image/png\r \n \r \n " +
439+ "data:image/png;name=%s;base64,%s\r \n " +
440+ "%s--" ,
441+ customBoundary ,
442+ fileName ,
443+ fileName ,
444+ base64Data ,
445+ customBoundary )
446+
447+ url := (* c .Integration ).GetFQDN () + endpoint
448+
449+ // Create the request with the formatted payload
450+ req , err := http .NewRequest (method , url , strings .NewReader (payload ))
451+ if err != nil {
452+ c .Sugar .Errorw ("Failed to create request" , zap .Error (err ))
453+ return nil , fmt .Errorf ("failed to create request: %v" , err )
454+ }
455+
456+ req .Header .Add ("Accept" , "application/json" )
457+ req .Header .Add ("Content-Type" , fmt .Sprintf ("multipart/form-data; boundary=%s" , strings .TrimPrefix (customBoundary , "---" )))
458+
459+ (* c .Integration ).PrepRequestParamsAndAuth (req )
460+
461+ c .Sugar .Infow ("Sending custom multipart request" ,
462+ zap .String ("method" , method ),
463+ zap .String ("url" , url ),
464+ zap .String ("filename" , fileName ))
465+
466+ startTime := time .Now ()
467+ resp , err := c .http .Do (req )
468+ duration := time .Since (startTime )
469+
470+ if err != nil {
471+ c .Sugar .Errorw ("Failed to send request" ,
472+ zap .String ("method" , method ),
473+ zap .String ("endpoint" , endpoint ),
474+ zap .Error (err ))
475+ return nil , fmt .Errorf ("failed to send request: %v" , err )
476+ }
477+
478+ c .Sugar .Debugw ("Request sent successfully" ,
479+ zap .String ("method" , method ),
480+ zap .String ("endpoint" , endpoint ),
481+ zap .Int ("status_code" , resp .StatusCode ),
482+ zap .Duration ("duration" , duration ))
483+
484+ if resp .StatusCode >= 200 && resp .StatusCode < 300 {
485+ return resp , response .HandleAPISuccessResponse (resp , out , c .Sugar )
486+ }
487+
488+ return resp , response .HandleAPIErrorResponse (resp , c .Sugar )
489+ }
0 commit comments