James
James

Reputation: 113

Linux socket read() can not read the response body correctly

int proxyRequest(string &request, char buffer[], struct hostent* host){
    int sockfd, sockopt;
    struct sockaddr_in their_addr;
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("Socket generating failed");
        return -1;
    }
    if(host==NULL){
        strcpy(buffer, "HTTP/1.1 404 Not found\r\nContent-Type: text/html\r\n\r\n<h2>INET_E_RESOURCE_NOT_FOUND</h2>");
    }
    else{
        their_addr.sin_family = AF_INET;
        their_addr.sin_port = htons(SERVERPORT);
        their_addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr;
        if(connect(sockfd, (struct sockaddr*)&their_addr, sizeof(their_addr)) == -1){
            perror("Connection failed");
            return -1;
        }
        write(sockfd, request.c_str(), request.length());
        read(sockfd, buffer, BUFSIZE);
        cout << buffer << endl;
    }
    close(sockfd);
    return 0;
}

I am making a simple proxy server and everything's fine, except I can't receive a correct resposne body.

enter image description here

This is the request that I send to server(www.example.com). This is represented as "request" in the code.

enter image description here

It seems that http headers are received correctly. However, the html file(body) is not sent at all. And there is a weird character instead of it. Why does this happen? Is it related to null character?

Upvotes: 0

Views: 136

Answers (1)

NPE
NPE

Reputation: 500913

However, the html file(body) is not sent at all. And there is a weird character instead of it. Why does this happen?

The body is sent, but compressed. The following tells you that the content is compressed using the gzip algorithm:

Content-Encoding: gzip

You'll need to either decompress it (taking care around NUL characters) or tell the server that you're not prepared to deal with gzip encoded content (i.e. remove the Accept-Encoding header in your request).

Upvotes: 3

Related Questions