2013-01-04 2 views
0

suis en train d'implémenter une requête http (GET request) sur la programmation c qui inclut un en-tête d'autorisation mais le problème est que je ne peux pas obtenir le 200 ok, communication (le serveur répond avec l'autorisation 401 requise) mais pas plus que cela.mettre en œuvre l'en-tête d'autorisation http dans c

**while(1){ 

    strcpy(buffer,"GET /mywebsite/login.html/ HTTP1.1 \n\n"); 
    strcat(buffer,"Host: localhost\n\n"); 
    strcat(buffer,"Connection: keep-alive\n\n"); 
    strcat(buffer,"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11\n\n"); 
    strcat(buffer,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8\n\n"); 
    strcat(buffer,"Accept-Encoding: gzip,deflate,sdch\n\n"); 
    strcat(buffer,"Accept-Language: en-US,en;q=0.8\n\n"); 
    strcat(buffer,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\n\n"); 
    status = send(sock, buffer, strlen(buffer), 0); 
    if(status == -1) { 
     printf("Error in send(). Error code: %d\n", WSAGetLastError()); 
     continue; 
    } 
    buffer[0]='\0'; 
    //The receiving functions 
    status = recv(sock, buffer, BUFFER_SIZE, 0); 
    if (status == -1) { 
     printf("Error in recv(). Error code: %d\n", WSAGetLastError()); 
     continue; 
    } 
    buffer[status] = '\0'; 
    printf("The message received is: "); 
    printf("%s\n\n", buffer); 

    strcpy(buffer,"GET /mywebsite/login.html/ HTTP1.1\n\n"); 
    strcat(buffer,"Host: localhost\n\n"); 
    strcat(buffer,"Authorization: Basic QWRtaW46MTIzNA== \n\n"); 
    strcat(buffer,"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11\n\n"); 
    strcat(buffer,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8\n\n"); 
    strcat(buffer,"Accept-Encoding: gzip,deflate,sdch\n\n"); 
    strcat(buffer,"Accept-Language: en-US,en;q=0.8\n\n"); 
    strcat(buffer,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\n\n"); 
    strcat(buffer,"Connection: keep-alive\n\n"); 
    status = send(sock, buffer, strlen(buffer), 0); 
    if(status == -1) { 
     printf("Error in send(). Error code: %d\n", WSAGetLastError()); 
     continue; 
    } 
    buffer[0]='\0'; 
    //The receiving functions 
    status = recv(sock, buffer, BUFFER_SIZE, 0); 
    if (status == -1) { 
     printf("Error in recv(). Error code: %d\n", WSAGetLastError()); 
     continue; 
    } 
    buffer[status] = '\0'; 
    printf("%s\n\n", buffer); 
    buffer[0]='\0'; 

}** 

la première tête est envoyé avec succès, mais l'en-tête suivant où le serveur ne rien faire garder (pas de réponse) plaît peu d'aide ici je n'ai pas la moindre idée de ce que le problème est ... :(

+0

Vous devez vous assurer que vous pouvez effectuer la demande manuellement (c'est-à-dire écrire manuellement les requêtes HTTP). Puis comparez-les au texte que votre code produit. –

+0

Et si cela fonctionne, essayez d'utiliser un outil comme Fiddler pour voir le trafic. – Pete

Répondre

2

Il y a des problèmes évidents.

  • en-têtes doivent être séparés par "\ r \ n", pas "\ n \ n", se terminant finalement avec "\ r \ n \ r \ n"
  • send et recv devrait b e réitéra sur errno == EINTR
  • send peut envoyer moins d'octets que demandé, il doit donc être utilisé dans une boucle pour s'assurer que toutes les données sont transférées.
+0

Et le code doit s'assurer que le serveur a maintenu la connexion en vie comme vous le souhaitez. – Codo

+0

Suis les gens très reconnaissants j'ai fait des cauchemars à cause de ce programme, et voyant que (200 ok) est vraiment un moment de plaisir, merci. – chard

Questions connexes