140 lines · 4.3 KB · Go
RawDownload
// Package main demonstrates how to use coreauth.Manager.HttpRequest/NewHttpRequest// to execute arbitrary HTTP requests with provider credentials injected.//// This example registers a minimal custom executor that injects an Authorization// header from auth.Attributes["api_key"], then performs two requests against// httpbin.org to show the injected headers.package main import (	"bytes"	"context"	"errors"	"fmt"	"io"	"net/http"	"strings"	"time" 	coreauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth"	clipexec "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/executor"	log "github.com/sirupsen/logrus") const providerKey = "echo" // EchoExecutor is a minimal provider implementation for demonstration purposes.type EchoExecutor struct{} func (EchoExecutor) Identifier() string { return providerKey } func (EchoExecutor) PrepareRequest(req *http.Request, auth *coreauth.Auth) error {	if req == nil || auth == nil {		return nil	}	if auth.Attributes != nil {		if apiKey := strings.TrimSpace(auth.Attributes["api_key"]); apiKey != "" {			req.Header.Set("Authorization", "Bearer "+apiKey)		}	}	return nil} func (EchoExecutor) HttpRequest(ctx context.Context, auth *coreauth.Auth, req *http.Request) (*http.Response, error) {	if req == nil {		return nil, fmt.Errorf("echo executor: request is nil")	}	if ctx == nil {		ctx = req.Context()	}	httpReq := req.WithContext(ctx)	if errPrep := (EchoExecutor{}).PrepareRequest(httpReq, auth); errPrep != nil {		return nil, errPrep	}	return http.DefaultClient.Do(httpReq)} func (EchoExecutor) Execute(context.Context, *coreauth.Auth, clipexec.Request, clipexec.Options) (clipexec.Response, error) {	return clipexec.Response{}, errors.New("echo executor: Execute not implemented")} func (EchoExecutor) ExecuteStream(context.Context, *coreauth.Auth, clipexec.Request, clipexec.Options) (*clipexec.StreamResult, error) {	return nil, errors.New("echo executor: ExecuteStream not implemented")} func (EchoExecutor) Refresh(context.Context, *coreauth.Auth) (*coreauth.Auth, error) {	return nil, errors.New("echo executor: Refresh not implemented")} func (EchoExecutor) CountTokens(context.Context, *coreauth.Auth, clipexec.Request, clipexec.Options) (clipexec.Response, error) {	return clipexec.Response{}, errors.New("echo executor: CountTokens not implemented")} func main() {	log.SetLevel(log.InfoLevel) 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)	defer cancel() 	core := coreauth.NewManager(nil, nil, nil)	core.RegisterExecutor(EchoExecutor{}) 	auth := &coreauth.Auth{		ID:       "demo-echo",		Provider: providerKey,		Attributes: map[string]string{			"api_key": "demo-api-key",		},	} 	// Example 1: Build a prepared request and execute it using your own http.Client.	reqPrepared, errReqPrepared := core.NewHttpRequest(		ctx,		auth,		http.MethodGet,		"https://httpbin.org/anything",		nil,		http.Header{"X-Example": []string{"prepared"}},	)	if errReqPrepared != nil {		panic(errReqPrepared)	}	respPrepared, errDoPrepared := http.DefaultClient.Do(reqPrepared)	if errDoPrepared != nil {		panic(errDoPrepared)	}	defer func() {		if errClose := respPrepared.Body.Close(); errClose != nil {			log.Errorf("close response body error: %v", errClose)		}	}()	bodyPrepared, errReadPrepared := io.ReadAll(respPrepared.Body)	if errReadPrepared != nil {		panic(errReadPrepared)	}	fmt.Printf("Prepared request status: %d\n%s\n\n", respPrepared.StatusCode, bodyPrepared) 	// Example 2: Execute a raw request via core.HttpRequest (auto inject + do).	rawBody := []byte(`{"hello":"world"}`)	rawReq, errRawReq := http.NewRequestWithContext(ctx, http.MethodPost, "https://httpbin.org/anything", bytes.NewReader(rawBody))	if errRawReq != nil {		panic(errRawReq)	}	rawReq.Header.Set("Content-Type", "application/json")	rawReq.Header.Set("X-Example", "executed") 	respExec, errDoExec := core.HttpRequest(ctx, auth, rawReq)	if errDoExec != nil {		panic(errDoExec)	}	defer func() {		if errClose := respExec.Body.Close(); errClose != nil {			log.Errorf("close response body error: %v", errClose)		}	}()	bodyExec, errReadExec := io.ReadAll(respExec.Body)	if errReadExec != nil {		panic(errReadExec)	}	fmt.Printf("Manager HttpRequest status: %d\n%s\n", respExec.StatusCode, bodyExec)}