Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
53 lines
946 B
Go
53 lines
946 B
Go
package openai
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
type RequestBuilder interface {
|
|
Build(ctx context.Context, method, url string, body any, header http.Header) (*http.Request, error)
|
|
}
|
|
|
|
type HTTPRequestBuilder struct {
|
|
marshaller Marshaller
|
|
}
|
|
|
|
func NewRequestBuilder() *HTTPRequestBuilder {
|
|
return &HTTPRequestBuilder{
|
|
marshaller: &JSONMarshaller{},
|
|
}
|
|
}
|
|
|
|
func (b *HTTPRequestBuilder) Build(
|
|
ctx context.Context,
|
|
method string,
|
|
url string,
|
|
body any,
|
|
header http.Header,
|
|
) (req *http.Request, err error) {
|
|
var bodyReader io.Reader
|
|
if body != nil {
|
|
if v, ok := body.(io.Reader); ok {
|
|
bodyReader = v
|
|
} else {
|
|
var reqBytes []byte
|
|
reqBytes, err = b.marshaller.Marshal(body)
|
|
if err != nil {
|
|
return
|
|
}
|
|
bodyReader = bytes.NewBuffer(reqBytes)
|
|
}
|
|
}
|
|
req, err = http.NewRequestWithContext(ctx, method, url, bodyReader)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if header != nil {
|
|
req.Header = header
|
|
}
|
|
return
|
|
}
|