I am in need of figuring out the requested url from the http request but there seem to be none.
for example when i enter this
http://127.0.0.1:8080/heththethetkj909
the request does not contain the url
GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.43 Safari/536.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
n-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
f-8;q=0.7,*;q=0.3
my code is
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
char response[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<doctype !html><html><head><title>Bye-bye baby bye-bye</title>"
"<style>body { background-color: #111 }"
"h1 { font-size:4cm; text-align: center; color: white;"
" text-shadow: 0 0 2mm black}</style></head>"
"<body><h1>Goodbye, world!</h1></body></html>\r\n";
int main()
{
int one = 1, client_fd;
struct sockaddr_in svr_addr, cli_addr;
socklen_t sin_len = sizeof(cli_addr);
char send_data [1024] , recv_data[2048];
int bytes_recieved ;
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
err(1, "can't open socket");
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
int port = 8080;
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = INADDR_ANY;
svr_addr.sin_port = htons(port);
if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) {
close(sock);
err(1, "Can't bind");
}
listen(sock, 5);
while (1) {
client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len);
printf("got connection\n");
bytes_recieved = recv(client_fd,recv_data,2048,0);
printf(recv_data);
if (client_fd == -1) {
perror("Can't accept");
continue;
}
write(client_fd, response, sizeof(response) - 1); /*-1:'\0'*/
close(client_fd);
}
}
Why?
In the first two lines of the HTTP request, we have
this is correspondent to
127.0.0.1:8080/favicon.ico.What is favicon.ico? Did you notice that when you visit stackoverflow in a browser, there will be a stackoverflow icon on the left of address bar or on the left of page title in your tab bar. That’s favicon. Browser will try to load that when you visit any web site, and use that as the picture. For details of favicon, see wikipedia – favicon.
With the above said, this http request simply is not for
http://127.0.0.1:8080/heththethetkj909. Therefore, you certainly won’t see it. In this case, the first two lines of the HTTP request will readThe server is probably opening two connections simultaneously to your web server. One for
/heththethetkj909, the other for/favicon.ico. I’m actually not sure why you run into the problem as your original code seems to handle multiple connections. Maybe it’s http persistence related issue.How to solve it?
Try adding ‘Connection: close’ in the header of your http response. It may help.
If you simply want to try a very basic implementation which doesn’t handle this, consider trying a different browser which may have a different timing behavior of loading favicon, or a very old browser which doesn’t know favicon, or something that’s not a browser to hit your server, e.g.
curl http://127.0.0.1:8080/heththethetkj909in linux, or notepad in windows (yes, you can type a url in the open dialog of notepad).