Diseño previsto; aún no implementado.
HttpListener, que en Windows va sobre http.sys: escuchar fuera de localhost exige ser administrador o reservar la URL con netsh (que también lo exige). Cambiar la ruta (un "directorio virtual") no lo evita. Un Socket propio no necesita permisos en Windows con ningún puerto; en Linux y macOS los puertos por debajo de 1024 siguen requiriendo privilegios, por eso los puertos por defecto son altos.LF, HTTP/1.0 sin Host, cabeceras poco normales). Con un motor propio se aceptan.sunfish-cli puede ser un binario nativo pequeño.GET /ruta sin versión: solo el cuerpo), HTTP/1.0 y HTTP/1.1.GET, HEAD, POST (formularios y subidas), PUT (subidas modernas) y los de WebDAV (FTP-Y-WEBDAV.md).CRLF o LF; nombres de cabecera sin distinguir mayúsculas; Host opcional en 1.0.Connection: keep-alive; si no, se cierra al terminar.Content-Length: los clientes antiguos no conocen chunked, y así muestran el progreso.chunked a clientes 1.1 y cerrando la conexión a los 1.0.Range: bytes=, uno solo) para reanudar descargas; If-Modified-Since → 304.Content-Length o chunked; Expect: 100-continue.| Modo | Para quién | Qué cambia |
|---|---|---|
| Clásico | Navegadores antiguos (por defecto si el User-Agent no es moderno) | HTML 3.2/4.01 Transitional, maquetado con tablas, sin JavaScript, ISO-8859-1 |
| Moderno | Navegadores actuales | La misma estructura, UTF-8, un CSS sencillo y un JS pequeño para arrastrar y soltar y para subir por trozos con progreso |
dos, win16, mac, text, classic, modern) descritos en CLIENTES.md, que además ajustan nombres (8.3, 31 caracteres), juego de caracteres y entrega de ficheros de Mac.?p=…. El perfil forzado se propaga en los enlaces de la página (algunos clientes antiguos no guardan cookies) y se recuerda en una cookie cuando se puede.<font face> en el clásico).<script>: algunos navegadores antiguos muestran un diálogo de error por cada script que no entienden.á), que entienden incluso los navegadores de HTML 2.0.? (o transliterados cuando haya equivalente).%XX, así que funcionan aunque el texto se vea transliterado: el navegador devuelve los mismos bytes al pedir.?sort=), sin JS.multipart/form-data, RFC 1867, desde Netscape 2 e IE3/IE4);?action=delete).[.bin] y [.hqx] (ver MAC-CLASICO.md).?$list muestra este navegador aunque la carpeta tenga index.html (si el share tiene Listing). En el menú raíz y en los listados, las carpetas con índice llevan un pequeño enlace [contenido] que apunta a él.C:\WINDOWS\fichero.txt) y Mac clásico puede usar : como separador.sunfish.js envía cada fichero con PUT a su URL en trozos de 1 MiB (Content-Range: bytes inicio-fin/total y X-Sunfish-Upload: <id>). Los trozos deben llegar en orden; el temporal es .sunfish-<id>.part y el último trozo lo renombra a su sitio (202 por trozo, 201/204 al terminar). Un PUT sin Content-Range sube el fichero entero.Upload y Overwrite; comprueba el espacio libre si el tamaño se conoce de antemano..sunfish-*.part abandonados por subidas que no terminaron.| Petición | Qué hace |
|---|---|
POST carpeta/ multipart, a=upload |
Subir ficheros (campo f, varios a la vez) |
POST carpeta/ formulario, a=mkdir&name= |
Crear carpeta |
POST carpeta/ formulario, a=rename&name=&to= |
Renombrar dentro de la carpeta |
POST carpeta/ formulario, a=delete&name= |
Borrar fichero o carpeta entera |
GET carpeta/?$rename=nombre |
Página para escribir el nombre nuevo |
GET carpeta/?$delete=nombre |
Página de confirmación del borrado |
GET carpeta/?$zip |
Carpeta en ZIP |
POST lleva t, el token anti-CSRF de esa acción y carpeta (ver SEGURIDAD.md). En multipart, a y t van antes que los ficheros y se validan antes de escribir nada.POST correcto se vuelve a la carpeta con 303 (HTTP/1.1) o 302 (HTTP/1.0, que no conoce el 303).. (quedarían ocultos en el listado).Un share con Users exige HTTP Basic. Las cuentas se gestionan con sunfish-cli user add|passwd|del|list (contraseña pedida sin eco). Ver SEGURIDAD.md.
Content-Length, a costa de leer dos veces cada fichero./$sunfish/download entrega el propio ejecutable que está sirviendo (como hacía la 2.0), para repartirlo por la LAN. Se desactiva con SelfDownload = false.
En /$sunfish/admin/, desactivado por defecto.
Implementado en Web/WebAdmin.cs (fase 7). Se activa desde la GUI (ventana de información), con sunfish-cli admin enable o con [Admin] Enabled = true y una contraseña.
admin con contraseña (HTTP Basic); hash PBKDF2 en [Admin]. Mismo bloqueo por intentos fallidos que el resto. Desactivado o sin contraseña responde 404.AllowFrom: IP sueltas, redes CIDR (192.168.1.0/24, fd00::/8) o *. Por defecto, 127.0.0.1, ::1. Desde otra dirección responde 403. Las IPv4 que llegan como IPv6 (::ffff:a.b.c.d) se comparan como IPv4./$sunfish/admin/: estado (HTTP y FTP), direcciones con su enlace [QR], servidor (nombre, menú raíz, FTP sí/no y puerto), shares (editar, quitar), usuarios (alta, contraseña, baja) y ajustes del propio panel;/$sunfish/admin/share y share?n=NOMBRE: alta y edición de un share con todas sus opciones (las mismas validaciones que la GUI);/$sunfish/admin/log: el registro reciente;/$sunfish/admin/qr?u=URL: PNG con el QR (solo http:// y ftp://, hasta 300 caracteres).?ok; si hay un error, la misma página con el aviso.admin no vale como nombre de usuario.