# Clientes de destino y adaptación automática

> Implementado (perfiles, alias 8.3, entrega para Mac). Los clientes concretos están "a probar": la lista
> indica qué se quiere soportar, no qué se ha comprobado.

Sunfish debe servir igual a un navegador actual que a un PC con DOS o un Mac de 1990. La regla
es que **las adaptaciones sean automáticas**: el servidor detecta el tipo de cliente y ajusta
nombres, formato y codificación sin que haya que configurar nada en el share. Solo hay opciones
para **desactivarlas** cuando estorban.

## Plataformas de destino

| Plataforma | Red | Web | FTP | Otros |
|---|---|---|---|---|
| **DOS** | *Packet driver* + pila propia de cada programa | Navegadores gráficos y de texto para DOS | Clientes FTP de DOS (las suites de red para DOS suelen traer uno) | Descargadores HTTP/1.0 de línea de comandos |
| **Windows 3.1 / WfW 3.11** | Pila Winsock de terceros, o TCP/IP-32 de Microsoft en WfW 3.11 | Navegadores de 16 bits (Netscape, IE, Opera, Mosaic) | Clientes FTP de 16 bits; `ftp://` en los navegadores | — |
| **Windows 95/98/ME** | De serie | IE 3–6, Netscape 3–4, Opera | `ftp.exe` (modo activo) | Carpetas web (WebDAV) con IE5/Office |
| **Mac clásico** (System 6 a Mac OS 9) | MacTCP / Open Transport | Navegadores de 68k y PPC de la época | Clientes FTP gráficos (con MacBinary) | Clientes WebDAV de Mac OS 9 |
| **Moderno** | — | Cualquier navegador actual | Cualquier cliente | WebDAV desde Explorador, Finder, GVfs; otro Sunfish |

## Detección (web)

Por el `User-Agent` de cada petición se asigna un **perfil**:

| Perfil | Se reconoce por (orientativo) | Adaptaciones |
|---|---|---|
| `dos` | Navegadores de DOS conocidos, `DOS`, `FreeDOS` | Nombres 8.3, CP437/CP850, modo clásico, diseño apto para texto |
| `win16` | `Win16`, `Windows 3.1` | Nombres 8.3, Windows-1252, modo clásico |
| `mac` | `Mac_68000`, `Mac_PowerPC`, `68K`, `PPC` con Mac OS clásico, navegadores de Mac clásico | MacBinary automático, MacRoman, nombres de hasta 31 caracteres, modo clásico |
| `text` | `Lynx`, `Links`, `w3m` | Diseño para texto (sin depender de tablas ni imágenes) |
| `classic` | Cualquier otro navegador no moderno | Modo clásico (HTML 3.2/4.01, ISO-8859-1 con entidades) |
| `modern` | Navegadores actuales | Modo moderno (UTF-8, CSS, JS opcional) |

- La lista de firmas está en el código y se amplía con lo que se vaya probando.
- **Forzar el perfil:** `?p=dos|win16|mac|text|classic|modern`. Como algunos clientes antiguos
  no guardan cookies, el perfil forzado **se propaga en los enlaces** que genera la página. Si
  hay cookies, también se guarda en una.
- Un perfil desconocido o dudoso cae siempre en `classic`, que funciona en todos.

En **FTP** no hay `User-Agent`; ver [FTP-Y-WEBDAV.md](FTP-Y-WEBDAV.md#nombres-cortos-y-mac-en-ftp).

## Nombres cortos (8.3) para DOS y Windows 3.1

DOS y Windows 3.1 solo admiten nombres `NOMBRE.EXT` (8 + 3 caracteres, sin espacios ni la
mayoría de símbolos). Un fichero como `Fotos del viaje.jpeg` no se puede guardar con su nombre.

Con los perfiles `dos` y `win16` (y en FTP si se activa), Sunfish presenta **alias 8.3**:

- Si el nombre ya es 8.3 válido, se usa tal cual (DOS no distingue mayúsculas, y así no cambia ningún enlace).
- Si no, se genera un alias **estable**: no cambia aunque se añadan o quiten otros ficheros de la
  carpeta. Así un enlace o un listado antiguo no acaba apuntando a otro fichero.
  - Base: las 3 primeras letras válidas del nombre, transliteradas a ASCII (`á` → `A`).
  - Después, 3 dígitos hexadecimales de un hash del nombre completo, y `~1`.
  - Extensión: los 3 primeros caracteres válidos de la última extensión.
  - Ejemplo: `Fotos del viaje.jpeg` → `FOTxxx~1.JPE` (`xxx`, el hash).
  - Si dos nombres de la misma carpeta dan el mismo alias, el segundo en orden alfabético pasa
    a `~2`, y así sucesivamente (muy raro).
- Los alias se usan en el listado, en los enlaces y en la cabecera `Content-Disposition` de las
  descargas. En la web se muestra también el nombre largo, para saber qué es cada cosa.
- Al pedir una ruta (web o FTP, con cualquier perfil), cada segmento se busca primero por nombre real y después por alias.
- Lo que sube un cliente DOS o Win16 ya tiene nombre 8.3 y se guarda tal cual.
- Se desactiva por share con `ShortNames = false`.

## Nombres en Mac clásico

HFS admite hasta 31 caracteres. Con el perfil `mac`, los nombres más largos se acortan para la
descarga (`Content-Disposition` y nombre dentro de MacBinary) conservando la extensión. Los
ficheros con *resource fork* se descargan en MacBinary de forma automática; ver
[MAC-CLASICO.md](MAC-CLASICO.md).

## Diseño de página para todos

- **Modo clásico:**
  - Tablas sencillas, sin anidar más de lo necesario.
  - Todas las imágenes con `alt` (`[DIR]`, `[TXT]`…), para que los navegadores de texto muestren
    algo legible.
- **Perfil `text`:** el listado es una lista de líneas en vez de una tabla.
- **Fuente sin serifa:**
  - Modo moderno: CSS `font-family: Verdana, "DejaVu Sans", Tahoma, Arial, Helvetica, sans-serif`.
  - Modo clásico: `<font face="Verdana,Arial,Helvetica">`, que entienden desde Netscape 3 e IE3;
    los navegadores anteriores la ignoran y usan su fuente por defecto.
