Configurare gli elaboratori dei messaggi per consentire intestazioni duplicate

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

In base alla specifica HTTP RFC 7230, sezione 3.2.2: ordine dei campi, Apigee Edge prevede che la richiesta HTTP del client o la risposta HTTP del server di backend non contenga la stessa intestazione passata più di una volta con valori uguali o diversi, a meno che l'intestazione specifica non presenti un'eccezione e possa avere duplicati.

Per impostazione predefinita, Apigee Edge consente il trasferimento di duplicati e valori multipli alla maggior parte delle intestazioni HTTP. Tuttavia, non consente alcune intestazioni elencate nella sezione Intestazioni che non possono avere valori duplicati e più valori. Pertanto:

  • Riceverai 400 Bad Request con il codice di errore protocol.http.DuplicateHeader se il client invia una richiesta HTTP con una determinata intestazione più di una volta o con più valori per le intestazioni HTTP che non possono avere duplicati/più valori in Apigee Edge.
  • Analogamente, riceverai 502 Bad Gateway con il codice di errore protocol.http.DuplicateHeader se il server di backend invia una risposta HTTP con una determinata intestazione più di una volta o con più valori per le intestazioni HTTP che non possono avere duplicati o più valori in Apigee Edge

La soluzione consigliata per risolvere questi errori è correggere l'applicazione client e il server di backend in modo che non inviino intestazioni duplicate e rispettare la specifica RFC 7230, sezione 3.2.2: Ordine dei campi, come spiegato nei seguenti playbook per la risoluzione dei problemi:

Tuttavia, in alcuni casi potresti voler aggiungere un'eccezione per includere duplicati e più valori per alcune intestazioni HTTP. In questi casi, puoi consentire intestazioni duplicate e più valori per un'intestazione HTTP specifica impostando una proprietà HTTPHeader.HEADER_NAME a livello di processore di messaggi.

Questo documento fornisce informazioni su questa proprietà, spiega come abilitarla per evitare gli errori menzionati sopra e condivide le best practice relative alla stessa.

Proprietà dell'intestazione HTTP per consentire valori duplicati e multipli

Apigee Edge fornisce le due proprietà seguenti per controllare il comportamento di autorizzazione duplicati e valori multipli per le intestazioni HTTP. Tieni presente che possono essere configurate solo sui processori di messaggi utilizzando la sintassi dei token descritta in Come configurare Edge.

Nome proprietà Descrizione Valori consentiti
HTTPHeader.ANY

Questa proprietà indica se sono consentiti duplicati o più valori per tutte le intestazioni HTTP, comprese le intestazioni personalizzate inviate come parte della richiesta HTTP effettuata dal client o della risposta HTTP inviata dal server di backend ad Apigee Edge.

Valore predefinito:

multivalued, allowDuplicate,

  1. blank: non sono consentiti duplicati e valori multipli per le intestazioni HTTP.
  2. multiValued: suddividi l'intestazione a più valori in più intestazioni. Per le intestazioni HTTP sono consentiti più valori, ma non sono consentiti duplicati. Il valore multiValued è attivato, il che significa che test-header=a,b verrà convertito in test-header=a e test-header=b.
  3. allowDuplicate: consente più intestazioni HTTP (duplicate) con lo stesso nome.
  4. multivalued, allowDuplicate: sono consentiti sia valori multipli sia duplicati per le intestazioni HTTP.

HTTPHeader.HEADER_NAME

Questa proprietà viene utilizzata per eseguire l'override del comportamento di un'intestazione specifica rispetto a quanto specificato da HTTPHeader.ANY

Come l'attributo precedente.

Le intestazioni che non possono avere duplicati e più valori

Come spiegato in precedenza, Apigee Edge consente per impostazione predefinita duplicati e valori multipli per la maggior parte delle intestazioni HTTP. Il motivo è che la proprietà HTTPHeader.ANY è configurata con il valore multivalued, allowDuplicate.

Configurazione sovrascritta

Per alcune intestazioni specifiche, la configurazione predefinita viene sovrascritta utilizzando uno dei seguenti metodi:

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

    Questa configurazione non modifica il comportamento predefinito. In altre parole, l'intestazione specifica può avere più valori e duplicati

    .
  • HTTPHeader.HEADER_NAME=

    Questa configurazione modifica il comportamento predefinito. Ciò significa che l'intestazione specifica non può avere più valori e duplicati.

Determinazione delle intestazioni che non possono avere duplicati e più valori

