Requête HTTP GET Impossible
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Requête HTTP GET Impossible



  1. #1
    Vykernes

    Requête HTTP GET Impossible


    ------

    Bonjour,

    j'essaie actuellement d'effectuer une requête GET vers un serveur web. J'arrive à demander la page à partir de mon navigateur (firefox), mais pas depuis mon application.

    Le lien de la page que j'essaie d'obtenir est situé en bas de cette page: https://data.explore.star.fr/explore...ssages-tr/api/
    La page en question que j'essaie d'obtenir : https://data.explore.star.fr/api/rec...acet=precision

    Il s'agit d'une page html contenant un code JSON (formatage de données avec balise). Le service est https.

    Depuis mon application client, je contact donc le serveur data.explore.star.fr sur le port 443 (https), puis j'effectue une commande send contenant la chaîne suivante :
    Code:
    char *sendbuf = "GET /api/records/1.0/search/?dataset=tco-bus-circulation-passages-tr&facet=idligne&facet=nomcourtligne&facet=sens&facet=destination&facet=precision  HTTP/1.1\r\nHost: data.explore.star.fr\r\ndata.explore.star.fr\r\nConnection: close\r\n\r\n";
    Le résultat est :
    Code:
    HTTP/1.1 400 Bad Request
    Server: nginx
    Date: Thu, 21 Jan 2016 23:46:21 GMT
    Content-Type: text/html
    Content-Length: 264
    Connection: close
    
    <html>
    <head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
    <body bgcolor="white">
    <center><h1>400 Bad Request</h1></center>
    <center>The plain HTTP request was sent to HTTPS port</center>
    <hr><center>nginx</center>
    </body>
    </html>
    Connection closed
    J'ai don bien contacté le serveur mais il ne me renvoit pas la page demandé. Est-ce un problème d'authentification ?
    <center><h1>400 Bad Request</h1></center>
    <center>The plain HTTP request was sent to HTTPS port</center>: pourtant lorsque j'utilise le port 80 la connexion se ferme directement..

    -----
    Dernière modification par Vykernes ; 22/01/2016 à 00h00.

  2. #2
    Vykernes

    Re : Requête HTTP GET Impossible

    J'ai vérifié dans mon browser les headers utilisés lorsque j'actualise la page html ciblée :
    Envoyé par le browser:
    Code:
    Host: data.explore.star.fr
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: https://data.explore.star.fr/explore...ssages-tr/api/
    Cookie: __utma=179569894.1894760484.1451218236.1451474383.1453398568.4; __utmz=179569894.1453398568.4.4.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); csrftoken=8lUXev6xiq2WfmWiiQYifl325etzkTeY; _ga=GA1.4.1894760484.1451218236; sessionid=55krvbbjnusmusuqzrtbinq6nh4apht8; _gat_ods=1; _gat_custom=1
    Connection: keep-alive
    Cache-Control: max-age=0
    Header de réponse du serveur:
    Code:
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Access-Control-Allow-Origin: *
    Access-Control-Max-Age: 1000
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Connection: keep-alive
    Content-Encoding: gzip
    Content-Language: fr
    Content-Type: application/json; charset=utf-8
    Date: Fri, 22 Jan 2016 15:18:06 GMT
    Expires: Fri, 01 Jan 1990 00:00:00 GMT
    Pragma: no-cache
    Server: nginx
    Transfer-Encoding: chunked
    Vary: Accept-Language, Cookie, Host
    X-RateLimit-Limit: 5000
    X-RateLimit-Remaining: 4969
    X-RateLimit-Reset: 2016-01-23 00:00:00+00:00
    access-control-allow-headers: Authorization, X-Requested-With, Origin, ODS-API-Analytics-App, ODS-Widgets-Version
    x-ua-compatible: IE=edge
    J'ai donc repris les même headers dans ma requête sur mon client web en C, mais ça ne fonctionne toujours pas, j'ai toujours cette réponse 400..

  3. #3
    givemethat

    Re : Requête HTTP GET Impossible

    Bonsoir,

    quand vous envoyez une requête sur un port https, il faut que la requête soit crypté avec la clé publique du serveur.
    Il ne suffit pas d'envoyer la requête en "plain text".

    Quel code utilisez-vous pour envoyer la requête au serveur?

  4. #4
    Vykernes

    Re : Requête HTTP GET Impossible

    Code:
    #define WIN32_LEAN_AND_MEAN
    #define _WIN32_WINNT 0x0501
    
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    
    // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
    #pragma comment (lib, "Ws2_32.lib")
    #pragma comment (lib, "Mswsock.lib")
    #pragma comment (lib, "AdvApi32.lib")
    
    
    #define DEFAULT_BUFLEN 4096
    #define DEFAULT_PORT "443"
    
    int __cdecl main(int argc, char **argv)
    {
        WSADATA wsaData;
        SOCKET ConnectSocket = INVALID_SOCKET;
        struct addrinfo *result = NULL,
                        *ptr = NULL,
                        hints;
        char *sendbuf =     "GET /page/home/ HTTP/1.1\r\n"
                            "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"
                            "Host: data.explore.star.fr\r\n"
                            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
                            "Accept-Language: en-US,en;q=0.5\r\n"
                            "Accept-Encoding: gzip, deflate\r\n"
                            "Cookie: __utma=179569894.1894760484.1451218236.1451474383.1453398568.4; __utmz=179569894.1453398568.4.4.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); csrftoken=8lUXev6xiq2WfmWiiQYifl325etzkTeY; sessionid=55krvbbjnusmusuqzrtbinq6nh4apht8; _gat_ods=1; _gat_custom=1\r\n"
                            "Connection: keep-alive\r\n\r\n";
    
       /* char *sendbuf =     "GET /api/records/1.0/search/?dataset=tco-bus-circulation-passages-tr&facet=idligne&facet=nomcourtligne&facet=sens&facet=destination&facet=precision  HTTP/1.1\r\n \
                            Host: data.explore.star.fr\r\n \
                            Accept: text/html\r\n \
                            Accept-Encoding: gzip, deflate\r\n \
                            Referer: https://data.explore.star.fr/explore/dataset/tco-bus-circulation-passages-tr/api/\r\n \
                            Connection: keep-alive\r\n\r\n";
        */
    
        char recvbuf[DEFAULT_BUFLEN];
        int iResult;
        int recvbuflen = DEFAULT_BUFLEN;
    
        // Validate the parameters
        if (argc != 2) {
            printf("usage: %s server-name\n", argv[0]);
            return 1;
        }
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed with error: %d\n", iResult);
            return 1;
        }
    
        ZeroMemory( &hints, sizeof(hints) );
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
    
        // Resolve the server address and port
        iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
        if ( iResult != 0 ) {
            printf("getaddrinfo failed with error: %d\n", iResult);
            WSACleanup();
            return 1;
        }
    
        // Attempt to connect to an address until one succeeds
        for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
    
            // Create a SOCKET for connecting to server
            ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
                ptr->ai_protocol);
            if (ConnectSocket == INVALID_SOCKET) {
                printf("socket failed with error: %ld\n", WSAGetLastError());
                WSACleanup();
                return 1;
            }
    
            // Connect to server.
            iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
            if (iResult == SOCKET_ERROR) {
                closesocket(ConnectSocket);
                ConnectSocket = INVALID_SOCKET;
                continue;
            }
            break;
        }
    
        freeaddrinfo(result);
    
        if (ConnectSocket == INVALID_SOCKET) {
            printf("Unable to connect to server!\n");
            WSACleanup();
            return 1;
        }
    
        // Send an initial buffer
        iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
        if (iResult == SOCKET_ERROR) {
            printf("send failed with error: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
        }
    
       // printf("Bytes Sent: %ld\n", iResult);
    
        // shutdown the connection since no more data will be sent
        iResult = shutdown(ConnectSocket, SD_SEND);
        if (iResult == SOCKET_ERROR) {
            printf("shutdown failed with error: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
        }
    
        // Receive until the peer closes the connection
        do {
    
            iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
            if ( iResult > 0 ){
                //printf("Bytes received: %d\n", iResult);
                printf(recvbuf);
            }
            else if ( iResult == 0 )
                printf("Connection closed\n");
            else
                printf("recv failed with error: %d\n", WSAGetLastError());
    
        } while( iResult > 0 );
    
        // cleanup
        closesocket(ConnectSocket);
        WSACleanup();
    
        return 0;
    }


    Cependant ce code est temporaire, je l'utilisais pour valider le bon formatage de ma requête. La solution final sera utilisé sur une carte Arduino. Le souci, c'est que la mémoire interne de ma carte est de 32Ko de ROM et 2Ko de RAM... C'est suffisant pour une requête http mais je doute que cela suffise avec une couche ssl.. Ou alors je devrais peut être utiliser une carte mémoire externe pour stocker mes lib ssl mais je ne pense pas que cela suffise. Le Modem que j'utilise avec ma carte arduino ne semble pas implémenter non plus cette couche SSL.

    J'imagine que le mieux serait de passer par un serveur proxy en http, qui s'ocuperait ensuite de la connexion https vers le serveur ciblé.

  5. A voir en vidéo sur Futura
  6. #5
    givemethat

    Re : Requête HTTP GET Impossible

    Il serait peut être plus simple d'essayer déjà d'envoyer la requête sur le port http (80) tout simplement.
    Si ça ne fonctionne pas et que le serveur s'obstine, vous pourrez ensuite envisager la solution du proxy.

Discussions similaires

  1. Requête SQL
    Par Theophane dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 12/08/2013, 17h52
  2. Requete SQL
    Par invitef84ed095 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 26/12/2010, 11h57
  3. [Divers] requete
    Par enebre dans le forum Dépannage
    Réponses: 0
    Dernier message: 25/01/2008, 20h58
  4. Connection impossible sur site http
    Par invite7074c377 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 25/08/2006, 17h29
  5. Requete SQL
    Par invite4a3050ae dans le forum Internet - Réseau - Sécurité générale
    Réponses: 6
    Dernier message: 14/05/2004, 12h57
Découvrez nos comparatifs produits sur l'informatique et les technologies.