Edward Severinsen
Edward Severinsen

Reputation: 101

Winsock program getting 400 bad request, your browser sent a request this server couldn't understand

I made a program in C++ using winsock2 and connected to GoDaddy. But I get this

HTTP/1.1 400 Bad Request
Date: Mon, 17 Aug 2015 01:53:38 GMT
Server: Apache
Content-Length: 300
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache Server at default.secureserver.net Port 80</address>
</body></html>

Here's my code:

#include <windows.h>
#include <winsock2.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define SCK_VERSION2 0x0202
#define DEFAULT_BUFLEN 2000
#define DEFAULT_PORT 27015

namespace Globals{
    extern string input = "";
}
using namespace Globals;

int whole() {

    //USERNAME();
    //PASSWORD();

    //----------------------
    // Declare and initialize variables.
    WSADATA wsaData;
    int iResult;

    SOCKET ConnectSocket = INVALID_SOCKET;
    struct sockaddr_in clientService;

    char name[500] = "";
    char ipADDRESS[500] = "";
    char sPORT[500] = "";

    sockaddr_in sName;
    int sNameSize =  sizeof(sName);

    char *sendbuf = "GET /offers/online-business.aspx HTTP/1.1 \nHost: I took this out, not giving myself away \nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) \nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \nAccept-Language: en-us,en;q=0.5 \nAccept-Encoding: gzip,deflate \nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 \nKeep-Alive: 300 \nConnection: keep-alive \nCookie: \nPragma: no-cache \nCache-Control: no-cache";
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;                                    //208.109.181.178
    int WSAERROR = WSAGetLastError();
    //system("color 04");
    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
      printf("WSAStartup failed: %d\n", iResult);
      return 1;
    }

    //----------------------
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %i\n", WSAGetLastError() );
        WSACleanup();
        return 1;
    }

    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.

    printf("IP ADDRESS: \n");
    cin >> ipADDRESS;
    printf("PORT: \n");
    cin >> sPORT;
    u_short PORT = strtoul(sPORT, NULL, 0);
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr(ipADDRESS);                            //74.125.196.191
    clientService.sin_port = htons(PORT);

    //----------------------
    // Connect to server.
    iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    if ( iResult == SOCKET_ERROR) {
        closesocket (ConnectSocket);
        printf("Unable to connect to server: %i\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    //----------------------
    //Get local host name
    iResult = gethostname(name, sizeof(name));
    if (iResult == NO_ERROR) {
        printf("Host Name: %s\n", name);
    }
    else if (iResult == SOCKET_ERROR) {
        printf("Could not resolve host name: %i", WSAGetLastError());
    }

    //------------------------
    //Get peer name
    iResult = getpeername(ConnectSocket, (struct sockaddr*)&sName, &sNameSize);
    if (iResult == NO_ERROR)
        printf("Peer Name: %s\n", inet_ntoa(sName.sin_addr));
    else if (iResult == SOCKET_ERROR)
        printf("Could not get peer name: %i\n", WSAGetLastError());

    //-------------------------
    // Send an initial buffer
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }
    else
        printf("Bytes Sent: %i\n", iResult);

    //-----------------------------
    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed: %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("Bytes received: %d\n", iResult);
            printf("From server: %s\n", recvbuf);
        }
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else if (WSAERROR == WSAETIMEDOUT)
            printf("recv failed: WSAETIMEDOUT\n");
        printf("Do you want to disconnect? (Y/N) \n");
        cin >> input;
        if ( input == "Y"||"y" ) {
            break;
        }
        else if ( input == "N"||"n" ) {
            break;
        }
    } while( iResult > 0 );

    // cleanup
    closesocket(ConnectSocket);
    WSACleanup();
    system("PAUSE");
    return 0;
}

int main() {
    do {
        whole();
    } while( input != "N"||"n" );

}

sendbuf contains the GET request. The example I found online basically showed it as looking for a specific directory. Would it be more like you ask for a directory and a specific html file or what not? If anyone could tell me the parameters or how to properly make a GET request it would be greatly appreciated.

EDIT: Does anyone know if it might have to do with \r\n?

Upvotes: 0

Views: 1392

Answers (1)

Carsten Hansen
Carsten Hansen

Reputation: 1668

One thing to look at is the HTTP headers, which appear to be incorrectly formatted.

Each line must be terminated with \r\n, and the entire header block with \r\n\r\n.

Also, the Cookie header has no value - not sure if that could be causing an issue.

Try something like this (added \r after each header, \r\n\r\n to terminate block, removed Cookie:

char *sendbuf = "GET /offers/online-business.aspx HTTP/1.1\r\n"
    "Host: I took this out, not giving myself away\r\n"
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)\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"
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
    "Keep-Alive: 300\r\n"
    "Connection: keep-alive\r\n"
    "Pragma: no-cache\r\n"
    "Cache-Control: no-cache\r\n\r\n";

Upvotes: 2

Related Questions