soap

package
v1.64.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 13, 2026 License: MIT Imports: 15 Imported by: 0

README

Package soap

Пакет soap предоставляет инструменты для работы с SOAP-сервисами: обработка запросов, валидация данных, генерация ошибок в формате SOAP Fault, а также интеграция с метриками и логированием.

Types

ActionMux

Мультиплексор для маршрутизации SOAP-запросов на основе заголовка SOAPAction.

Methods:

NewActionMux() *ActionMux

Создает новый мультиплексор.

(m *ActionMux) Handle(actionUri string, handler http.Handler) *ActionMux

Регистрирует обработчик для указанного SOAPAction.

(m *ActionMux) ServeHTTP(writer http.ResponseWriter, request *http.Request)

Обрабатывает запрос, определяя действие через заголовок SOAPAction, и вызывает соответствующий обработчик. При отсутствии действия или неизвестном SOAPAction возвращает SOAP Fault.

RequestExtractor

Извлекает данные из SOAP-конверта и валидирует их с помощью объекта, реализующего интерфейс Validator.

Methods:

(j RequestExtractor) Extract(_ context.Context, reader io.Reader, reqBodyType reflect.Type) (reflect.Value, error)

Десериализация XML и проверка данных через Validator.

ResponseMapper

Формирует SOAP-ответ из данных, добавляя заголовки и сериализуя в XML.

Methods:

(j ResponseMapper) Map(ctx context.Context, result any, w http.ResponseWriter) error

Упаковка результата в SOAP-конверт.

Functions

DefaultWrapper(logger log.Logger, logMiddleware endpoint.LogMiddleware, restMiddlewares ...http.Middleware) endpoint.Wrapper

Создает обертку для обработчиков с предустановленными middleware:

  • Ограничение размера тела запроса (по умолчанию 64 МБ).
  • Добавление RequestId.
  • Логирование и метрики.
  • Трейсинг.
  • Обработка ошибок через ErrorHandler.
ErrorHandler(logger log.Logger) http2.Middleware

Middleware для перехвата ошибок, их логирования и преобразования в SOAP Fault.

Usage

Default usage flow
package main

import (
	"context"
	"encoding/xml"
	"log"
	"net/http"

	"github.com/txix-open/isp-kit/http/endpoint/httplog"
	"github.com/txix-open/isp-kit/http/soap"
	log2 "github.com/txix-open/isp-kit/log"
)

type UserRequest struct {
	XMLName xml.Name `xml:"UserRequest"`
	Name    string   `xml:"name"`
}

func main() {
	logger, err := log2.New()
	if err != nil {
		log.Fatal(err)
	}
	mux := soap.NewActionMux()

	wrapper := soap.DefaultWrapper(logger, httplog.Log(logger, true))
	handler := wrapper.Endpoint(func(ctx context.Context, req UserRequest) {
		/* put here business logic */
	})
	mux.Handle("CreateUser", handler)

	http.ListenAndServe(":8080", mux)
}

Documentation

Index

Constants

View Source
const (
	ActionHeader = "SOAPAction"
)
View Source
const (
	ContentType = `text/xml; charset="utf-8"`
)

Variables

This section is empty.

Functions

func DefaultWrapper

func DefaultWrapper(logger log.Logger, logMiddleware endpoint.LogMiddleware, restMiddlewares ...http.Middleware) endpoint.Wrapper

func ErrorHandler

func ErrorHandler(logger log.Logger) http2.Middleware

Types

type ActionMux

type ActionMux struct {
	// contains filtered or unexported fields
}

func NewActionMux

func NewActionMux() *ActionMux

func (*ActionMux) Handle

func (m *ActionMux) Handle(actionUri string, handler http.Handler) *ActionMux

func (*ActionMux) ServeHTTP

func (m *ActionMux) ServeHTTP(writer http.ResponseWriter, request *http.Request)

type Body

type Body struct {
	XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Body"`

	Content any `xml:",omitempty"`

	Fault *Fault `xml:",omitempty"`
	// contains filtered or unexported fields
}

func (*Body) UnmarshalXML

func (b *Body) UnmarshalXML(d *xml.Decoder, _ xml.StartElement) error

UnmarshalXML copied from https://github.com/hooklift/gowsdl/blob/master/soap/soap.go

type Envelope

type Envelope struct {
	XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"`

	Header *Header
	Body   Body
}

type Fault

type Fault struct {
	XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault"`

	Code   string `xml:"faultcode,omitempty"`
	String string `xml:"faultstring,omitempty"`
	Actor  string `xml:"faultactor,omitempty"`
	Detail any    `xml:"detail,omitempty"`
}

nolint:errname

func (Fault) Error

func (f Fault) Error() string

func (Fault) WriteError

func (f Fault) WriteError(w http.ResponseWriter) error
type Header struct {
	XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Header"`

	Items []any `xml:",omitempty"`
}

type RequestExtractor

type RequestExtractor struct {
	Validator Validator
}

func (RequestExtractor) Extract

func (j RequestExtractor) Extract(_ context.Context, reader io.Reader, reqBodyType reflect.Type) (reflect.Value, error)

func (RequestExtractor) ExtractV2 added in v1.61.0

func (j RequestExtractor) ExtractV2(ctx context.Context, reader io.Reader, ptr any) error

type ResponseMapper

type ResponseMapper struct {
}

func (ResponseMapper) Map

func (j ResponseMapper) Map(ctx context.Context, result any, w http.ResponseWriter) error

type Validator

type Validator interface {
	ValidateToError(v any) error
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL