first commit
This commit is contained in:
152
CS4210/cs4210/proj1/src/common/http.c
Normal file
152
CS4210/cs4210/proj1/src/common/http.c
Normal file
@@ -0,0 +1,152 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "http.h"
|
||||
#include "util.h"
|
||||
|
||||
/* The length of the buffer to read the stuff from the socket into. */
|
||||
#define BUFFER_LENGTH 256
|
||||
|
||||
char* http_read_header(socket_t csocket)
|
||||
{
|
||||
char* result = NULL;
|
||||
char buffer[BUFFER_LENGTH];
|
||||
int bytes_received = 0;
|
||||
|
||||
DEBUG_PRINTF(("[HTTP] Reading header.\n"));
|
||||
do
|
||||
{
|
||||
bytes_received = recv(csocket, buffer, BUFFER_LENGTH - 1, 0);
|
||||
if (bytes_received > 0)
|
||||
{
|
||||
char* substr = NULL;
|
||||
|
||||
buffer[bytes_received] = '\0';
|
||||
|
||||
/* Append buffer to result: */
|
||||
result = strcatd(result, buffer);
|
||||
|
||||
/* See if result now has two CRLFs in a row, to indicate the
|
||||
end of the header: */
|
||||
substr = strstr(result, "\r\n\r\n");
|
||||
if (substr)
|
||||
{
|
||||
substr[4] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (bytes_received > 0);
|
||||
|
||||
DEBUG_PRINTF(("[HTTP] Got header:\n%s\n[HTTP] End header.\n", result));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
char* http_get_requesturi(const char* header)
|
||||
{
|
||||
char* start = ((char*) strchr(header, ' ')) + 1;
|
||||
if (start == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
const char* stop = strchr(start, ' ');
|
||||
if (stop == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Count the length of the request: */
|
||||
char* ptr = NULL;
|
||||
size_t count = 0;
|
||||
for (ptr = start; ptr != stop; ptr++)
|
||||
{
|
||||
count ++;
|
||||
}
|
||||
|
||||
return strncatd(NULL, start, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char* http_get_method(const char* header)
|
||||
{
|
||||
/* If header starts with GET, then we have a GET request. */
|
||||
if (strstr(header, HTTP_METHOD_GET) == header)
|
||||
{
|
||||
return HTTP_METHOD_GET;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void http_send_canned_response(socket_t socket, int status)
|
||||
{
|
||||
static const char* html1 = "<html>HTTP Status code ";
|
||||
static const char* html2 = "</html>";
|
||||
|
||||
char buffer[8];
|
||||
sprintf(buffer, "%d", status);
|
||||
|
||||
/* Send the appropriate header: */
|
||||
http_send_header(socket, status);
|
||||
|
||||
/* Send some HTML: */
|
||||
net_send_string(socket, html1, strlen(html1));
|
||||
net_send_string(socket, buffer, strlen(buffer));
|
||||
net_send_string(socket, html2, strlen(html2));
|
||||
}
|
||||
|
||||
void http_send_header(socket_t socket, int status)
|
||||
{
|
||||
char buffer[32];
|
||||
char* header = NULL;
|
||||
|
||||
/*
|
||||
static struct utsname *our_name = NULL;
|
||||
if (uname(our_name))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
our_name->nodename
|
||||
*/
|
||||
|
||||
/* Make status line: */
|
||||
sprintf(buffer, "HTTP/1.1 %d %d\r\n", status, status);
|
||||
header = strcatd(header, buffer);
|
||||
|
||||
/* Add various other headers: */
|
||||
header = strcatd(header, "Content-Type: text/html\r\n");
|
||||
header = strcatd(header, "Server: CS4210P1/vlad,omar\r\n");
|
||||
header = strcatd(header, "Connection: Close\r\n");
|
||||
header = strcatd(header, "\r\n");
|
||||
|
||||
net_send_string(socket, header, strlen(header));
|
||||
|
||||
free(header);
|
||||
}
|
||||
|
||||
void http_send_text_file(socket_t socket, FILE* f)
|
||||
{
|
||||
char buffer[BUFFER_LENGTH];
|
||||
size_t bytes_read = 0;
|
||||
|
||||
while (!feof(f))
|
||||
{
|
||||
bytes_read = fread(buffer, sizeof(char), BUFFER_LENGTH - 1, f);
|
||||
buffer[bytes_read] = '\0';
|
||||
|
||||
if (bytes_read > 0)
|
||||
{
|
||||
net_send_string(socket, buffer, bytes_read);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user