void* rho_dispatch(struct conn *c, const char* path) { RouteRef route; if ( _shttpd_match_extension(c->uri,"css,js,html,htm,png,bmp,jpg") ) return NULL; if ((route = _alloc_route(c->uri)) != NULL) { if (_parse_route(route)) { struct stat st; //is this an actual file or folder if (_shttpd_stat(path, &st) != 0) return route; //is this a folder if (S_ISDIR(st.st_mode)) { //check if there is controller.rb to run char filename[FILENAME_MAX]; int len = strlen(path); char* slash = path[len-1] == '\\' || path[len-1] == '/' ? "" : "/"; _shttpd_snprintf(filename,sizeof(filename),"%s%s%s",path,slash,"controller.iseq"); if ((_shttpd_stat(filename, &st) == 0)&&(!S_ISDIR(st.st_mode))) { printf("Run controller on this url: %s\n", c->uri); return route; } } } _free_route(route); } return NULL; }
void* rho_dispatch(struct conn *c, const char* path) { RouteRef route; if ( _shttpd_match_extension(c->uri,"css,js,html,htm,png,bmp,jpg") ) return NULL; #ifdef __SYMBIAN32__ if ( strstr(_shttpd_known_http_methods[c->method].ptr, "GET" ) ) webview_set_current_location(c->uri); #endif if ((route = _alloc_route(c->uri)) != NULL) { if (_parse_route(route)) { struct stat st; //is this an actual file or folder if (_shttpd_stat(path, &st) != 0) return route; //is this a folder if (S_ISDIR(st.st_mode)) { //check if there is controller.rb to run char filename[FILENAME_MAX]; int len = strlen(path); char* slash = path[len-1] == '\\' || path[len-1] == '/' ? "" : "/"; _shttpd_snprintf(filename,sizeof(filename),"%s%s%s",path,slash,"controller.iseq"); if ((_shttpd_stat(filename, &st) == 0)&&(!S_ISDIR(st.st_mode))) { RAWLOG_INFO1("Run controller on this url: %s", c->uri); return route; } } } _free_route(route); } return NULL; }
char* rho_resolve_url(char* url, const char* root,const char *index_names) { char path[URI_MAX]; struct stat st; char* tmp_url; char* ret; int full_len; char* full_path = strstr(url,"http://"); if (full_path) { return full_path; } if (strlen(url) + strlen(root) >= sizeof(path)) { tmp_url = url; } else { _shttpd_snprintf(path, sizeof(path), "%s%s", root, url); if ( _shttpd_stat(path, &st) == -1 ) { tmp_url = url; } else if ( S_ISDIR(st.st_mode) ) { tmp_url = _rho_resolve_index(url,path,index_names); } else { tmp_url = url; } } #if defined(__SYMBIAN32__) || defined(OS_WINDOWS) || defined(OS_WINCE) full_len = strlen(get_home_url())+strlen(tmp_url)+1; ret = malloc(full_len); _shttpd_snprintf(ret, full_len, "%s%s", get_home_url(), tmp_url); #else full_len = strlen(localhost)+strlen(tmp_url)+1; ret = malloc(full_len); _shttpd_snprintf(ret, full_len, "%s%s", localhost, tmp_url); #endif free(tmp_url); return ret; }
static char* _rho_resolve_index(char* url,char* path,const char *index_names) { char filename[FILENAME_MAX]; struct stat st; //check if there is controller.rb int len = strlen(path); char* slash = path[len-1] == '\\' || path[len-1] == '/' ? "" : "/"; _shttpd_snprintf(filename,sizeof(filename),"%s%s%s",path,slash,"controller.iseq"); if ((_shttpd_stat(filename, &st) == 0)&&(!S_ISDIR(st.st_mode))) { return url; } len = strlen(url); if (url[len-1]!='/') { char* tmp_url = malloc(len+2); _shttpd_snprintf(tmp_url,len+2,"%s/",url); free(url); return tmp_url; } return url; }