mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-09-07 14:11:46 +00:00
xml,ini and yaml file can taken via http automagically
This commit is contained in:
@@ -73,10 +73,8 @@ char *ini_get_line(char *ini, off_t size) {
|
||||
|
||||
void uwsgi_ini_config(char *file) {
|
||||
|
||||
int fd;
|
||||
ssize_t len;
|
||||
int len = 0;
|
||||
char *ini;
|
||||
struct stat sb;
|
||||
|
||||
char *ini_line;
|
||||
|
||||
@@ -90,7 +88,7 @@ void uwsgi_ini_config(char *file) {
|
||||
char *section_asked = "uwsgi";
|
||||
char *colon;
|
||||
|
||||
colon = strchr(file, ':');
|
||||
colon = uwsgi_get_last_char(file, ':');
|
||||
if (colon) {
|
||||
colon[0] = 0;
|
||||
if (colon[1] != 0) {
|
||||
@@ -100,36 +98,10 @@ void uwsgi_ini_config(char *file) {
|
||||
|
||||
uwsgi_log("[uWSGI] getting INI configuration from %s\n", file);
|
||||
|
||||
fd = open(file, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
uwsgi_error("open()");
|
||||
exit(1);
|
||||
}
|
||||
ini = uwsgi_open_and_read(file, &len, 1);
|
||||
|
||||
if (fstat(fd, &sb)) {
|
||||
uwsgi_error("fstat()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
ini = malloc(sb.st_size+1);
|
||||
|
||||
if (!ini) {
|
||||
uwsgi_error("malloc()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
len = read(fd, ini, sb.st_size);
|
||||
if (len != sb.st_size) {
|
||||
uwsgi_error("read()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ini[sb.st_size] = 0;
|
||||
|
||||
while(sb.st_size) {
|
||||
ini_line = ini_get_line(ini, sb.st_size);
|
||||
while(len) {
|
||||
ini_line = ini_get_line(ini, len);
|
||||
if (ini_line == NULL) {
|
||||
break;
|
||||
}
|
||||
@@ -174,13 +146,11 @@ void uwsgi_ini_config(char *file) {
|
||||
}
|
||||
|
||||
|
||||
sb.st_size -= (ini_line - ini);
|
||||
len -= (ini_line - ini);
|
||||
ini += (ini_line - ini);
|
||||
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1243,3 +1243,163 @@ char *uwsgi_cheap_string(char *buf, int len) {
|
||||
return buf-1;
|
||||
}
|
||||
|
||||
|
||||
char *uwsgi_open_and_read(char *url, int *size, int add_zero) {
|
||||
|
||||
int fd;
|
||||
struct stat sb;
|
||||
char *buffer = NULL;
|
||||
char byte;
|
||||
ssize_t len;
|
||||
char *uri, *colon;
|
||||
char *domain ;
|
||||
char *ip ;
|
||||
struct hostent *he;
|
||||
int body = 0;
|
||||
|
||||
// http url ?
|
||||
if (!strncmp("http://", url, 7)) {
|
||||
domain = url+7;
|
||||
uri = strchr(domain, '/');
|
||||
if (!uri) {
|
||||
uwsgi_log("invalid http url\n");
|
||||
exit(1);
|
||||
}
|
||||
uri[0] = 0;
|
||||
uwsgi_log("domain: %s\n", domain);
|
||||
|
||||
colon = uwsgi_get_last_char(domain, ':');
|
||||
|
||||
if (colon) {
|
||||
colon[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
he = gethostbyname(domain);
|
||||
if (!he || !*he->h_addr_list || he->h_addrtype != AF_INET) {
|
||||
uwsgi_log("unable to resolve address %s\n", domain);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ip = inet_ntoa( *( struct in_addr*) he->h_addr_list[0]);
|
||||
if (!ip) {
|
||||
uwsgi_log("unable to resolve address %s\n", domain);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (colon) {
|
||||
colon[0] = ':';
|
||||
ip = uwsgi_concat2(ip, colon);
|
||||
}
|
||||
else {
|
||||
ip = uwsgi_concat2(ip, ":80");
|
||||
}
|
||||
|
||||
fd = uwsgi_connect(ip, 0, 0);
|
||||
|
||||
if (fd < 0) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
uri[0] = '/';
|
||||
|
||||
len = write(fd, "GET ", 4);
|
||||
len = write(fd, uri, strlen(uri));
|
||||
len = write(fd, " HTTP/1.0\r\n", 11 );
|
||||
len = write(fd, "Host: ", 6);
|
||||
|
||||
uri[0] = 0;
|
||||
len = write(fd, domain, strlen(domain));
|
||||
uri[0] = '/';
|
||||
|
||||
len = write(fd, "\r\n\r\n", 4);
|
||||
|
||||
while( read(fd, &byte, 1) == 1) {
|
||||
if (byte == '\r' && body == 0) {
|
||||
body = 1;
|
||||
}
|
||||
else if (byte == '\n' && body == 1) {
|
||||
body = 2;
|
||||
}
|
||||
else if (byte == '\r' && body == 2) {
|
||||
body = 3;
|
||||
}
|
||||
else if (byte == '\n' && body == 3) {
|
||||
body = 4;
|
||||
}
|
||||
else if (body == 4) {
|
||||
*size = *size+1;
|
||||
buffer = realloc(buffer, *size);
|
||||
if (!buffer) {
|
||||
uwsgi_error("realloc()");
|
||||
exit(1);
|
||||
}
|
||||
buffer[*size-1] = byte;
|
||||
}
|
||||
else {
|
||||
body = 0;
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
if (add_zero) {
|
||||
*size = *size + 1;
|
||||
buffer = realloc(buffer, *size);
|
||||
buffer[*size] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
// fallback to file
|
||||
else {
|
||||
fd = open(url, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
uwsgi_error("open()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (fstat(fd, &sb)) {
|
||||
uwsgi_error("fstat()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
buffer = malloc(sb.st_size+add_zero);
|
||||
|
||||
if (!buffer) {
|
||||
uwsgi_error("malloc()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
len = read(fd, buffer, sb.st_size);
|
||||
if (len != sb.st_size) {
|
||||
uwsgi_error("read()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
*size = sb.st_size+add_zero;
|
||||
|
||||
if (add_zero)
|
||||
buffer[sb.st_size] = 0;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char *uwsgi_get_last_char(char *what, char c) {
|
||||
int i,j=0;
|
||||
char *ptr = NULL;
|
||||
|
||||
if (!strncmp("http://", what, 7)) j = 7;
|
||||
|
||||
for(i=j;i<(int)strlen(what);i++) {
|
||||
if (what[i] == c) {
|
||||
ptr = what+i;
|
||||
}
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@@ -1208,7 +1208,7 @@ int uwsgi_start(void *v_argv) {
|
||||
}
|
||||
|
||||
|
||||
// put listening socket i non-blocking state
|
||||
// put listening socket in non-blocking state
|
||||
for (i = 0; i < uwsgi.sockets_cnt; i++) {
|
||||
uwsgi.sockets[i].arg = fcntl(uwsgi.sockets[i].fd, F_GETFL, NULL);
|
||||
if (uwsgi.sockets[i].arg < 0) {
|
||||
|
||||
@@ -65,6 +65,8 @@
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
@@ -1375,3 +1377,6 @@ void log_syslog(char *);
|
||||
|
||||
struct uwsgi_gateway *register_gateway(char *, void (*)(void));
|
||||
void gateway_respawn(int);
|
||||
|
||||
char *uwsgi_open_and_read(char *, int *, int);
|
||||
char *uwsgi_get_last_char(char *, char);
|
||||
|
||||
@@ -24,8 +24,10 @@ void uwsgi_xml_config(struct wsgi_request *wsgi_req, int app_tag) {
|
||||
|
||||
char *xml_id;
|
||||
int i;
|
||||
char *xml_content;
|
||||
int xml_size = 0;
|
||||
|
||||
colon = strchr(uwsgi.xml_config, ':');
|
||||
colon = uwsgi_get_last_char(uwsgi.xml_config, ':');
|
||||
if (colon) {
|
||||
colon[0] = 0;
|
||||
colon++;
|
||||
@@ -36,7 +38,9 @@ void uwsgi_xml_config(struct wsgi_request *wsgi_req, int app_tag) {
|
||||
uwsgi_log( "[uWSGI] using xml uwsgi id: %s\n", colon);
|
||||
}
|
||||
|
||||
doc = xmlReadFile(uwsgi.xml_config, NULL, 0);
|
||||
xml_content = uwsgi_open_and_read(uwsgi.xml_config, &xml_size, 0);
|
||||
|
||||
doc = xmlReadMemory(xml_content, xml_size, uwsgi.xml_config, NULL, 0);
|
||||
if (doc == NULL) {
|
||||
uwsgi_log( "[uWSGI] could not parse file %s.\n", uwsgi.xml_config);
|
||||
exit(1);
|
||||
|
||||
@@ -86,10 +86,8 @@ char *yaml_get_line(char *yaml, off_t size) {
|
||||
|
||||
void uwsgi_yaml_config(char *file) {
|
||||
|
||||
int fd;
|
||||
ssize_t len;
|
||||
int len = 0;
|
||||
char *yaml;
|
||||
struct stat sb;
|
||||
|
||||
int depth;
|
||||
int current_depth = 0;
|
||||
@@ -107,7 +105,7 @@ void uwsgi_yaml_config(char *file) {
|
||||
char *section_asked = "uwsgi";
|
||||
char *colon;
|
||||
|
||||
colon = strchr(file, ':');
|
||||
colon = uwsgi_get_last_char(file, ':');
|
||||
if (colon) {
|
||||
colon[0] = 0;
|
||||
if (colon[1] != 0) {
|
||||
@@ -117,36 +115,10 @@ void uwsgi_yaml_config(char *file) {
|
||||
|
||||
uwsgi_log("[uWSGI] getting YAML configuration from %s\n", file);
|
||||
|
||||
fd = open(file, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
uwsgi_error("open()");
|
||||
exit(1);
|
||||
}
|
||||
yaml = uwsgi_open_and_read(file, &len, 1);
|
||||
|
||||
if (fstat(fd, &sb)) {
|
||||
uwsgi_error("fstat()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
yaml = malloc(sb.st_size+1);
|
||||
|
||||
if (!yaml) {
|
||||
uwsgi_error("malloc()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
len = read(fd, yaml, sb.st_size);
|
||||
if (len != sb.st_size) {
|
||||
uwsgi_error("read()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
yaml[sb.st_size] = 0;
|
||||
|
||||
while(sb.st_size) {
|
||||
yaml_line = yaml_get_line(yaml, sb.st_size);
|
||||
while(len) {
|
||||
yaml_line = yaml_get_line(yaml, len);
|
||||
if (yaml_line == NULL) {
|
||||
break;
|
||||
}
|
||||
@@ -158,7 +130,7 @@ void uwsgi_yaml_config(char *file) {
|
||||
if (depth <= current_depth) {
|
||||
current_depth = depth;
|
||||
// end the parsing cycle
|
||||
if (in_uwsgi_section) goto end;
|
||||
if (in_uwsgi_section) return;
|
||||
}
|
||||
else if (depth > current_depth && !in_uwsgi_section) {
|
||||
goto next;
|
||||
@@ -170,7 +142,7 @@ void uwsgi_yaml_config(char *file) {
|
||||
|
||||
// skip list and {} defined dict
|
||||
if (key[0] == '-' || key[0] == '[' || key[0] == '{') {
|
||||
if (in_uwsgi_section) goto end;
|
||||
if (in_uwsgi_section) return;
|
||||
goto next;
|
||||
}
|
||||
|
||||
@@ -188,7 +160,7 @@ void uwsgi_yaml_config(char *file) {
|
||||
if (!val) {
|
||||
val = strstr(key, ":\t");
|
||||
}
|
||||
if (!val) goto end;
|
||||
if (!val) return;
|
||||
// get the right key
|
||||
val[0] = 0;
|
||||
// yeah overengeneering....
|
||||
@@ -216,14 +188,11 @@ void uwsgi_yaml_config(char *file) {
|
||||
}
|
||||
}
|
||||
next:
|
||||
sb.st_size -= (yaml_line - yaml);
|
||||
len -= (yaml_line - yaml);
|
||||
yaml += (yaml_line - yaml);
|
||||
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
close(fd);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user