Programmazione Web C ++

Cos'è la CGI?

  • Common Gateway Interface, o CGI, è un insieme di standard che definiscono il modo in cui le informazioni vengono scambiate tra il server Web e uno script personalizzato.

  • Le specifiche CGI sono attualmente mantenute dall'NCSA e NCSA definisce CGI come segue:

  • Common Gateway Interface, o CGI, è uno standard per i programmi gateway esterni per interfacciarsi con i server di informazioni come i server HTTP.

  • La versione corrente è CGI / 1.1 e CGI / 1.2 è in fase di elaborazione.

Navigare su Internet

Per comprendere il concetto di CGI, vediamo cosa succede quando facciamo clic su un collegamento ipertestuale per navigare in una particolare pagina web o URL.

  • Il browser contatta il server Web HTTP e richiede l'URL, ad es. nome del file.

  • Il server Web analizzerà l'URL e cercherà il nome del file. Se trova il file richiesto, il server web invia quel file al browser altrimenti invia un messaggio di errore che indica che hai richiesto un file sbagliato.

  • Il browser Web riceve la risposta dal server Web e visualizza il file ricevuto o il messaggio di errore in base alla risposta ricevuta.

Tuttavia, è possibile impostare il server HTTP in modo tale che ogni volta che viene richiesto un file in una determinata directory, quel file non viene restituito; invece viene eseguito come un programma e l'output prodotto dal programma viene rimandato al browser per essere visualizzato.

Common Gateway Interface (CGI) è un protocollo standard per consentire alle applicazioni (chiamate programmi CGI o script CGI) di interagire con i server Web e con i client. Questi programmi CGI possono essere scritti in Python, PERL, Shell, C o C ++ ecc.

Diagramma di architettura CGI

Il seguente semplice programma mostra una semplice architettura di CGI -

Configurazione del server Web

Prima di procedere con la programmazione CGI, assicurati che il tuo server web supporti CGI e che sia configurato per gestire i programmi CGI. Tutti i programmi CGI che devono essere eseguiti dal server HTTP sono conservati in una directory preconfigurata. Questa directory è chiamata directory CGI e per convenzione è chiamata / var / www / cgi-bin. Per convenzione i file CGI avranno l'estensione come.cgi, sebbene siano eseguibili in C ++.

Per impostazione predefinita, Apache Web Server è configurato per eseguire programmi CGI in / var / www / cgi-bin. Se desideri specificare qualsiasi altra directory per eseguire i tuoi script CGI, puoi modificare la sezione seguente nel file httpd.conf:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
   Options All
</Directory>

Qui, presumo che tu abbia il server Web attivo e funzionante con successo e che tu sia in grado di eseguire qualsiasi altro programma CGI come Perl o Shell ecc.

Primo programma CGI

Considera il seguente contenuto del programma C ++:

#include <iostream>
using namespace std;

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - First CGI Program</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! This is my first CGI program</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Compilare il codice sopra e denominare l'eseguibile come cplusplus.cgi. Questo file è conservato nella directory / var / www / cgi-bin e ha il seguente contenuto. Prima di eseguire il programma CGI assicurati di aver cambiato la modalità di utilizzo del filechmod 755 cplusplus.cgi Comando UNIX per rendere eseguibile il file.

Il mio primo programma CGI

Il programma C ++ sopra è un semplice programma che scrive il suo output su un file STDOUT, ad esempio sullo schermo. C'è una caratteristica importante ed extra disponibile che è la stampa in prima lineaContent-type:text/html\r\n\r\n. Questa riga viene rinviata al browser e specifica il tipo di contenuto da visualizzare nella schermata del browser. Ora devi aver compreso il concetto di base di CGI e puoi scrivere molti programmi CGI complicati usando Python. Un programma C ++ CGI può interagire con qualsiasi altro sistema esterno, come RDBMS, per scambiare informazioni.

Intestazione HTTP

La linea Content-type:text/html\r\n\r\nè una parte dell'intestazione HTTP, che viene inviata al browser per comprendere il contenuto. Tutta l'intestazione HTTP avrà la seguente forma:

HTTP Field Name: Field Content
 
For Example
Content-type: text/html\r\n\r\n

Ci sono poche altre importanti intestazioni HTTP, che userete frequentemente nella vostra programmazione CGI.

Suor n Intestazione e descrizione
1

Content-type:

Una stringa MIME che definisce il formato del file restituito. L'esempio è Content-type: text / html.

2

Expires: Date

La data in cui le informazioni diventano non valide. Questo dovrebbe essere utilizzato dal browser per decidere quando una pagina deve essere aggiornata. Una stringa di data valida deve essere nel formato 01 gen 1998 12:00:00 GMT.

3

Location: URL

