blob: 1b20b74b3a500cc929fa4c5119b63c389ecf463f [file] [view]
# JSON Processing: HTTP/1.1 vs HTTP/2 Architecture
## Overview
Axis2/C supports JSON processing through two distinct architectures:
| Aspect | HTTP/1.1 JSON | HTTP/2 JSON |
|--------|---------------|-------------|
| **Source Files** | `axis2_json_reader.c`, `axis2_json_writer.c` | `axis2_h2_transport_utils.c` |
| **JSON Library** | json-c | json-c |
| **Internal Format** | AXIOM XML tree (`axiom_node_t*`) | Native JSON (`json_object*`) |
| **SOAP Handling** | Full SOAP envelope processing | Minimal dummy envelope (bypassed) |
| **Performance** | Slower (JSONAXIOM conversion) | Faster (direct JSON processing) |
| **Recommendation** | Legacy/backward compatibility | **Recommended for new development** |
## Architecture Diagrams
### HTTP/1.1 JSON Processing Path
```
┌─────────────┐ ┌──────────────────────┐ ┌─────────────────┐ ┌─────────────┐
│ JSON Input │────▶│ axis2_json_reader.c │────▶│ axiom_node_t* │────▶│ SOAP/Engine │
│ │ │ (json-c parsing + │ │ (XML tree) │ │ Processing │
│ │ │ AXIOM conversion) │ │ │ │ │
└─────────────┘ └──────────────────────┘ └─────────────────┘ └─────────────┘
┌──────────────────────┐
│ axis2_json_read_node │
│ (recursive JSON→XML) │
└──────────────────────┘
```
**Key Functions:**
- `axis2_json_reader_create_for_memory()` - Creates reader from JSON string
- `axis2_json_reader_read()` - Parses JSON and converts to AXIOM tree
- `axis2_json_reader_get_root_node()` - Returns `axiom_node_t*` (NOT `json_object*`)
### HTTP/2 JSON Processing Path
```
┌─────────────┐ ┌──────────────────────┐ ┌─────────────────┐ ┌─────────────┐
│ JSON Input │────▶│ json_tokener_parse() │────▶│ json_object* │────▶│ Service │
│ │ │ (direct json-c) │ │ (native JSON) │ │ Handler │
└─────────────┘ └──────────────────────┘ └─────────────────┘ └─────────────┘
┌─────────────────────┐
│ Minimal SOAP Envelope│
│ (framework compat, │
│ processing bypassed)│
└─────────────────────┘
```
**Key Functions:**
- `json_tokener_parse()` - Direct json-c parsing
- `axis2_h2_transport_utils_process_http_post_request()` - HTTP/2 JSON handler
- No AXIOM conversion - JSON stays as `json_object*`
## Performance Comparison
### HTTP/1.1 JSON Overhead
The HTTP/1.1 path incurs significant overhead because:
1. **Double Parsing**: JSON is parsed by json-c, then converted to AXIOM XML
2. **Memory Allocation**: AXIOM tree requires additional memory for XML nodes
3. **Recursive Conversion**: `axis2_json_read_node()` recursively builds XML tree
4. **Type Mapping**: JSON types must be mapped to AXIOM element types
```c
/* HTTP/1.1: JSON → AXIOM conversion (axis2_json_reader.c) */
axis2_status_t axis2_json_read_node(
json_object* parent, /* Input: JSON object */
const char* name,
axiom_node_t** om_node, /* Output: AXIOM XML node */
const axutil_env_t* env)
{
/* Recursive conversion of every JSON element to XML */
json_object_object_foreach(parent, key, value) {
/* Create AXIOM element for each JSON key */
/* Recursively process nested objects/arrays */
}
}
```
### HTTP/2 JSON Efficiency
The HTTP/2 path eliminates conversion overhead:
1. **Single Parse**: JSON is parsed once by json-c
2. **Native Access**: Services access `json_object*` directly
3. **No Conversion**: No AXIOM tree creation
4. **Minimal Envelope**: Dummy SOAP envelope satisfies framework without processing
```c
/* HTTP/2: Direct JSON processing (axis2_h2_transport_utils.c) */
axis2_status_t axis2_h2_transport_utils_process_http_post_request(
const axutil_env_t* env,
axutil_stream_t* in_stream,
const axis2_char_t* content_type)
{
/* Parse JSON directly - no conversion */
json_obj = json_tokener_parse(json_string);
/* Service receives json_object* directly */
/* No AXIOM overhead */
}
```
## The Dummy SOAP Envelope Architecture
HTTP/2 mode uses a "dummy SOAP envelope" pattern (similar to Axis2/Java):
1. **Framework Compatibility**: Axis2/C core expects SOAP message context
2. **Minimal Overhead**: Empty/minimal envelope created for framework satisfaction
3. **Processing Bypass**: `IS_JSON_STREAM=true` flag signals JSON-only mode
4. **Direct Access**: JSON Message Receiver bypasses SOAP processing entirely
This achieves framework compatibility with near-zero overhead.
## When to Use Each Path
### Use HTTP/2 JSON (Recommended)
- New service development
- High-performance JSON APIs
- RESTful services
- Microservices architecture
- Large payload processing
- HTTP/2 multiplexed streams
### Use HTTP/1.1 JSON (Legacy)
- Existing services requiring backward compatibility
- Integration with systems that only support HTTP/1.1
- When AXIOM/XML interoperability is needed
- Legacy deployment environments
## History and Rationale
### HTTP/1.1 JSON Support
- **Origin**: Community contributed feature (original Axis2/C JSON support)
- **Design**: Built on top of existing AXIOM infrastructure
- **Trade-off**: Easier integration with existing code, but performance penalty
- **Status**: Maintained for backward compatibility, not recommended for new development
### HTTP/2 JSON Support
- **Origin**: HTTP/2 Pure JSON Architecture redesign
- **Design**: Direct json-c usage with minimal SOAP envelope
- **Trade-off**: Better performance, requires HTTP/2 infrastructure
- **Status**: Recommended for all new JSON service development
## Fuzzer Coverage
Both JSON paths are tested by dedicated fuzzers:
| Fuzzer | Tests | Entry Point |
|--------|-------|-------------|
| `fuzz_json_reader` | HTTP/1.1 JSONAXIOM | `axis2_json_reader_create_for_memory()` |
| `fuzz_json_parser` | HTTP/2 direct json-c | `json_tokener_parse()` |
See `fuzz/fuzz_json_reader.c` and `fuzz/fuzz_json_parser.c` for implementation details.
## Related Documentation
- [HTTP/2 JSON User Guide](userguide/json-httpd-h2-userguide.md) - Deployment and testing
- [HTTP/2 Migration State](AXIS2C_HTTP2_MIGRATION_STATE.md) - Technical architecture details
- [Security Guide](SECURITY.md) - JSON security considerations