In questa sezione viene descritto come identificare quanto segue:

  • Le intestazioni specifiche che non possono avere duplicati e valori multipli nella configurazione del cloud privato Apigee Edge
  • Le intestazioni specifiche con configurazione preesistente
  1. Nel computer del processore di messaggi, cerca la proprietà HTTPHeader. nella directory /opt/apigee/edge-message-processor/conf, come mostrato di seguito:

    grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
    

    Esempio di output:

    # grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued
    … <snipped>
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates
    …
    <snipped>
    
  2. Come spiegato nella sezione Configurazione sovrascritta, tieni presente le seguenti informazioni nell'output di esempio riportato sopra:
    1. L'intestazione HTTP Connection viene sovrascritta, ma può avere più valori e duplicati
    2. Le intestazioni HTTP Host e Expires vengono sovrascritte e non possono avere più valori e duplicati
    3. L'intestazione HTTP Date viene sovrascritta e può avere duplicati, ma non può avere più valori
    4. Tutte le intestazioni visualizzate qui (Connection, Host, Expires e Date nell'esempio precedente) sono indicate come intestazioni con config preesistente in questo documento.

Comportamento di Apigee Edge

La tabella seguente descrive il comportamento di Apigee Edge quando le intestazioni vengono inviate come duplicati e con più valori, a seconda di come sono configurate le proprietà HTTPHeader sui processori di messaggi con un esempio HTTPHeader di test-header.

Richiesta HEADER in uscita basate sul valore conf/http.properties+HTTPHeader.test-header=
<Vuoto> allowDuplicate multiValued allowDuplicato, multivalore (PREDEFINITO)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

Internamente, test-header=a,b è stato suddiviso in:

  • test-header=a e
  • test-header=b,

e viene visualizzato l'errore DuplicateHeader.

test‑header=a,b

Internamente, test-header=a,b è stato suddiviso in:

  • test-header=a e
  • test-header=b,

ma poi il modulo originale viene inviato al target.

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b

Prima di iniziare

Prima di utilizzare i passaggi in questo documento, assicurati di comprendere la configurazione delle proprietà per Edge su Cloud privato, descritta in Come configurare Edge.

Configurazione di allowDuplicas e valori multipli per le intestazioni

Come spiegato nelle proprietà dell'intestazione HTTP per consentire duplicati e valori multipli, il valore della proprietà HTTPHeader.ANY = allowDuplicates, multivalued implica che tutte le intestazioni possono avere duplicati e più valori in Apigee Edge. Tuttavia, per alcune intestazioni i cui valori vengono sovrascritti esplicitamente in modo da non consentire intestazioni duplicate o più valori per queste intestazioni utilizzando la proprietà HTTPHeader.HEADER_NAME.

Questa sezione spiega come configurare la proprietà HTTPHeader.HEADER_NAME per consentire duplicati e più valori per qualsiasi intestazione HTTP di questo tipo sui processori di messaggi, utilizzando il token corrispondente in base alla sintassi descritta in Come configurare Edge.

In questa sezione utilizzeremo Expires (e myheader) come intestazione di esempio per la quale vogliamo consentire duplicati e più valori, come spiegato di seguito:

  1. Determina il valore attuale della proprietà HTTPHeaderHEADER_NAME per assicurarti che non sia già abilitato per consentire duplicati e più valori utilizzando il seguente comando:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Ad esempio, se stai cercando di impostare la proprietà per l'intestazione Expires, controlla il valore attuale del token della proprietà HTTPHeader.Expires sul processore di messaggi:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    L'output del comando riportato sopra genera uno dei seguenti errori:

    1. Se viene impostata una proprietà vuota, ciò significa che il valore viene sovrascritto (e si tratta di un'intestazione con config preesistente) in modo da NON consentire intestazioni duplicate e più valori. Ciò significa che non puoi inviare l'intestazione Expires più di una volta come parte della richiesta HTTP o della risposta HTTP ad Apigee.
    2. Non sono presenti hit per la proprietà specifica, quindi il valore non viene sovrascritto (e NON è un'intestazione con config preesistente). Ciò significa che l'intestazione specifica può essere inviata più di una volta (i duplicati sono consentiti) come parte della richiesta HTTP o della risposta HTTP ad Apigee Edge.
    3. La proprietà è impostata con il valore allowDuplicates, multivalued, il che significa che il valore viene sovrascritto in modo esplicito (e si tratta di un'intestazione con config preesistente). Ciò significa che l'intestazione specifica può essere inviata più di una volta (i duplicati sono consentiti) come parte della richiesta HTTP o della risposta HTTP ad Apigee.

    Esempio di output del comando di ricerca:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    

    L'output di esempio riportato sopra mostra che la proprietà HTTPHeader.Expires è impostata su vuota. Ciò significa che la proprietà viene sovrascritta in modo da non consentire valori duplicati o multipli per l'intestazione Expires.

  2. Se noti che la proprietà corrispondente a un'intestazione specifica viene sovrascritta esplicitamente in modo da non consentire valori duplicati o multipli come nell'output di esempio riportato sopra, solo allora segui questi passaggi. Se non viene sovrascritta esplicitamente, salta gli altri passaggi di questa sezione.
  3. Modifica. Se non esiste, puoi crearlo:
    /opt/apigee/customer/application/message-processor.properties
    

    Ad esempio, per aprire il file utilizzando vi, inserisci quanto segue:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Aggiungi una riga nel seguente formato:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
    
  5. Salva le modifiche.
  6. Assicurati che il file delle proprietà sia di proprietà dell'utente apigee. In caso contrario, esegui questo comando:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Riavvia il processore di messaggi:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Per riavviare senza impatto sul traffico, consulta Riavvio in sequenza dei processori di messaggi senza impatto sul traffico.

  8. Se disponi di più processori di messaggi, ripeti i passaggi precedenti su tutti i processori di messaggi.

La verifica dell'intestazione è configurata in modo che abbia duplicati e più valori

Questa sezione spiega come verificare che la proprietà HTTPHeader.HEADER_NAME per un'intestazione specifica sia stata aggiornata correttamente per consentire duplicati nei processori di messaggi.

Utilizzeremo Expires come intestazione di esempio e verificheremo se la proprietà corrispondente HTTPHeader.Expires è stata aggiornata.

Anche se utilizzi il token conf_http_HTTPHeader.Expires per aggiornare il valore sul processore di messaggi, devi verificare se la proprietà effettiva HTTPHeader.Expires è stata impostata con il nuovo valore.

  1. Nel computer del processore di messaggi, cerca la proprietà HTTPHeader.HEADER_NAME nella directory /opt/apigee/edge-message-processor/conf e controlla se è stata impostata con il nuovo valore, come mostrato di seguito:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Ad esempio, se vuoi verificare che la proprietà HTTPHeader.Expires sia impostata con il nuovo valore, esegui questo comando:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Se il nuovo valore viene impostato correttamente per HTTPHeader.HEADER_NAME sul processore di messaggi, il comando riportato sopra mostra il nuovo valore nel file http.properties.
  3. Il risultato di esempio del comando riportato sopra dopo aver configurato allowDuplicates e multiValued è il seguente:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. Nell'output di esempio riportato sopra, tieni presente che la proprietà HTTPHeader.Expires è stata impostata con il nuovo valore allowDuplicates, multiValued in http.properties. Questo indica che il comportamento per consentire duplicati e valori multipli in HTTPHeader è stato configurato correttamente sul processore di messaggi.
  5. Se vedi ancora il vecchio valore per la proprietà HTTPHeader.HEADER_NAME, verifica di aver seguito correttamente tutti i passaggi descritti in Configurare allowDuplicas e più valori per le intestazioni in modo corretto. Se hai saltato qualche passaggio, ripeti correttamente tutti i passaggi.

    Assicurati che i proxy funzionino come previsto, soprattutto se esiste una logica funzionale per recuperare e impostare le intestazioni nel proxy.

  6. Se ancora non riesci a modificare la proprietà, contatta l'assistenza Apigee Edge.

Disattivazione di allowDuplicates per le intestazioni

Questa sezione spiega come configurare la proprietà HTTPHeader.{Headername} in modo da non consentire duplicati e più valori per un'intestazione HTTP specifica sui processori di messaggi, utilizzando il token corrispondente in base alla sintassi descritta in Come configurare Edge.

In questa sezione utilizzeremo Expires (e myheader) come intestazione di esempio per la quale non vogliamo consentire i duplicati, come spiegato di seguito:

  1. Determina il valore attuale della proprietà HTTPHeaderHEADER_NAME per assicurarti che non sia già disabilitato per consentire duplicati e più valori utilizzando il seguente comando:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Ad esempio, se stai cercando di impostare la proprietà per l'intestazione Expires, controlla il valore corrente del token HTTPHeader.Expires della proprietà sul processore di messaggi:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    L'output del comando riportato sopra genera uno dei seguenti errori:

    1. Se la proprietà è impostata su vuota, ciò significa che il valore viene sovrascritto in NOT per consentire più valori e intestazioni duplicate. Ciò significa che non puoi inviare l'intestazione Expires più di una volta come parte della richiesta HTTP o della risposta HTTP ad Apigee.
    2. Non sono presenti hit per la proprietà specifica, quindi il valore non viene sovrascritto e si tratta di un'intestazione NOT con config preesistente. Ciò significa che l'intestazione specifica può essere inviata più di una volta (i duplicati sono consentiti) come parte della richiesta HTTP o della risposta HTTP ad Apigee Edge.
    3. Se la proprietà è impostata con il valore allowDuplicates, multivalued, il valore viene sovrascritto in modo esplicito e si tratta di una configurazione esistente. Tuttavia, ciò significa che l'intestazione specifica può essere inviata più di una volta (i duplicati sono consentiti) come parte della richiesta HTTP o della risposta HTTP ad Apigee.

    Output di esempio n. 1

    Output di esempio n. 1 del comando di ricerca:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    

    L'output di esempio mostra che la proprietà HTTPHeader.Expires è impostata su allowDuplicates, multiValued. Ciò significa che la proprietà viene sovrascritta per consentire valori duplicati o multipli per l'intestazione Expires.

    Output di esempio n. 2

    Comando di esempio e output n. 2 del comando di ricerca

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    L'output di esempio non mostra alcun output, il che significa che la proprietà HTTPHeader.myheader è impostata su allowDuplicates, multiValued per impostazione predefinita. Ciò implica anche che la proprietà non viene sovrascritta per l'intestazione myheader,

  2. Se noti uno dei seguenti problemi, esegui gli altri passaggi di questa sezione:
    1. La proprietà corrispondente all'intestazione specifica viene sovrascritta per consentire duplicati e più valori come nell'output di esempio n. 1 sopra (intestazione con configurazione preesistente)
    2. Non esistono hit per la proprietà corrispondente all'intestazione specifica, come nell'output di esempio n. 2 riportato sopra (non un'intestazione con config preesistente)

    In caso contrario, ignora gli altri passaggi di questa sezione.

  3. Modifica il seguente file. Se non esiste, puoi crearlo.
    /opt/apigee/customer/application/message-processor.properties
    

    Ad esempio, per aprire il file utilizzando vi, inserisci quanto segue:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Aggiungi una linea nel seguente formato al file delle proprietà:

    Configurazione preesistente

    Scenario 1: intestazione con configurazione preesistente:

    conf_http_HTTPHeader.Expires=
    

    Nessuna configurazione preesistente

    Scenario 2: nessuna intestazione con una configurazione preesistente:

    conf/http.properties+HTTPHeader.myheader=
    
  5. Salva le modifiche.
  6. Assicurati che il file delle proprietà sia di proprietà dell'utente apigee. In caso contrario, esegui questo comando:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Riavvia il processore di messaggi:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Per riavviare senza impatto sul traffico, consulta Riavvio in sequenza dei processori di messaggi senza impatto sul traffico.

  8. Se disponi di più processori di messaggi, ripeti i passaggi precedenti su tutti i processori di messaggi.

La verifica dell'intestazione è configurata in modo da non consentire duplicati e più valori

Questa sezione spiega come verificare che la proprietà HTTPHeader.HEADER_NAME per un'intestazione specifica sia stata aggiornata correttamente per non consentire duplicati nei processori di messaggi.

Utilizzeremo Expires (e myheader) come intestazione di esempio e verificheremo se la proprietà corrispondente HTTPHeader.Expires (e HTTPHeader.myheader) è stata aggiornata.

  1. Sul computer del processore di messaggi, cerca la proprietà HTTPHeader.HEADER_NAME nella directory /opt/apigee/edge-message- processor/conf e controlla se è stata impostata con il nuovo valore, come mostrato di seguito:

    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Ad esempio, se vuoi verificare che la proprietà HTTPHeader.Expires sia impostata con il nuovo valore, puoi eseguire il comando seguente:

    Configurazione preesistente

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Nessuna configurazione preesistente

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Se il nuovo valore dell'intestazione HTTP viene impostato correttamente per HTTPHeader.HEADER_NAME I nel processore di messaggi, il comando riportato sopra mostra il nuovo valore nel file http.properties.
  3. Il risultato di esempio del comando riportato sopra dopo aver disabilitato allowDuplicates è il seguente:

    Configurazione preesistente

    Scenario n. 1: Scadenza intestazione (intestazione con configurazione preesistente)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    

    Nessuna configurazione preesistente

    Scenario 2: intestazione myheader (non un'intestazione con configurazione preesistente)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. Nell'output di esempio riportato sopra, tieni presente che la proprietà HTTPHeader.Expires ( e HTTPHeader.myheader ) è stata impostata con il nuovo valore {blank} in http.properties. Ciò indica che il comportamento per consentire duplicati e valori multipli per l'intestazione HTTP specifica Expires (e myheader) è stato disabilitato correttamente sul processore di messaggi.
  5. Se vedi ancora il valore precedente per la proprietà HTTPHeader.Expires (or HTTPHeader.myheader), verifica di aver seguito correttamente tutti i passaggi descritti in Configurare allowDuplicates e più valori per le intestazioni. Se hai saltato qualche passaggio, ripeti correttamente tutti i passaggi.

    Assicurati che i proxy funzionino come previsto, soprattutto se esiste una logica funzionale per recuperare e impostare le intestazioni nel proxy.

  6. Se ancora non riesci a modificare la proprietà, contatta l'assistenza Apigee Edge.