L'URL che dovrebbe essere restituito al posto dell'URL richiesto. È possibile utilizzare questo file per reindirizzare una richiesta a qualsiasi file.

4

Last-modified: Date

La data dell'ultima modifica della risorsa.

5

Content-length: N

La lunghezza, in byte, dei dati restituiti. Il browser utilizza questo valore per segnalare il tempo di download stimato per un file.

6

Set-Cookie: String

Imposta il cookie passato attraverso la stringa .

Variabili d'ambiente CGI

Tutto il programma CGI avrà accesso alle seguenti variabili d'ambiente. Queste variabili giocano un ruolo importante durante la scrittura di qualsiasi programma CGI.

Suor n Nome e descrizione della variabile
1

CONTENT_TYPE

Il tipo di dati del contenuto, utilizzato quando il client invia il contenuto allegato al server. Ad esempio caricamento di file ecc.

2

CONTENT_LENGTH

La lunghezza delle informazioni sulla query disponibile solo per le richieste POST.

3

HTTP_COOKIE

Restituisce i cookie impostati sotto forma di coppia chiave e valore.

4

HTTP_USER_AGENT

Il campo dell'intestazione della richiesta dell'agente utente contiene informazioni sull'agente utente che ha originato la richiesta. È un nome del browser web.

5

PATH_INFO

Il percorso per lo script CGI.

6

QUERY_STRING

Le informazioni con codifica URL inviate con la richiesta del metodo GET.

7

REMOTE_ADDR

L'indirizzo IP dell'host remoto che effettua la richiesta. Questo può essere utile per la registrazione o per scopi di autenticazione.

8

REMOTE_HOST

Il nome completo dell'host che effettua la richiesta. Se queste informazioni non sono disponibili, è possibile utilizzare REMOTE_ADDR per ottenere l'indirizzo IR.

9

REQUEST_METHOD

Il metodo utilizzato per effettuare la richiesta. I metodi più comuni sono GET e POST.

10

SCRIPT_FILENAME

Il percorso completo dello script CGI.

11

SCRIPT_NAME

Il nome dello script CGI.

12

SERVER_NAME

Il nome host o l'indirizzo IP del server.

13

SERVER_SOFTWARE

Il nome e la versione del software in esecuzione sul server.

