Back to "StyloBot Release Series: La arquitectura del Sidecar"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

Architecture ASP.NET Core Go gRPC StyloBot

StyloBot Release Series: La arquitectura del Sidecar

Monday, 01 June 2026

StyloBot' su motor de detección es ASPM SK1NET Core. Este post explica cómo ese motor se conecta a las gateways de Go , Node M SK4 aplicaciones js , y cualquier otra pila a través de una carretilla lateral gRPC

StyloBot

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. github.com/scottgal/stylobot-go El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. github.com/scottgal/caddy-stylobot plugin, y el Mostlylucid.BotDetection.Sidecar ii) En el párrafo 2 de la parte dispositiva del proyecto de resolución A/C.3/60/L.39, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación de las recomendaciones formuladas por la Comisión Consultiva en Asuntos Administrativos y de Presupuesto; Todo lo que aparece a continuación describe la superficie que expondrán.

StyloBot Release Series

  1. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.: por qué StyloBot modela a los clientes de forma behavioural
  2. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la protección de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares.: el servidor-la superficie entregada para las aplicaciones .NET
  3. El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico sobre las medidas adoptadas para eliminar la discriminación contra la mujer.: la disciplina de fiabilidad que mantiene el motor aburrido en la producción
  4. El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el documento A/CN.9/WG.VI/WP.39, que figura a continuación:El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la protección de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares.
  5. **El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.**El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
  6. Por consiguiente, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo.El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
  7. En el párrafo 6 de su resolución 57/270 B, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción para prevenir, combatir y eliminar el tráfico ilícito de armas pequeñas y ligeras en todos sus aspectos.: la disciplina de verificación : un fichero BDF conduce a regresiónM SK2 carga, y calibración
  8. StyloExtract - un programa local de aprendizaje HTML para convertir Markdown: el HTMLM SK1Layer de marcaje que se combina con el detector, la walker bug lucidVIEW capturada , y el circuito dogfood que lo hizo honesto

Por qué una autopista lateral

Un proxy inversa es el lugar obvio para ejecutar la detección del bot: se encuentra delante de todo, ve todas las peticiones , y puede bloquear antes de que cualquier código de aplicación ejecuteM SK3 Esta lógica se mantiene hasta que te preguntas qué debe hacer tu aplicación El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. basándose en quién está haciendo la solicitud. Una puerta que bloquea directamente es una puerta; lo que la mayoría de las aplicaciones realmente necesitan es un veredicto sobre el cual pueden actuar de varias maneras al mismo tiempo : arrojar la APIM SK3 personalizar la UIMSC4 excluir el tráfico de las analyticasMska5 añadir un paso de fricción a la facturaciónM Ska6 Una porta no puede hacer nada de esoMSKA7 Una red de veredictos puedeMske8

El modelo de autopista separa las dos preocupaciones. La puerta permanece rápida y sin estado. El autopista mantiene el estado de sesiónM SK2 anclas arquetípicas , estado de flujoMSC4 y caché de verificación que hacen la detección exacta MST5el arquetipo MST6modelo de anclaM ST7 el perM st8cache de versión de huellas digitalesMst9 y los cuatroM St10 sistemas de aprendizaje están cubiertos en Por consiguiente, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo.). Los dos comunican a través de la red local (el mismo host o el mismo Pod), por lo que la ruta redondaM SK3está a microsegundos hasta un soloMSC4digit millisecondesMST5 no es el SSK6ms de una llamada API remotaMst7 Ese presupuesto de latencia es lo que hace que la detección de pedidos sea práctica en absolutoM st9

