Compare commits

...

5 Commits

4 changed files with 63 additions and 12 deletions

View File

@@ -1,4 +1,4 @@
main: main.c 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

7
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. 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. */ 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; struct sockaddr* address_struct;
int remote_socket = create_remote(-1,'T',url_to_hostname(url),port,address_struct); int remote_socket = create_remote(-1,'T',url_to_hostname(url),port,address_struct);
send(remote_socket,request,strlen(request),0);
recv(remote_socket,response,sizeof(response),0);
XmHTMLTextSetString(result_widget,""); XmHTMLTextSetString(result_widget,response);
// printf("%d\n",val); // printf("%d\n",val);
// exit(2); // exit(2);
} }

View File

@@ -1,5 +1,8 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#define DEFAULT_PATH "/"
char* url_to_proto(char* url) { char* url_to_proto(char* url) {
size_t length = strlen(url); size_t length = strlen(url);
@@ -17,25 +20,64 @@ char* url_to_proto(char* url) {
char* url_to_hostname(char* url) { char* url_to_hostname(char* url) {
/* This function relies on a hack-y assumption: that, given a string /* 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 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); size_t length = strlen(url);
char* protocol = url_to_proto(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 /* 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. */ 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) { char* url_to_path(char* url) {
/* Assumption: The path starts from the third slash to the end of the string. */ /* 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); 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);