Compare commits

...

5 Commits

4 changed files with 63 additions and 12 deletions

View File

@@ -1,4 +1,4 @@
main: main.c
gcc main.c -o main -L/usr/lib -lXm -lXt -lX11 -l:libXmHTML.so.1.1.10
gcc main.c url_manipulation.c easysock.c -o main -L/usr/lib -lXm -lXt -lX11 -l:libXmHTML.so.1.1.10

11
main.c
View File

@@ -79,12 +79,17 @@ void testFunc(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *callb
and make the connection for us. It returns the socket, so that the HTTP request can be made.
First parameter is IP version - set to -1 because we don't know yet if the address is IPv4 or IPv6. */
char* request = "GET /~fdc/sample.html HTTP/1.1\nHost: www.columbia.edu\n\n"
char* response = malloc(sizeof(char) * 5000);
struct sockaddr* address_struct;
int remote_socket = create_remote(-1,'T',url_to_hostname(url),port,address_struct);
XmHTMLTextSetString(result_widget,"");
send(remote_socket,request,strlen(request),0);
recv(remote_socket,response,sizeof(response),0);
XmHTMLTextSetString(result_widget,response);
// printf("%d\n",val);
// exit(2);
}

View File

@@ -1,5 +1,8 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define DEFAULT_PATH "/"
char* url_to_proto(char* url) {
size_t length = strlen(url);
@@ -17,25 +20,64 @@ char* url_to_proto(char* url) {
char* url_to_hostname(char* url) {
/* This function relies on a hack-y assumption: that, given a string
that represents a URL (e.g. https://www.example.com/index.html), the length of the host portion
of the address is the distance between the second slash (:/'/') and the third ('/'index.html). */
of the address is the distance between the second slash (:/'/') and the third ('/'index.html),
or the second slash and the end of the string, if the path isn't present. */
size_t length = strlen(url);
char* protocol = url_to_proto(url);
char* to_return = malloc(sizeof(char) * 256);
char* temp_substring = malloc(sizeof(char) * 256);
char* to_return = malloc(sizeof(char) * 256);
/* This is a very roundabout way of saying that, starting from a certain point in the
URL (length of protocol string + 3), we are copying the rest of the string into another
URL (length of protocol string + 3 (':','/','/'), we are copying the rest of the string into another
substring. */
strncpy(to_return,url+(strlen(protocol) + 3),(length - (strlen(protocol) + 3)));
strncpy(temp_substring,url+(strlen(protocol) + 3),(length - (strlen(protocol) + 3)));
/* Now we need to substring _this_ substring, by returning only the part before the next slash. */
int sentinel = 0;
for (int i=0;i<strlen(temp_substring);i++) {
if (*(temp_substring+(sizeof(char) * i)) == '/') {
sentinel = i;
}
}
if (sentinel == 0) { /* If there are no more slashes */
return temp_substring;
}
strncpy(to_return,temp_substring,sentinel);
free(temp_substring);
return to_return;
}
char* url_to_path(char* url) {
/* Assumption: The path starts from the third slash to the end of the string. */
int str_len = strlen(url);
int sentinel = 0;
int num_slashes = 0;
char* to_return = malloc(sizeof(char) * 512);
for (int i=0;i<strlen(url);i++) {
if (*(url + (sizeof(char) * i)) == '/') {
num_slashes++;
sentinel = i;
}
if (num_slashes == 3) {
break;
}
}
if (num_slashes < 3 || sentinel == str_len) { /* If we don't find the requisite number of slashes after
parsing the string OR the third slash is at the end of the string
("e.g. www.example.com/")... */
strcpy(to_return,DEFAULT_PATH); /* ...Then return the default path - "/" */
return to_return;
}
/* Copy all bytes of the string, starting from the third slash */
strncpy(to_return, url+(sizeof(char) * sentinel), strlen(url)-(sizeof(char) * sentinel));
return to_return;
}

View File

@@ -10,3 +10,7 @@ Example - 'https://example.org' would return 'example.org'. */
char* url_to_hostname(char* url);
/* url_to_path - Returns the path portion of a URL.
Example: 'https://example.org/index.html' will return '/index.html'
Any empty path will also return '/index.html' */
char* url_to_path(char* url);