Ecco un piccolo programma CGI per elencare tutte le variabili CGI.

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV[ 24 ] = {
   "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
   "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
   "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
   "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
   "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
   "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
   "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
   "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
   "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI Environment Variables</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ ) {
      cout << "<tr><td>" << ENV[ i ] << "</td><td>";
      
      // attempt to retrieve value of environment variable
      char *value = getenv( ENV[ i ].c_str() );  
      if ( value != 0 ) {
         cout << value;                                 
      } else {
         cout << "Environment variable does not exist.";
      }
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Libreria CGI C ++

Per esempi reali, dovresti fare molte operazioni con il tuo programma CGI. Esiste una libreria CGI scritta per il programma C ++ che puoi scaricare da ftp://ftp.gnu.org/gnu/cgicc/ e seguire i passaggi per installare la libreria -

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

Puoi controllare la documentazione correlata disponibile in 'C ++ CGI Lib Documentation .

Metodi GET e POST

Devi esserti imbattuto in molte situazioni in cui hai bisogno di passare alcune informazioni dal tuo browser al server web e, infine, al tuo programma CGI. La maggior parte delle volte il browser utilizza due metodi per passare queste informazioni al server web. Questi metodi sono il metodo GET e il metodo POST.

Passaggio di informazioni utilizzando il metodo GET

Il metodo GET invia le informazioni utente codificate aggiunte alla richiesta della pagina. La pagina e le informazioni codificate sono separate dal? carattere come segue -

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

Il metodo GET è il metodo predefinito per passare le informazioni dal browser al server web e produce una lunga stringa che appare nella casella Posizione: del browser. Non utilizzare mai il metodo GET se si dispone di password o altre informazioni riservate da passare al server. Il metodo GET ha limiti di dimensione e puoi passare fino a 1024 caratteri in una stringa di richiesta.

Quando si utilizza il metodo GET, le informazioni vengono passate utilizzando l'intestazione http QUERY_STRING e saranno accessibili nel programma CGI tramite la variabile d'ambiente QUERY_STRING.

Puoi passare le informazioni semplicemente concatenando coppie di chiavi e valori insieme a qualsiasi URL oppure puoi utilizzare i tag HTML <FORM> per passare le informazioni utilizzando il metodo GET.

Esempio di URL semplice: metodo Get

Ecco un semplice URL che passerà due valori al programma hello_get.py utilizzando il metodo GET.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Di seguito è riportato un programma da generare cpp_get.cgiProgramma CGI per gestire l'input fornito dal browser web. Useremo la libreria C ++ CGI che rende molto facile accedere alle informazioni passate -

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "First name: " << **fi << endl;  
   } else {
      cout << "No text entered for first name" << endl;  
   }
   
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "Last name: " << **fi << endl;  
   } else {
      cout << "No text entered for last name" << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Ora, compila il programma sopra come segue:

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Genera cpp_get.cgi e mettilo nella tua directory CGI e prova ad accedere usando il seguente link -

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Questo genererebbe il seguente risultato:

First name: ZARA 
Last name: ALI

Esempio di FORM semplice: metodo GET

Ecco un semplice esempio che trasmette due valori utilizzando HTML FORM e il pulsante di invio. Useremo lo stesso script CGI cpp_get.cgi per gestire questo input.

<form action = "/cgi-bin/cpp_get.cgi" method = "get">
   First Name: <input type = "text" name = "first_name">  <br />
 
   Last Name: <input type = "text" name = "last_name" />
   <input type = "submit" value = "Submit" />
</form>

Ecco l'output effettivo del modulo sopra. Immettere Nome e Cognome e quindi fare clic sul pulsante Invia per vedere il risultato.

Passaggio di informazioni utilizzando il metodo POST

Un metodo generalmente più affidabile per passare informazioni a un programma CGI è il metodo POST. Questo impacchetta le informazioni esattamente allo stesso modo dei metodi GET, ma invece di inviarle come stringa di testo dopo un? nell'URL lo invia come messaggio separato. Questo messaggio arriva nello script CGI sotto forma di input standard.

Lo stesso programma cpp_get.cgi gestirà anche il metodo POST. Prendiamo lo stesso esempio di cui sopra, che passa due valori utilizzando HTML FORM e il pulsante di invio ma questa volta con il metodo POST come segue:

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br />
   Last Name: <input type = "text" name = "last_name" />
 
   <input type = "submit" value = "Submit" />
</form>

Ecco l'output effettivo del modulo sopra. Immettere Nome e Cognome e quindi fare clic sul pulsante Invia per vedere il risultato.

Passaggio dei dati della casella di controllo al programma CGI

Le caselle di controllo vengono utilizzate quando è necessario selezionare più di un'opzione.

Ecco un esempio di codice HTML per un modulo con due caselle di controllo:

<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on" /> Maths
   <input type = "checkbox" name = "physics" value = "on" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Il risultato di questo codice è il seguente modulo:

Di seguito è riportato il programma C ++, che genererà lo script cpp_checkbox.cgi per gestire l'input fornito dal browser Web tramite il pulsante della casella di controllo.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Checkbox Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   } else {
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   } else {
      cout << "Physics Flag: OFF " << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Passaggio dei dati del pulsante di opzione al programma CGI

I pulsanti di opzione vengono utilizzati quando è necessario selezionare una sola opzione.

Ecco un esempio di codice HTML per un modulo con due pulsanti di opzione:

<form action = "/cgi-bin/cpp_radiobutton.cgi" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" checked = "checked"/> Maths 
   <input type = "radio" name = "subject" value = "physics" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Il risultato di questo codice è il seguente modulo:

Di seguito è riportato il programma C ++, che genererà lo script cpp_radiobutton.cgi per gestire l'input fornito dal browser Web tramite i pulsanti di opzione.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Radio Button Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Passaggio dei dati dell'area di testo al programma CGI

L'elemento TEXTAREA viene utilizzato quando è necessario passare del testo su più righe al programma CGI.

Ecco un esempio di codice HTML per un modulo con una casella TEXTAREA -

<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit" />
</form>

Il risultato di questo codice è il seguente modulo:

Di seguito è riportato il programma C ++, che genererà lo script cpp_textarea.cgi per gestire l'input fornito dal browser Web tramite l'area di testo.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Text Area Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   } else {
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Passaggio dei dati della casella a discesa al programma CGI

La casella a discesa viene utilizzata quando abbiamo molte opzioni disponibili ma ne verranno selezionate solo una o due.

Ecco un esempio di codice HTML per un modulo con una casella a discesa:

<form action = "/cgi-bin/cpp_dropdown.cgi" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   
   <input type = "submit" value = "Submit"/>
</form>

Il risultato di questo codice è il seguente modulo:

Di seguito è riportato il programma C ++, che genererà lo script cpp_dropdown.cgi per gestire l'input fornito dal browser Web tramite la casella a discesa.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Drop Down Box Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Utilizzo dei cookie in CGI

Il protocollo HTTP è un protocollo senza stato. Ma per un sito web commerciale è necessario mantenere le informazioni sulla sessione tra le diverse pagine. Ad esempio, la registrazione di un utente termina dopo aver completato molte pagine. Ma come mantenere le informazioni sulla sessione dell'utente in tutte le pagine web.

In molte situazioni, l'utilizzo dei cookie è il metodo più efficiente per ricordare e tracciare preferenze, acquisti, commissioni e altre informazioni necessarie per una migliore esperienza dei visitatori o statistiche del sito.

Come funziona

Il tuo server invia alcuni dati al browser del visitatore sotto forma di cookie. Il browser può accettare il cookie. In caso affermativo, viene archiviato come record di testo normale sul disco rigido del visitatore. Ora, quando il visitatore arriva a un'altra pagina del tuo sito, il cookie è disponibile per il recupero. Una volta recuperato, il tuo server sa / ricorda cosa è stato memorizzato.

I cookie sono un record di dati di testo semplice di 5 campi di lunghezza variabile -

  • Expires- Mostra la data di scadenza del cookie. Se questo è vuoto, il cookie scadrà quando il visitatore chiude il browser.

  • Domain - Questo mostra il nome di dominio del tuo sito.

  • Path- Questo mostra il percorso della directory o della pagina web che ha impostato il cookie. Questo può essere vuoto se desideri recuperare il cookie da qualsiasi directory o pagina.

  • Secure- Se questo campo contiene la parola "secure", il cookie può essere recuperato solo con un server sicuro. Se questo campo è vuoto, non esiste alcuna restrizione di questo tipo.

  • Name = Value - I cookie vengono impostati e recuperati sotto forma di coppie chiave e valore.

Impostazione dei cookie

È molto semplice inviare cookie al browser. Questi cookie verranno inviati insieme all'intestazione HTTP prima dell'archiviazione del tipo di contenuto. Supponendo che si desideri impostare UserID e Password come cookie. Quindi l'impostazione dei cookie verrà eseguita come segue

#include <iostream>
using namespace std;

int main () {
   cout << "Set-Cookie:UserID = XYZ;\r\n";
   cout << "Set-Cookie:Password = XYZ123;\r\n";
   cout << "Set-Cookie:Domain = www.tutorialspoint.com;\r\n";
   cout << "Set-Cookie:Path = /perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "Setting cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Da questo esempio, devi aver capito come impostare i cookie. Noi usiamoSet-Cookie Intestazione HTTP per impostare i cookie.

Qui è facoltativo impostare gli attributi dei cookie come Expires, Domain e Path. È da notare che i cookie vengono impostati prima dell'invio di magic line"Content-type:text/html\r\n\r\n.

Compila il programma sopra per produrre setcookies.cgi e prova a impostare i cookie usando il seguente link. Imposterà quattro cookie sul tuo computer:

/cgi-bin/setcookies.cgi

Recupero dei cookie

È facile recuperare tutti i cookie impostati. I cookie sono memorizzati nella variabile d'ambiente CGI HTTP_COOKIE e avranno la seguente forma.

key1 = value1; key2 = value2; key3 = value3....

Ecco un esempio di come recuperare i cookie.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main () {
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // get environment variables
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
   cci != env.getCookieList().end(); 
   ++cci ) {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Ora, compila il programma sopra per produrre getcookies.cgi e prova a ottenere un elenco di tutti i cookie disponibili sul tuo computer -

/cgi-bin/getcookies.cgi

Questo produrrà un elenco di tutti e quattro i cookie impostati nella sezione precedente e di tutti gli altri cookie impostati nel tuo computer -

UserID XYZ 
Password XYZ123 
Domain www.tutorialspoint.com 
Path /perl

Esempio di caricamento di file

Per caricare un file, il modulo HTML deve avere l'attributo enctype impostato su multipart/form-data. Il tag di input con il tipo di file creerà un pulsante "Sfoglia".

<html>
   <body>
      <form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi"
         method = "post">
         <p>File: <input type = "file" name = "userfile" /></p>
         <p><input type = "submit" value = "Upload" /></p>
      </form>
   </body>
</html>

Il risultato di questo codice è il seguente modulo:

Note- L'esempio sopra è stato disabilitato intenzionalmente per impedire alle persone di caricare file sul nostro server. Ma puoi provare il codice sopra con il tuo server.

Ecco il copione cpp_uploadfile.cpp per gestire il caricamento dei file -

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main () {
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>File Upload in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // get list of files to be uploaded
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // send data type at cout.
      cout << HTTPContentHeader(file->getDataType());
      // write content at cout.
      file->writeToStream(cout);
   }
   cout << "<File uploaded successfully>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

L'esempio sopra è per scrivere contenuti su cout stream, ma puoi aprire il flusso di file e salvare il contenuto del file caricato in un file nella posizione desiderata.

Spero che questo tutorial ti sia piaciuto. Se sì, inviaci il tuo feedback.