All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.1.0] - 2026-09-05
Added
Lather.Soap.Elements: prefix-agnostic lookups (get/2,get_in/2,local_name/1,soap_version/1) over parsed SOAP documents.
Changed
Lather.Xml.Builder: a bare list value under a key now renders as repeated sibling elements (%{"Item" => ["1", "2"]}→<Item>1</Item><Item>2</Item>), mirroring howLather.Xml.Parserrepresents repeated elements. Previously a list rendered as a single element whose content was the joined items. A list of{key, value}pairs keeps its ordered-children meaning (#9).
Fixed
- SOAP envelopes with any namespace prefix (
soapenv:,SOAP-ENV:,s:,env:, none, ...) are now accepted byLather.Soap.Envelope.parse_response/1,Lather.Server.RequestParser,Lather.DynamicClientfault detection,Lather.Error.parse_soap_fault/2andLather.Operation.Builder; the SOAP version is detected from the namespace bound to whichever prefix is used. A document without an Envelope is reported as{:error, :invalid_soap_response}instead of{:error, {:soap_fault, :invalid_soap_response}}(#10). Lather.Soap.Envelope.parse_response/1returns{:ok, %{}}for an empty<Body/>instead of raising (#11).Lather.Server.Handler: malformed XML now yields a 400 Client fault instead of raising (#12); successful responses are no longer double-wrapped in<Response><OpResponse>and matchLather.Server.Plugbyte for byte (#13); everyPOSTis a SOAP call and everyGETserves the WSDL, so paths that happen to contain "wsdl" no longer get a 405 (#14). Transport-level faults are built withResponseBuilder.build_fault/1so fault strings are escaped.Lather.Operation.Builder(used byLather.DynamicClient.call/4) serialises parameters withLather.Soap.Body.serialize_params/1: nested maps no longer raise, lists render as repeated elements instead of being concatenated, and dates/booleans are rendered as XML literals. Array-typed parts wrap list values in the array's item element (from WSDL:typeswhen available, elseitem) (#17).Lather.Operation.Builder.validate_parameters/2no longer requires parts the WSDL marksminOccurs="0", matchingget_operation_metadata/1(#18).Lather.DynamicClient:authenticationoption:{:basic, u, p}raised aKeyError(the client struct has noheadersfield) and{:wssecurity, u, p}was silently ignored. Basic auth is now sent as theAuthorizationheader and WS-Security as aUsernameTokenSOAP header;{:wssecurity, u, p, opts}passes options such aspassword_type: :digest(#19).Lather.Auth.Basic.decode/1accepts theBasicscheme case-insensitively and tolerates extra whitespace, per RFC 7235 (#21).- SOAP 1.2 requests now get SOAP 1.2 responses from
Lather.Server.Plug,HandlerandEnhancedPlug: the envelope namespace,Code/Value+Reason/Textfault structure andapplication/soap+xmlcontent type follow the version of the request envelope (RequestParsernow reports:soap_version).ResponseBuilder.build_response/3andbuild_fault/2take a:soap_versionoption (#22). Lather.Auth.WSSecurity.username_token/3withpassword_type: :digestalways produces a digest (nonce and created are optional inputs to it) instead of silently falling back toPasswordText; an unknownpassword_typeraises (#20).Lather.Server.validate_param_types/2validates the lexical form of simple XSD types (int,decimal,boolean,dateTime,date,time, ...), accepts DSL atom types andxsd:prefixes, and returns a Client fault instead of raising when structured content is sent for a simple type (#16).Lather.Server.RequestParser: empty elements are""(was%{}), list items get the same namespace/attribute cleaning as single elements, and an element carrying only attributes and text collapses to its text (#15).Lather.Xml.Builder: aparse/1→build_fragment/1round-trip no longer collapses repeated elements into one element with joined text (#9).Lather.Xml.Builder: an element can now carry attributes and repeated child siblings, e.g.%{"@xsi:type" => "...", "string" => ["A", "B"]};#contentwith{tag, value}pairs remains available for ordered children (#8).Lather.Xml.Builder: mixed content (#textalongside child elements) emits a text node instead of a literal<#text>element.Lather.Soap.Body.serialize_params/1andLather.Server.ResponseBuilder:DateTime/Date/Time(and boolean) clauses are ordered ahead of the generic map/atom clauses so date/time values serialize to ISO 8601 instead of raising; regression tests added (#7).
[1.0.49] - 2026-06-08
Changed
- Updated development toolchain metadata to Elixir 1.20.0 on Erlang/OTP 29.
- Updated HTTP and documentation dependencies, including Bandit, Finch, Plug, ExDoc, Jason, and Telemetry.
- Adjusted Finch pool configuration for current Finch versions.
Fixed
- Removed compiler warnings surfaced by Elixir 1.20 in project code and tests.
- Hardened an integration test server setup against random port collisions.
[1.0.5] - 2025-12-25
Added
- 4 new livebooks for comprehensive feature coverage:
soap12_client.livemd- SOAP 1.2 protocol differences and client usagemtom_attachments.livemd- Binary data transmission with MTOM/XOPproduction_monitoring.livemd- Telemetry, metrics, health checks, and dashboardstesting_strategies.livemd- Unit testing, mocking, integration and contract testing
- 5 new example files demonstrating advanced features:
mtom_client.ex- MTOM attachment handlingcalculator_service.ex- Multi-type operations with error handlingenhanced_plug_example.ex- Multi-protocol server endpointsphoenix_integration.ex- Complete Phoenix setup patternsws_security_service.ex- WS-Security authentication and validation
- API.md expanded from 13 to 30 modules (100% coverage)
- Enhanced livebooks with ~1,400 lines of new content:
soap_server_development.livemd- EnhancedPlug demos and multi-protocol examplesenterprise_integration.livemd- Circuit breakers, retry strategies, resilience patterns
Fixed
- Corrected
WsdlGenerator→WSDLGeneratormodule name references across all documentation - Fixed non-existent
security_header/2API references in enterprise examples and livebooks - Fixed invalid Elixir
returnstatements in debugging livebook - Fixed
IP.putstypo in debugging livebook - Updated
TESTING.mdto use correct--include external_apiflag (removed incorrectENABLE_LIVE_API_TESTSreferences) - Corrected
username_token/3documentation to show keyword options instead of atom argument
Changed
- Updated examples READMEs to accurately reflect existing files (removed 9 non-existent file references)
- All 11 livebooks now listed in README.md and USAGE.md
- Version references updated to 1.0.5 throughout documentation
[1.0.4] - 2025-12-02
Added
- Enhanced multi-protocol support documentation in soap_server_development livebook
- Examples of EnhancedPlug and EnhancedWSDLGenerator usage
- Phoenix router patterns for multi-protocol endpoints
Changed
- Updated livebook documentation to highlight v1.0+ enhanced features
- Improved deployment patterns section with basic and enhanced examples
[1.0.3] - 2025-12-02
Fixed
- Removed references to non-existent CONTRIBUTING.md file from all documentation
- Updated GitHub repository references from markcotner to awksedgreep across all files
[1.0.1] - 2025-01-15
Changed
- Updated documentation to reflect current v1.0.0 status rather than treating it as "next release"
- Enhanced README with comprehensive livebooks section and detailed descriptions of all 7 interactive tutorials
- Updated USAGE.md with current API examples, multi-protocol capabilities, and production-ready patterns
- Updated all livebooks to reference correct version numbers and include hex package installation options
- Improved overall documentation consistency and confidence about current capabilities
- Updated roadmap to focus on v1.1.0, v1.2.0, and future releases
[1.0.0] - 2025-01-15
🚀 Production Release - Enhanced Multi-Protocol SOAP Library
This is the first stable release of Lather, featuring comprehensive SOAP 1.1 and SOAP 1.2 support with modern web interfaces and multi-protocol capabilities.
Added
🌟 Enhanced WSDL Generation (434 lines)
- Multi-protocol WSDL documents with SOAP 1.1, SOAP 1.2, and HTTP/REST bindings
- Layered API approach: SOAP 1.1 (compatibility) → SOAP 1.2 (enhanced) → REST/JSON (modern)
- Protocol negotiation and automatic version detection
- Enhanced inline documentation and service metadata
- Backward compatibility with existing WSDL generators
📝 Interactive Web Forms (832 lines)
- Professional HTML5 interface similar to .NET Web Services
- Interactive operation testing with real-time form validation
- Multi-protocol examples (SOAP 1.1, SOAP 1.2, JSON/REST)
- Responsive CSS design with mobile support
- Dark mode support - Automatically respects browser dark mode preference
- JavaScript-powered form interaction and submission
- Parameter validation and type-aware input controls
🔌 Enhanced Plug Integration (562 lines)
- Multi-endpoint routing for different protocols
- Content negotiation and automatic protocol detection
- Interactive web interface hosting
- Multiple WSDL variants per service (standard and enhanced)
- RESTful JSON endpoints alongside SOAP
🌐 Complete SOAP 1.2 Support (85-90% implementation)
- Full SOAP 1.2 envelope handling with correct namespaces
- Version-aware HTTP transport with proper Content-Type headers
- Enhanced error handling and fault processing
- 17/17 integration tests passing (100% success rate)
- Real-world service validation completed
🏗️ Three-Layer Protocol Architecture
┌─ SOAP 1.1 (Top - Maximum Compatibility) │ Legacy systems, .NET Framework ├─ SOAP 1.2 (Middle - Enhanced Features) │ Modern SOAP with better error handling └─ REST/JSON (Bottom - Modern Applications) │ Web apps, mobile, JavaScript
Enhanced
- WSDL Generation: Now supports multiple protocol bindings in single document
- Service Discovery: Enhanced metadata and operation documentation
- User Experience: Dark mode support for better accessibility and modern UX
- Error Handling: Improved fault processing for SOAP 1.2
- Performance: Sub-millisecond processing overhead, optimized for production
- Testing: Comprehensive test suite with 549/556 tests passing (98.7%)
URL Structure
GET /service→ Service overview with interactive formsGET /service?wsdl→ Standard WSDL (SOAP 1.1 only)GET /service?wsdl&enhanced=true→ Multi-protocol WSDLGET /service?op=OperationName→ Interactive operation testing formPOST /service→ SOAP 1.1 endpoint (maximum compatibility)POST /service/v1.2→ SOAP 1.2 endpoint (enhanced features)POST /service/api→ JSON/REST endpoint (modern applications)
Dependencies
- Added
{:jason, "~> 1.4", optional: true}for JSON support in enhanced features - Made Plug integration more robust with graceful degradation
Fixed
- Resolved unused variable warnings in enhanced modules
- Improved error handling for missing optional dependencies
- Enhanced list length checking for better performance
- Better JSON encoding/decoding with fallback handling
Performance
- Small requests (<10KB): 1-3ms processing overhead
- Large requests (>100KB): Network-bound, processing negligible
- WSDL generation: 10-50ms one-time cost
- Memory usage: Optimized with native Elixir data structures
Compatibility
- ✅ Full backward compatibility maintained
- ✅ Existing 0.9.x services work unchanged
- ✅ Standard WSDL generation unchanged
- ✅ All existing APIs preserved
Migration from 0.9.x
No breaking changes. Enhanced features are additive:
# Existing code continues to work
service_info = MyService.__service_info__()
wsdl = Lather.Server.WSDLGenerator.generate(service_info, base_url)
# Enhanced features available optionally
enhanced_wsdl = Lather.Server.EnhancedWSDLGenerator.generate(service_info, base_url)
forms = Lather.Server.FormGenerator.generate_service_overview(service_info, base_url)Known Limitations
- MTOM Attachment Support: Currently incomplete with 7 failing tests related to binary attachment handling. This does not affect core SOAP 1.1/1.2 functionality or any enhanced features. MTOM is an advanced feature for optimizing large binary transfers.
- JSON Endpoint Integration: Requires optional
jasondependency for full functionality. Gracefully degrades when not available.
What's Next (v1.1.0+)
- MTOM Support Completion: Complete binary attachment handling (7 failing tests to resolve)
- OpenAPI 3.0 Integration: Generate OpenAPI specs from SOAP services
- WS-Security Enhancements: XML Signature and Encryption support
- Advanced Authentication: OAuth 2.0 and JWT token support
[0.9.0] - 2025-10-30
Added
🚀 Complete SOAP Client Framework
- Generic SOAP client with dynamic operation discovery
- WSDL parsing and analysis with comprehensive type extraction
- Dynamic client generation from any WSDL
- Support for complex types, arrays, and nested structures
- Automatic type mapping and struct generation
🛡️ Authentication & Security
- WS-Security UsernameToken support (PasswordText & PasswordDigest)
- HTTP Basic Authentication
- Custom authentication headers
- Timestamp and nonce generation
- Pluggable authentication system
🖥️ SOAP Server Framework
- Complete server-side SOAP implementation
- Macro-based DSL for defining SOAP services
- Automatic WSDL generation from service definitions
- Phoenix integration via Plug
- Generic HTTP handler for standalone deployment
- Operation dispatch and request/response handling
🏗️ Core Infrastructure
- Robust XML parsing and generation
- SOAP envelope construction and parsing
- HTTP transport with Finch (connection pooling, SSL/TLS)
- Comprehensive error handling with structured error types
- Telemetry integration for observability
- Support for SOAP 1.1 standard
📚 Documentation & Examples
- 5 comprehensive Livebook tutorials
- Interactive client examples with real SOAP services
- Server implementation guides
- Type system and debugging tutorials
- Enterprise integration patterns
- Complete API documentation
Features
- Universal WSDL Support: Works with any SOAP service without hardcoded implementations
- Type Safety: Automatic type validation and conversion
- Phoenix Integration: Seamless integration with Phoenix applications
- Production Ready: Comprehensive error handling, logging, and monitoring
- Extensible: Pluggable architecture for custom authentication and transport
Technical Details
- Built on Elixir 1.14+ and OTP 25+
- Uses Finch for HTTP transport with connection pooling
- SweetXml for robust XML parsing
- Custom XML builder for reliable SOAP envelope generation
- Telemetry for metrics and observability
- Optional Plug dependency for Phoenix integration
Compatibility
- SOAP 1.1 (SOAP 1.2 planned for v1.0)
- WSDL 1.1 with XSD schema support
- HTTP and HTTPS transport
- Works with any SOAP service (tested with multiple public APIs)
[1.1.0] - 2026-09-05
Planned for v1.0.0
- SOAP 1.2 support
- Enhanced WS-Security features
- Performance optimizations
- Additional server examples
- Binary attachment support (MTOM)
- Advanced WS-* standards support
Note: This library went from concept to full-featured SOAP ecosystem in record time, delivering both client and server capabilities that were originally planned across multiple phases.