http server skeleton
This commit is contained in:
parent
b6f5445e6f
commit
3e48f3d335
3
src/http/config.h
Normal file
3
src/http/config.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#define Server "UNIX"
|
||||||
|
#define HTTP_ROOT "/var/www"
|
||||||
|
#define SERVER_ADDRESS "www.example.com"
|
94
src/http/url.c
Normal file
94
src/http/url.c
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
#include "url.h"
|
||||||
|
|
||||||
|
/* safely frees URL struct */
|
||||||
|
struct Url *
|
||||||
|
free_url(struct Url *url){
|
||||||
|
free(url->s);
|
||||||
|
free(url->ssp);
|
||||||
|
free(url);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* turns scheme specific part of URL from string into SSP struct */
|
||||||
|
/* returns NULL on allocation error or scheme syntax error */
|
||||||
|
struct CommonInternetScheme *
|
||||||
|
disassemble_commoninternetscheme(char *ssp){
|
||||||
|
int i;
|
||||||
|
char *p;
|
||||||
|
struct CommonInternetScheme *retval;
|
||||||
|
|
||||||
|
if( /* embarrassingly long if statement */
|
||||||
|
(retval
|
||||||
|
= (struct CommonInternetScheme *)
|
||||||
|
malloc(sizeof(struct CommonInternetScheme))
|
||||||
|
) == NULL
|
||||||
|
)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
parsed = 0;
|
||||||
|
|
||||||
|
/* the scheme-specific data starts with a double slash to indicate that
|
||||||
|
* it complies with the common Internet scheme syntax (RFC 1738 3.1) */
|
||||||
|
if(ssp[0] != '/' || ssp[1] != '/')
|
||||||
|
return NULL;
|
||||||
|
ssp += 2;
|
||||||
|
|
||||||
|
/* probe to determine what areas of the SSP are filled */
|
||||||
|
p = ssp;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* turns URL string into URL struct */
|
||||||
|
struct Url *
|
||||||
|
disassemble_url(char *url){
|
||||||
|
char *p;
|
||||||
|
struct Url *retval;
|
||||||
|
size_t s_s;
|
||||||
|
size_t ssp_s;
|
||||||
|
size_t *s;
|
||||||
|
|
||||||
|
if((retval = (struct Url *)malloc(sizeof(struct Url))) == NULL)
|
||||||
|
return NULL;
|
||||||
|
s_s = 0;
|
||||||
|
ssp_s = 0;
|
||||||
|
|
||||||
|
/* get the lengths of the scheme and scheme specific part, excluding
|
||||||
|
* the nul byte */
|
||||||
|
p = url;
|
||||||
|
s = &s_s;
|
||||||
|
while(*p != '\0'){
|
||||||
|
/* standard; scheme names can't contain colons so the first
|
||||||
|
* colon must delimit the scheme from the scheme specific part
|
||||||
|
* (RFC 1738 2.1) */
|
||||||
|
if(s == &s_s && *p == ':'){
|
||||||
|
s = &ssp_s;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
++*p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* malloc the lengths, including the nul byte */
|
||||||
|
if((retval->s = (char *)malloc(sizeof(char) * (s_s + 1))) == NULL)
|
||||||
|
goto free_retval;
|
||||||
|
if((retval->ssp = (char *)malloc(sizeof(char) * (ssp_s + 1))) == NULL)
|
||||||
|
goto free_s;
|
||||||
|
|
||||||
|
/* copy over the scheme and scheme specific part strings */
|
||||||
|
p = retval->s;
|
||||||
|
while(*url != ':')
|
||||||
|
*(p++) = *(url++);
|
||||||
|
*p = '\0';
|
||||||
|
p = retval->ssp;
|
||||||
|
while(*url != '\0')
|
||||||
|
*(p++) = *(url++);
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
free_s:
|
||||||
|
free(retval->s);
|
||||||
|
free_retval:
|
||||||
|
free(retval);
|
||||||
|
return NULL;
|
||||||
|
}
|
20
src/http/url.h
Normal file
20
src/http/url.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/* #include <stdlib.h> /* free(3), malloc(3), NULL */
|
||||||
|
|
||||||
|
/* RFC 1738 3.1 */
|
||||||
|
struct CommonInternetScheme{
|
||||||
|
char *user;
|
||||||
|
char *password;
|
||||||
|
char *host; /* FQDN, IPv4, or IPv6 address */
|
||||||
|
char *port; /* Can have default; must be supplied in decimal. */
|
||||||
|
char *url_path;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* standard; RFC 1738 */
|
||||||
|
struct Url{
|
||||||
|
char *s; /* scheme */
|
||||||
|
/* char * or some sort of struct SchemeSpecificPart * */
|
||||||
|
void *ssp; /* scheme-specific-part */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Url *disassemble_url(char *url);
|
||||||
|
struct Url *free_url(struct Url *url);
|
Loading…
Reference in New Issue
Block a user