|
|
- /*
- * urlparse.c
- *
- * Created by Yigit Colakoglu on 07/06/2021.
- * Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved.
- */
-
- #include "urlparse.h"
- #include "linkedlist.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
-
- URL *parseurl(char *url) {
- URL *urlp = urlalloc();
- urlp->params = NULL;
- urlp->nparams = 0;
- short stage = 0; /* var to keep track of where we are in url */
- int counter = 0;
-
- while (*url != '\0' && *url != '\n') {
- switch (*url++) {
- case ':':
- counter++;
- if (stage == 0) {
- urlp->https = *(url - 2) == 's';
- if (*(url + 1) == '\0' || *url == '\0' || *url == '\n') /* weird stuff would happen with strings like "http:" */
- return NULL;
- url += 2; /* Skip the // after the :*/
- stage = 1;
- counter+=3;
- }
- break;
-
- case '?':
- if (stage == 1) {
- urlp->base =
- (char *)malloc(counter); /* +1 for the '\0' in the end */
- strncpy(urlp->base, url - counter, counter - 1);
- stage = 2;
- counter = 1;
- } else {
- return NULL;
- }
- break;
-
- case '=':
- if (stage == 2) {
- char *foo;
- foo = (char *)malloc(counter);
- strncpy(foo, url - counter, counter-1);
- counter = 1;
- if (urlp->params == NULL){
- urlp->params = linkedlistalloc();
- urlp->params->data = foo;
- }else
- urlp->params = linkedlistadd(urlp->params, foo);
- urlp->nparams++;
- while(*url != '&' && *url != '\0' && *url != '\n')
- url++;
- url++;
- }
- break;
-
- default:
- counter++;
- break;
- }
- }
-
- switch(stage){
- case 0:
- return NULL;
- break;
- case 1:
- urlp->base = (char *)malloc(counter); /* +1 for the '\0' in the end */
- strncpy(urlp->base, url - (counter-1), counter - 1);
- break;
- case 2:
- break;
- default:
- return NULL;
- }
- return urlp;
- }
-
- URL *urlalloc(void) { return (URL *)malloc(sizeof(URL)); }
|