Refactor the client

This commit is contained in:
Ivaylo Ivanov 2018-11-27 11:29:57 +01:00
parent 712e3910ad
commit 72fb0784bf
1 changed files with 40 additions and 29 deletions

View File

@ -36,7 +36,9 @@ int main(int argc, char *argv[]) {
char *port = "80"; char *port = "80";
char *ofile = NULL; char *ofile = NULL;
int opt_f = 0;
char *dir = NULL; char *dir = NULL;
int opt_d = 0;
char *url = NULL; char *url = NULL;
int c; int c;
@ -48,44 +50,61 @@ int main(int argc, char *argv[]) {
break; break;
case 'o': case 'o':
ofile = optarg; ofile = optarg;
opt_f = 1;
break; break;
case 'd': case 'd':
dir = optarg; dir = optarg;
opt_d = 1;
break; break;
case 'h': case 'h':
printf("Command usage:\n");
print_usage(); print_usage();
exit(EXIT_SUCCESS); break;
case '?': case '?':
print_usage(); print_usage();
exit(EXIT_FAILURE); break;
default: default:
abort(); abort();
} }
} }
/// Check for the case that both output file and directory are set /// Check for the case that both output file and directory are set
if(ofile != NULL && dir != NULL) { if(opt_d == 1 && opt_f == 1) {
printf("Either output file or directory is specified. You cannot use both.\n"); printf("Either output file or directory should be specified. You cannot use both.\n");
print_usage(); print_usage();
exit(EXIT_FAILURE);
} }
/// Check if the required argument is there /// Check if the required argument is there
if(argv[optind] == NULL) { if(argv[optind] == NULL) {
fprintf(stderr, "Mandatory argument 'url' missing.\n"); fprintf(stderr, "Mandatory argument 'url' missing.\n");
print_usage(); print_usage();
exit(EXIT_FAILURE);
} else { } else {
url = argv[optind]; url = argv[optind];
} }
char proto[8];
memcpy(proto, url, 7);
proto[7] = 0;
if(strcmp(proto, "http://") != 0){
printf("ERROR: The url doesn't start with http://\n");
print_usage();
}
char *base_url = strstr(url, "http://") + 7; //< the base url starts after http:// char *base_url = strstr(url, "http://") + 7; //< the base url starts after http://
char *path = malloc(strlen(base_url) + 1); char *path = malloc(strlen(base_url) + 1);
strcpy(path, base_url); //< Copying so that strtok() doesn't change it strcpy(path, base_url); //< Copying so that strtok() doesn't change it
path = strstr(path, "/"); path = strstr(path, "/");
if(path == NULL) path = "/"; //< Set the root path if there is none
if(path == NULL) {
path = "/"; //< Set the root path if there is none
if(ofile == NULL && dir != NULL)
ofile = "index.html";
} else {
if(ofile == NULL && dir != NULL) {
ofile = strchr(path, '/');
}
}
const char *hostname = strtok(base_url, ";/?:@=&"); //< Get the FQDN of the remote const char *hostname = strtok(base_url, ";/?:@=&"); //< Get the FQDN of the remote
struct addrinfo* config = get_host_info(hostname, port); //< Check if the address is resolvable struct addrinfo* config = get_host_info(hostname, port); //< Check if the address is resolvable
@ -120,7 +139,9 @@ int main(int argc, char *argv[]) {
} }
static void print_usage(void) { static void print_usage(void) {
printf("client [-p PORT] [ -o FILE | -d DIR ] URL\n"); puts("Usage:");
puts("client [-p PORT] [ -o FILE | -d DIR ] URL\n");
exit(EXIT_FAILURE);
} }
/** /**
@ -224,43 +245,33 @@ static void process_response(char reply[sizeof(int32_t)], char *ofile, char *dir
char *body = strstr(reply, "\r\n\r\n") + 4; char *body = strstr(reply, "\r\n\r\n") + 4;
if(ofile == NULL && dir == NULL) printf("%s", body); //< Print the body of the response if(ofile == NULL && dir == NULL) printf("%s", body); //< Print the body of the response
else { else {
if(ofile != NULL) { FILE *out = NULL;
FILE *out = NULL; if(ofile != NULL && dir == NULL) {
out = fopen(ofile, "w"); out = fopen(ofile, "w");
if(out == NULL) { if(out == NULL) {
(void) fprintf(stderr, "ERROR: Could not open ./%s for writing.", ofile); (void) fprintf(stderr, "ERROR: Could not open ./%s for writing.", ofile);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else { } else {
fprintf(out, "%s", body); fwrite(body, 1, strlen(body), out);
fclose(out); fclose(out);
printf("File ./%s successfully written.\n", ofile); printf("File ./%s successfully written.\n", ofile);
} }
} else if(dir != NULL) { } else if(ofile != NULL && dir != NULL) {
FILE *out = NULL;
char path[sizeof(dir) + 100]; char path[sizeof(dir) + 100];
if(dir[strlen(dir) - 1] == '/')
snprintf(path, sizeof path, "%sresult.html", dir);
else
snprintf(path, sizeof path, "%s/result.html", dir);
out = fopen(path, "w"); //< Open <path>/result.html for writing snprintf(path, sizeof path, "%s%s", dir, ofile);
out = fopen(path, "w"); //< Open for writing
if(out == NULL) { if(out == NULL) {
if(dir[strlen(dir) - 1] == '/') (void) fprintf(stderr, "ERROR: Could not open %s%s for writing.\n", dir, ofile);
(void) fprintf(stderr, "ERROR: Could not open %sresult.html for writing.\n", dir);
else
(void) fprintf(stderr, "ERROR: Could not open %s/result.html for writing.\n", dir);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else { } else {
fprintf(out, "%s", body); fwrite(body, 1, strlen(body), out);
fclose(out); fclose(out);
printf("File %s%s successfully written.\n", dir, ofile);
if(dir[strlen(dir) - 1] == '/')
printf("File %sresult.html successfully written.\n", dir);
else
printf("File %s/result.html successfully written.\n", dir);
} }
} }
} }