# HAProxy WebSocket Configuration Fix

## Issue
WebSocket connections open but messages aren't received by the Android client.

## Root Cause
The HAProxy `defaults` section has `option http-server-close` which closes the connection after the HTTP response. This breaks WebSocket upgrade because HAProxy closes the connection before it can be upgraded to the WebSocket protocol.

## Solution
Add `no option http-server-close` to the `alfred_mobile_app-backend` backend to override the default and keep the connection open for WebSocket upgrade.

## Complete Backend Configuration

```haproxy
backend alfred_mobile_app-backend
    option forwardfor
    no option http-server-close
    timeout tunnel 3600s
    timeout server 3600s
    # Pass the real client IP to backend (from proxy headers or direct connection)
    # This is crucial for container-level logging and security tools
    http-request add-header X-CLIENT-IP %[var(txn.real_ip)]
    http-request set-header X-Real-IP %[var(txn.real_ip)]
    http-request set-header X-Forwarded-For %[var(txn.real_ip)]
    http-request set-header X-Forwarded-Proto https if { ssl_fc }
    
    server alfred_app_proxy 192.168.1.169:18790 check
```

## Changes Made

1. **Added:** `no option http-server-close`
   - Overrides the global default
   - Keeps connection open after HTTP upgrade response
   
2. **Already added:** `timeout tunnel 3600s`
   - Keeps WebSocket tunnel open for 1 hour
   
3. **Already added:** `timeout server 3600s`
   - Prevents server timeout on long connections

## Testing

After applying this change:
1. Reload HAProxy configuration
2. Kill Alfred Mobile app
3. Open app fresh
4. WebSocket should connect and receive messages
5. Connection should stay open

## Alternative: TCP Mode (if HTTP mode still has issues)

If the above doesn't work, you can switch the entire backend to TCP mode for pure passthrough:

```haproxy
backend alfred_mobile_app-backend
    mode tcp
    timeout tunnel 3600s
    timeout server 3600s
    
    server alfred_app_proxy 192.168.1.169:18790 check
```

**Note:** TCP mode loses HTTP header manipulation (X-CLIENT-IP, X-Real-IP, etc.) but guarantees WebSocket works.

## HAProxy WebSocket Documentation

From HAProxy docs:
> For WebSocket connections, use `no option http-server-close` or switch to `mode tcp` to prevent HAProxy from closing the connection after the upgrade response.

## Status

- [x] Identified issue
- [ ] Applied fix
- [ ] Tested connection
- [ ] Verified messages flow
