From c8e249b0439324065b4fbeb2ec2e41621a96dfd7 Mon Sep 17 00:00:00 2001 From: negasus Date: Tue, 12 Aug 2025 12:43:39 +0300 Subject: [PATCH] use io.Pipe for build request --- raw_request.go | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/raw_request.go b/raw_request.go index 3c4019f..fb1fe07 100644 --- a/raw_request.go +++ b/raw_request.go @@ -24,28 +24,31 @@ type apiResponse struct { } func (b *Bot) rawRequest(ctx context.Context, method string, params any, dest any) error { - var httpBody io.Reader = http.NoBody - var contentType string - - if params != nil && !reflect.ValueOf(params).IsNil() { - buf := bytes.NewBuffer(nil) - form := multipart.NewWriter(buf) - - fieldsCount, errFormData := buildRequestForm(form, params) - if errFormData != nil { - return fmt.Errorf("error build request form for method %s, %w", method, errFormData) - } + pr, pw := io.Pipe() + form := multipart.NewWriter(pw) + + go func() { + if params != nil && !reflect.ValueOf(params).IsNil() { + _, errFormData := buildRequestForm(form, params) + if errFormData != nil { + if errClose := pw.CloseWithError(fmt.Errorf("error build request form for method %s, %w", method, errFormData)); errClose != nil { + b.errorsHandler(fmt.Errorf("error close pipe writer for method %s, %w", method, errClose)) + } + return + } - errFormClose := form.Close() - if errFormClose != nil { - return fmt.Errorf("error form close for method %s, %w", method, errFormClose) + errFormClose := form.Close() + if errFormClose != nil { + if errClose := pw.CloseWithError(fmt.Errorf("error form close for method %s, %w", method, errFormClose)); errClose != nil { + b.errorsHandler(fmt.Errorf("error close pipe writer for method %s, %w", method, errClose)) + } + return + } } - - if fieldsCount > 0 { - httpBody = buf - contentType = form.FormDataContentType() + if errClose := pw.Close(); errClose != nil { + b.errorsHandler(fmt.Errorf("error close pipe writer for method %s, %w", method, errClose)) } - } + }() u := b.url + "/bot" + b.token + "/" if b.testEnvironment { @@ -58,17 +61,18 @@ func (b *Bot) rawRequest(ctx context.Context, method string, params any, dest an b.debugHandler("request url: %s, payload: %s", u, requestDebugData) } - req, errRequest := http.NewRequestWithContext(ctx, http.MethodPost, u, httpBody) + req, errRequest := http.NewRequestWithContext(ctx, http.MethodPost, u, pr) if errRequest != nil { return fmt.Errorf("error create request for method %s, %w", method, errRequest) } - if contentType != "" { - req.Header.Add("Content-Type", contentType) - } + req.Header.Add("Content-Type", form.FormDataContentType()) resp, errDo := b.client.Do(req) if errDo != nil { + if errClose := pr.CloseWithError(errDo); errClose != nil { + b.errorsHandler(fmt.Errorf("error close pipe reader for method %s, %w", method, errClose)) + } return fmt.Errorf("error do request for method %s, %w", method, errDo) } defer func() {