Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple Http Get Response

Tags:

c++

http

unix

tcp

get

I have been writing a simple web server (http 1.0) for a class, but whenever I try to get a file (wget 127.0.0.1 /filename) is is short a few bytes. The confusing thing is when I sum the number of sent bytes it matches the file size, but not the amount wget receives.

Why is wget not getting all of the data I write to the socket?

some wget output

wget:

    --2012-10-27 19:02:00--  (try: 4)  http://127.0.0.1:5555/
    Connecting to 127.0.0.1:5555... connected.
    HTTP request sent, awaiting response... 200 Document follows
    Length: 5777 (5.6K) [text/html]
    Saving to: `index.html.6'

    99% [=====================================> ] 5,776       --.-K/s   in 0s      

    2012-10-27 19:02:00 (322 MB/s) - Read error at byte 5776/5777 (Connection reset by peer).  Retrying.


    --2012-10-27 19:03:52--  (try: 4)  http://127.0.0.1:5555/ZoEY8.jpg
    Connecting to 127.0.0.1:5555... connected.
    HTTP request sent, awaiting response... 200 Document follows
    Length: 163972 (160K) [image/jpeg]
    Saving to: `ZoEY8.jpg.4'

    91% [==================================>    ] 149,449     --.-K/s   in 0.001s  

    2012-10-27 19:03:52 (98.8 MB/s) - Read error at byte 163917/163972 (Connection reset by peer). Retrying.

Get method:

void *
processGetRequest(requestParser request)
{

  string resp= "HTTP/1.0 200 Document follows\r\nServer: lab5 \r\nContent-Length: ";
  string path="";
  path =request.path;

  //find file
  int page= open (path.c_str(),O_RDONLY);
  FILE * pageF= fdopen(page,"rb"); 


  //get size
  fseek(pageF, 0L, SEEK_END);
  int sz = ftell(pageF);
  fseek(pageF, 0L, SEEK_SET);

  //form content length
  stringstream ss;
  ss<<resp<<sz<<"\r\n";
  resp=ss.str(); 

  //make response
  if(page<0){
      cout<<"404 \n";
    resp = "HTTP/1.0 404 File Not Found\r\nServer: lab5 \r\nContent-type: text/html \r\n \r\n";

    write( request.fd, resp.c_str(), resp.length());

  return 0; 
  }
  if(path.find(".gif")!=string::npos)
   resp += "Content-type: image/gif\r\n \r\n";
  else if(path.find(".png")!=string::npos)
   resp += "Content-type: image/png\r\n \r\n";
  else if(path.find(".jpg")!=string::npos)
   resp += "Content-type: image/jpeg\r\n \r\n";
  else
   resp += "Content-type: text/html \r\n \r\n";

  //write response
  write( request.fd, resp.c_str(), resp.length());

  int total=0;      
  char buff[1024];
  int readBytes = 0;
  int er;

  //send file
  do{

  readBytes= read(page, buff, 1024);
  cout<<"read bytes "<<readBytes<<"\n";

  if(readBytes<0){
    perror("read");

    break;
  }
  total+=readBytes;
  er=  send( request.fd, buff, readBytes,0 );   
  cout<<"sent bytes "<<er<<"\n";
  if (er==-1){
    perror("send");
  }
  else if( er != readBytes){
    cout<<"Read write miss match\n";
  }

 }while(readBytes>0);

 close(page);
 return 0;
}

Edit:

I have been working at this while and I'm wondering if Im doing my sockets wrong

// Set the IP address and port for this server
struct sockaddr_in serverIPAddress; 
memset( &serverIPAddress, 0, sizeof(serverIPAddress) );
serverIPAddress.sin_family = AF_INET;
serverIPAddress.sin_addr.s_addr = INADDR_ANY;
serverIPAddress.sin_port = htons((u_short) port);

// Allocate a socket
int masterSocket =  socket(PF_INET, SOCK_STREAM, 0);
if ( masterSocket < 0) {
  perror("socket");
  exit( -1 );
}

while ( 1 ) {

// Accept incoming connections
struct sockaddr_in clientIPAddress;
int alen = sizeof( clientIPAddress );
int slaveSocket = accept( masterSocket,
              (struct sockaddr *)&clientIPAddress,
              (socklen_t*)&alen);
// send slaveSocket to get method 
}
like image 638
JacksonReed Avatar asked Oct 27 '12 23:10

JacksonReed


People also ask

What is HTTP response with example?

It is also known as the status text. It is a human-readable text that summarizes the meaning of the status code. An example of the response line is as follows: HTTP/1.1 200 OK.

How does a simple HTTP request work?

An HTTP request is made by a client, to a named host, which is located on a server. The aim of the request is to access a resource on the server. To make the request, the client uses components of a URL (Uniform Resource Locator), which includes the information needed to access the resource.

What is an example of a GET request?

For example, when you press search after writing anything in the search box of google.com, you actually go for a GET request because there is no sensitive information and you are just requesting the page with search results, you notice the same search string in URL.


1 Answers

My first answer is below, but i just noticed something..

"Content-type: text/html \r\n \r\n";

The headers must be separated from the content with two CR/LF. It looks like you have space in there

you can try this:

 "Content-type: text/html\r\n\r\n";

Is the output buffer being correctly flushed and closed after the last write? Try changing the size of your 1024 byte read buffer to something larger than your gif file. This isnt a fix, but you may get different results, and this may help track down the cause of the problem. Maybe also put some logging into the read write loop. See if the size of the last buffer write equals the number of bytes the response is missing.

like image 181
slipperyseal Avatar answered Sep 22 '22 11:09

slipperyseal