No es un modelo nuevo. La Comisión Consultiva en Asuntos Administrativos y de Presupuesto examinó el proyecto de presupuesto por programas para el bienio 2008-2009 (A/60/6 (Sect. El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el párrafo 6 supra. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de acceso a los servicios de salud reproductiva, incluida la educación sexual y reproductiva. El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico. El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General (A/CN.9/WG.VI/WP.21) y de las recomendaciones que figuran en él. ¿lo hace para la telemetría. LinkerdM SK1 Consul Connect, y AWS App Mesh todos siguen el mismo modelo . El patrón sigue apareciendo porque resuelve un problema real

¿Por qué no emplazarlo como una biblioteca?

La alternativa consiste en compilar la detección directamente en la puerta de entrada. Para Go significa una reimplementación pura-Go o una conexión CGo a una biblioteca CM SK2 Para Node significa ejecutar la detección en el procesoMSC3 junto con la aplicaciónMスク4

Tampoco es realista para un motor de esta complejidad. StyloBot tiene 49 detectores organizados en cuatro ejecucións. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la asignación de recursos suficientes a la educación y la formación profesional. (Las ondas posteriores disparan sólo cuando los señales anteriores lo justifiquenM SK1 una credencial -la tentación de alimentar desencadena detectores diferentes que un crawl del Googlebot Los vectores de la cadena Markov en un espacio 129-dimensional. Una cadena Markov es sólo un modelo de probabilidad sobre "da la última cosa que esta sesión ha hecho El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. sobre estos vectores: un gráfico-algoritmo de fragmentación que agrupa sesiones que se comportan de la misma manera , lo cual es el modo en que StyloBot detecta una red de bots incluso cuando las sesiones individuales se parecen bienM SK3 Y persiste todo esto a SQLite entre las peticionesMST4 Este estado necesita un ciclo de vida independienteMSC5 No puede reiniciar con el proceso de los nódulos o quedarse desarraigado cuando la puerta reinicia su configuraciónMSSK6

Un coche lateral permite a cada componente hacer lo que es bueno en:

graph TD
    classDef input fill:none,stroke:#3b82f6,stroke-width:2px
    classDef async fill:none,stroke:#a855f7,stroke-width:2px
    classDef good fill:none,stroke:#22c55e,stroke-width:2px
    classDef store fill:none,stroke:#f59e0b,stroke-width:2px

    GW["Gateway<br/>Caddy / YARP / nginx"]:::input
    SD["StyloBot Sidecar · ASP.NET Core<br/>gRPC :5090 · REST :5091<br/>≤50ms per Detect RPC"]:::async
    APP["Upstream Application<br/>Node / Go / ASP.NET<br/>reads req.stylobot.verdict"]:::good
    DB[("SQLite<br/>sessions · signatures · reputation")]:::store

    GW --> SD
    SD <--> DB
    GW --> APP

El portal llama a la sidecar, inyece el resultado como encabezamientos HTTP, y bloquea opcionalmenteM SK2 La aplicación ascendente lee los encabezamientoים y actúa sobre el veredicto . La sidecar persistes estado entre las peticionesMSC4 La línea de detección se ejecuta dentro del único llamamiento gRPC y su resultado se propaga como nueve encabezados HTTPSSK5

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Mostlylucid.BotDetection.Sidecar es un proceso mínimo ASP.NET Core M SK1 No tiene UI, no tiene servicio de archivo estático , y no tiene rutas más allá de los puntos finales gRPC y RESTMSC4 Empieza el motor de detección completo y expone dos puertosMNK5

  • :5090: HTTP/2 para los clientes de gRPC ( vías de entradaM SK3 Proxios de accesoMSC4 el cliente del Nodo gR PCMST5
  • :5091El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. /api/v1/* El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. es un marco de llamadas de procedimiento remoto de alto rendimiento - desarrollado en Google El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. : un código binario compacto que es más rápido para serializar y menor en el cable que JSONM SK3 gRPC ejecuta sobre HTTP/2, lo que significa que recibe multiplexing (multiple requests over one TCP connectionMST6 for freeMSC7

La interfaz está definida en un .proto file. Los generadores de código de ese archivo, producen ficheros de cliente y servidor tipificados en cualquier idioma de soporteM SK2 StyloBot publica .proto archivos para que cualquier lengua con una implementación gRPC pueda llamar el sidecar

La interfaz de gRPC

El Servicio cuenta con tres PCR:

service DetectionService {
  rpc Detect(DetectRequest)             returns (DetectResponse);
  rpc DetectBatch(DetectBatchRequest)   returns (DetectBatchResponse);
  rpc RenderWidget(RenderWidgetRequest) returns (RenderWidgetResponse);
}

Detect es el per-la ruta caliente de la petición. Método de pasarlaM SK2 la ruta , los encabezamientosMNK4 IP remotoMMK5 y datos de huellas digitales opcionales TLSMRK6 Opera el canal de onda MZK7 solo los detectores que la solicitudMKK8 sus señales garantizanMGK9 actualiza el vector de sesiónMDK10 las notas contra el almacén de reputaciónM GK11 y devolve un veredictoMTK12

DetectBatch Run multiple requests sequentially. Used for log replay and offline analysis

RenderWidget acepta una cadena de plantilla líquida, un veredicto opcionalM SK1 y una clave- mapa de valor de las variables adicionales , luego reproduce el servidor de plantillaMSC4 lado y devolve HTMLMNK5 Así se producen los bots no NETMST6MSP7 que conocen HTML sin crear un proceso de reproducción separadoMSV8 detalles en la sección RenderWidget de abajoMSR9

¿Qué ocurre dentro de una llamada Detect?

Un glossario rápido antes del diagrama, ya que estos nombres aparecerán:

  • **El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico.**El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. request.ip.is_datacenter, detection.useragent.confidence). Los detectores le escriben señales; los detectores posteriores en la misma onda los leeM SK2 vive sólo durante la duración de una peticiónMSC3 Raw PII (IPMNK5 String UAMRK6 permanece en el contexto de la solicitud y nunca aterriza en la tabla de telas.
  • **El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.**El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. HttpContext el servicio gRPC se construye a partir de los campos de demanda protórica. El motor de detección fue diseñado para ASP.NET middleware y espera leer desde HttpContext; sintetizar uno permite que el mismo motor funcione inalterado dentro de un llamamiento gRPC
  • El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. / **El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.**El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
sequenceDiagram
    participant GW as Gateway (Caddy)
    participant SD as gRPC Service
    participant ORC as BlackboardOrchestrator
    participant DET as Detectors (up to 49, 4 waves)
    participant DB as SQLite

    GW->>SD: Detect RPC { method, path, headers, remoteIp }
    SD->>ORC: DetectAsync(syntheticHttpContext)
    ORC->>DET: Wave 0 - Identity + ContentSequence
    ORC->>DET: Wave 1 - Fast path <1ms: UA, Header, IP, Heuristic ...
    ORC->>DET: Wave 2 - Session vectors, Behavioural waveform
    ORC->>DET: Wave 3 - Slow path: DNS, advanced fingerprinting
    DET-->>ORC: DetectionContributions (signals, confidence deltas)
    ORC->>DB: update session vector and reputation score
    DB-->>ORC: ok
    ORC-->>SD: AggregatedEvidence { botProbability, riskBand, ... }
    SD-->>GW: DetectResponse { isBot, riskBand, recommendedAction, ... }

La totalidad del pipeline se ejecuta dentro de la llamada única gRPC. No hay trabajo asinc después de que la respuesta regrese.

El SDK Go

El código de entrada en Go no puede importar el ASP.NET sidecarM SK1 Lo que puede hacer es llamarlo a través del gRPC. El SDK Go (github.com/scottgal/stylobot-go) proporciona una interfaz tipificadora que oculta completamente los tipos de protobuf generados de los llamadas.

Por qué el SDK oculta los tipos de protobuf

Protobuf-el código generado es verboso y tiene una API inusual. Las enmiendas son representadas como integersM SK2 Las cadenas vienen como nombres de enum proto cruo (RISK_BAND_HIGHEl Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. "High"). Los nombres de campos son camelCase en algunos generadores y espada_case en otrosM SK2 Exposición de los tipos de proto en su API público significa que sus llamadas tienen que entender todo esto

El SDK traduce una vez en la frontera (enums de proto a cadenas canónicasM SK1structos de proto al simple Structures de Go ) y los llamadores nunca lo ven.

// the only interface you depend on: no proto imports required
type Client interface {
    Detect(ctx context.Context, req DetectRequest) (*Verdict, error)
    DetectBatch(ctx context.Context, reqs []DetectRequest) ([]*Verdict, error)
    RenderWidget(ctx context.Context, req RenderRequest) (*RenderResponse, error)
    Close() error
}

DetectRequest El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Verdict son estructuras simples de Go:

type DetectRequest struct {
    Method   string
    Path     string
    Headers  map[string]string
    RemoteIP string
    Protocol string  // "http" or "https"; defaults to "https" if empty
    TLS      *TLSInfo
}

type Verdict struct {
    IsBot             bool
    BotProbability    float32
    Confidence        float32
    BotType           string   // "AiBot", "Scraper", "GoodBot", ...
    BotName           string
    RiskBand          string   // "VeryLow", "Low", "Elevated", "Medium", "High", "VeryHigh"
    RecommendedAction string   // "Allow", "Throttle", "Challenge", "Block"
    ThreatScore       float32
    ThreatBand        string
    ProcessingTimeMs  float32
    DetectorsRun      int32
    Reasons           []Reason
}

Crear un cliente y ejecutar la detección:

import (
    stylobot "github.com/scottgal/stylobot-go"
    "context"
    "time"
)

client, err := stylobot.NewClient(
    "localhost:5090",
    stylobot.WithTimeout(50 * time.Millisecond),
    stylobot.WithAPIKey(os.Getenv("SB_API_KEY")),
)
if err != nil {
    log.Fatal(err)
}
defer client.Close()

verdict, err := client.Detect(ctx, stylobot.DetectRequest{
    Method:   r.Method,
    Path:     r.URL.RequestURI(),
    RemoteIP: r.RemoteAddr,
    Headers:  extractHeaders(r),
    Protocol: "https",
})
if err != nil {
    // fail open: log and continue
    log.Printf("stylobot detect failed: %v", err)
    return next(w, r)
}

if verdict.RecommendedAction == "Block" {
    http.Error(w, "Forbidden", http.StatusForbidden)
    return
}

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

grpc.NewClient crea un canal cliente pero no establece una conexión TCP inmediatamente. La conexión se produce en la primera llamada RPC. Esto significa que su proceso de puerta de entrada comienza con éxito incluso si el coche lateral todavía no ha empezadoM SK2 La primera petición después del inicio puede fracasar MSC3y debería ser tratada con fracasoMST4openMst5 pero cada petición posterior funciona normalmente una vez que el coche secundario esté en marchaM st6

Esto es distinto de los clientes HTTP, donde normalmente se conecta en la creación gRPC Documentación para ir El equipo de propiedad de los contingentes de las Naciones Unidas en el Líbano (UNMIL) y la Misión de Administración Provisional de las Forces nouvelles (UNMIK) se encargan de prestar apoyo logístico a las operaciones de mantenimiento de la paz.

El Presidente (habla en inglés): De conformidad con el entendimiento alcanzado en las consultas previas del Consejo, consideraré que la Asamblea General desea concluir su examen de este tema del programa.

WithTimeout El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. NewClient fija un plazo de llamada por - por defecto aplicado dentro de cada Detect call. Si su código de llamada M SK1o medioware como el plugin Caddy) deja de derivar un plazo - contexto limitado de la solicitud encomiableMSC4 el SDK aplica cualquiera que sea el plazo que expire primeroMNK5 Cuando el plugin caddy está en usoMRK6 el plugin posee el plazo |50ms | ; usted puede omitirlo WithTimeout El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. NewClient y dejar que el plugin lo controle. Para usar standalone (un handler llamando directamente al SDKM SK2 ponerlo en NewClient El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El plugin Caddy

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. es un servidor web basado en Go- y proxy inversa con HTTPS automatizado. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. para construir un binario Caddy personalizado que incluya sus plugins, produciendo un único auto-contenido binario sin dependencia de tiempo de ejecución en las bibliotecas compartidasM SK2 Esto es diferente del sistema de módulos dinámicos nginx '.so archivos cargados en tiempo de ejecución). Plugin StyloBot (github.com/scottgal/caddy-stylobot) registra un handler de middleware que llama el Go SDK en cada solicitud.

La configuración de Caddyfile:

{
    order stylobot before respond
}

:80 {
    stylobot {
        endpoint localhost:5090   # gRPC host:port of the sidecar
        timeout   50ms            # per-request deadline; fails open on expiry
        # on_block 503            # optional: change the block status code (default: 403)
    }
    reverse_proxy upstream:3000
}

El plugin injecta nueve encabezamientos de sentencia en cada solicitud enviada:

El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. |---|---| | X-StyloBot-IsBot | isBot El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. | X-StyloBot-Probability | botProbability (0.0-1.0) | | X-StyloBot-Confidence | confidence (0.0-1.0) | | X-StyloBot-BotType El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. AiBot, Scraper, GoodBot | | X-StyloBot-BotName El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. GPTBot, Googlebot | | X-StyloBot-RiskBand | VeryLow ... VeryHigh | | X-StyloBot-Action | Allow / Throttle / Challenge / Block | | X-StyloBot-ThreatScore El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. | X-StyloBot-ThreatBand | None ... Critical |

El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. isBot=true El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Action=Block se paran en la puerta con un 403 y nunca llegar al upstream. Todo el resto (incluyendo los bots con un Throttle El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Challenge ii) En el párrafo 2 de la parte dispositiva del proyecto de resolución A/C.3/60/L.32, la Asamblea General pidió al Secretario General que le presentara un informe sobre los progresos realizados en la aplicación de las recomendaciones contenidas en su resolución 60/251;

on_block cambia el código de estado usado cuando la puerta bloquea (defaultM SK1 403). Seta on_block 503 para suprimir la lógica de retry en los scrapers que tratan 403 como retryable.

¿Qué hace el medioware en cada solicitud?

flowchart TD
    classDef input fill:none,stroke:#3b82f6,stroke-width:2px
    classDef async fill:none,stroke:#a855f7,stroke-width:2px
    classDef good fill:none,stroke:#22c55e,stroke-width:2px

    A["1. Strip inbound X-StyloBot-* headers"]:::input
    B["2. context.WithTimeout(r.Context(), 50ms)"]:::input
    C["3. sbClient.Detect(ctx, DetectRequest)"]:::async
    D{error?}
    E["log warn - fail open<br/>forward unchanged"]:::good
    F["4. injectHeaders<br/>X-StyloBot-IsBot, Probability, Confidence,<br/>BotType, BotName, RiskBand, Action,<br/>ThreatScore, ThreatBand"]:::input
    I["next.ServeHTTP - forward to upstream<br/>with all verdict headers injected"]:::good

    A --> B --> C --> D
    D -->|yes| E --> I
    D -->|no| F --> I

El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. X-StyloBot-* los nombres de los encabezamientos podría auto-injetar un fallo favorable y tener que sobrevivir el fracaso-pace abiertoM SK2El retiro de ellos primero significa que el fallo que se ve en el upstream siempre vino de la autopista sidecar .

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. r.Context() El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. context.WithTimeout El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. context.WithDeadline El Grupo de Trabajo tal vez desee tomar nota de que el párrafo 1 del artículo 2 de la Convención sobre los Derechos del Niño relativo a la venta de niños, la prostitución infantil y la utilización de niños en la pornografía dispone que: r.Context() El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. context.Background() es el punto clave: si el cliente desconecta antes de que termine la llamada gRPC, la cancelación se propaga y la autopista interrumpe el procesamiento antesM SK2

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. X-StyloBot-* headers. Los encabezamientos se configuran antes del control de bloqueo, para que el upstream los lea a través styloBotMiddleware({ mode: 'headers' }) Para todas las solicitudes no bloqueadas-Requests where isBot=true El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. recommendedAction=Block Se le devolverá como 403 en la puerta de entrada; todo lo demás se avanza con los encabezamientos completos del veredicto adjuntosM SK2

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

// from sdk/caddy/stylobot.go
func (s *StyloBot) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error {
    for _, name := range stylobotHeaders {
        r.Header.Del(name)
    }

    ctx, cancel := context.WithTimeout(r.Context(), s.timeout)
    defer cancel()

    verdict, err := s.sbClient.Detect(ctx, sb.DetectRequest{
        Method:   r.Method,
        Path:     r.URL.RequestURI(),
        RemoteIP: ExtractIP(r),
        Protocol: r.Proto,
        Headers:  ExtractHeaders(r),
    })
    if err != nil {
        s.logger.Warn("stylobot detect failed, failing open", zap.Error(err))
        return next.ServeHTTP(w, r)
    }

    injectHeaders(r, verdict)

    if verdict.IsBot && s.OnBlock > 0 && verdict.RecommendedAction == "Block" {
        http.Error(w, "Forbidden", s.OnBlock)
        return nil
    }
    return next.ServeHTTP(w, r)
}

El Comité recomienda al Estado Parte que incluya en su próximo informe periódico información detallada sobre las medidas adoptadas por el Estado parte para combatir la discriminación racial.

Las plugins Caddy deben ser compilados en el binario usando El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.. El Dockerfile en las pruebas de integración muestra el patrón:

# from tests/integration/caddy-sidecar/Dockerfile
FROM caddy:2-builder AS builder

WORKDIR /build
COPY sdk/caddy/ caddy-plugin/
COPY sdk/go/    go/

WORKDIR /build/caddy-plugin

RUN xcaddy build \
    --with github.com/scottgal/caddy-stylobot=/build/caddy-plugin \
    --with github.com/scottgal/stylobot-go=/build/go

FROM caddy:2
COPY --from=builder /build/caddy-plugin/caddy /usr/bin/caddy
COPY tests/integration/caddy-sidecar/Caddyfile /etc/caddy/Caddyfile

La Directiva de sustitución xcaddy

El plugin's go.mod El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

replace github.com/scottgal/stylobot-go => ../go

Esto indica a la cadena de herramientas Go " cuando usted ve stylobot-go, usar el directorio local en lugar de extraer del proxy del módulo." Funciona para go build El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. go test en el directorio de plugins.

xcaddy crea un nuevo módulo temporal de Go para su construcción. Este módulo no inherirá. replace directrices del plugin's go.modEl Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. --with argument, xcaddy intentaría descargar stylobot-go El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. pkg.go.dev El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. --with module=path Argumento es el equivalente nativo de xcaddy's a un replace directive: mapiza el camino de un módulo a un directorio local en el momento de construirM SK1 Ambos módulos locales deben tener un nombre explícito.

RenderWidget: Templates líquidos sobre gRPC

RenderWidget es un gRPC RPC en la autopista que acepta una cadena de plantilla líquida, la reproduce con el contexto de detecciónM SK1 y devolve HTML. Esto permite a cualquier llamadar (Ga proxyMSC4 Layer SSR del nodoMNK5 Línea de paquetes de pachadasMST6 producir botM ST7aware HTML sin ejecutar un proceso de reproducción separadoM st8

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. es un lenguaje de templación creado por Shopify, usado por los temas Shopified, JekyllM SK2 Pages GitHub , y muchos otros sistemasMSC4 Sus propiedades claveMST5 seguro para ejecutar con el usuarioMSSK6 plantillas suministradas MSP7no ejecución arbitraria de códigoMSV8 sencillo suficiente para que los desarrolladores que no sonMSR9 no escribanMSL10 y bien entendidosMSS11 StyloBot utiliza El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer., una alta -performencia .implementación NET de Liquid, para render servidores de plantillas

El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el párrafo 6 supra.

// from src/Mostlylucid.BotDetection.Sidecar/Services/DetectionGrpcService.cs
private static readonly FluidParser Parser = new();  // static, shared, compiled templates cached

public override async Task<Proto.RenderWidgetResponse> RenderWidget(
    Proto.RenderWidgetRequest request, ServerCallContext context)
{
    if (!Parser.TryParse(request.Template, out var template, out var error))
        return new Proto.RenderWidgetResponse { Success = false, Error = error };

    var ctx = new TemplateContext();
    if (request.Verdict is { } v)
    {
        ctx.SetValue("isBot",             v.IsBot);
        ctx.SetValue("botProbability",    (double)v.BotProbability);
        ctx.SetValue("botType",           v.BotType);
        ctx.SetValue("botName",           v.BotName);
        ctx.SetValue("riskBand",          v.RiskBand.ToString());
        ctx.SetValue("recommendedAction", v.RecommendedAction.ToString());
        ctx.SetValue("threatScore",       (double)v.ThreatScore);
        ctx.SetValue("threatBand",        v.ThreatBand.ToString());
    }
    foreach (var kv in request.Vars)
        ctx.SetValue(kv.Key, kv.Value);

    var html = await template.RenderAsync(ctx);
    return new Proto.RenderWidgetResponse { Html = html, Success = true };
}

Fluid.Core mantiene un archivo de plantilla compilado internoM SK1 Rendimientos repetidos de la misma cadena de plantilla saltar re-parsingMSC3 El FluidParser es estático y compartido en todos los llamamientos gRPC.

El Consejo de Seguridad reanudó el examen del tema sin proceder a votación. StyloBotGrpcClient.renderWidget() ejemplo y la referencia completa de la variable template están en el Artículo de TypeScript SDK.

Se llama desde Go:

rendered, err := client.RenderWidget(ctx, stylobot.RenderRequest{
    Template: `{% if isBot %}<p class="warning">Bot: {{ botType }}</p>{% endif %}`,
    Verdict:  verdict,
    Vars:     map[string]string{"locale": "en-GB"},
})
if err == nil && rendered.Success {
    fmt.Fprint(w, rendered.HTML)
}

La sintaxis de la plantilla es idéntica si llamas RenderWidget De Go, Node, o usar <sb-widget> en el navegador: la misma máquina líquida, los mismos nombres de variablesM SK2 el mismo camino de rendering .

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

graph LR
    classDef input fill:none,stroke:#3b82f6,stroke-width:2px
    classDef async fill:none,stroke:#a855f7,stroke-width:2px
    classDef good fill:none,stroke:#22c55e,stroke-width:2px
    classDef store fill:none,stroke:#f59e0b,stroke-width:2px

    INT([Internet])
    CF["Cloudflare<br/>Tunnel / CDN"]
    CA["Caddy<br/>+ caddy-stylobot"]:::input
    SD["StyloBot Sidecar<br/>:5090 gRPC  ·  :5091 REST"]:::async
    WEB["Upstream App<br/>Node / Go / ASP.NET"]:::good
    DB[("SQLite<br/>sessions · reputation")]:::store

    INT --> CF --> CA
    CA -->|"gRPC Detect<br/>≤50ms"| SD
    SD <-->|"persist"| DB
    CA -->|"X-StyloBot-* headers"| WEB
    WEB -->|"/_stylobot/partials/render<br/>(widget rendering)"| SD

La aplicación ascendente llama directamente al sidecar para la rendering de widgets, pasar por la puerta de entrada. La rendering del widget necesita el contexto de verdicto completo y ocurre después de que la solicitud haya pasado ya la detección de la entrada , por lo que no hay duplicación de deteción de detectionM SK3

En el párrafo 2 de la parte dispositiva del proyecto de resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación de las recomendaciones formuladas por la Comisión Consultiva en Asuntos Administrativos y de Presupuesto.

Caddy plugin, Node middleware, y Go SDK todos fallan abiertosM SK2 un tiempo de salida o error de la autopista lateral se convierte en un registro de advertencia y una sentencia vacía permisiva , no es MST4xxMSC5 El plazo SST6ms Caddy es una fecha fría MST7marja de seguridad de inicio Mst8 el coste steadyMst9estado en una conexión cálida es \MST10msM st11

El comercio-off esto codifica: bloqueando el tráfico legítimo porque la detección no está disponible es peor que la falta de tráfico de robots durante un fallo del coche secundario .


La serie de lanzamiento continúa. Más puestos sobre los interiores de detección, patronos de despliegueM SK2 observabilidad , y la topología comercial todavía están por venir

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Como se indica en el párrafo 1 del artículo 5 de la Convención sobre los Derechos del Niño, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre hombres y mujeres.El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas y de otra índole..

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.