Esempio n. 1
0
int lsp::luabag_run(LUABAG* luabag, FCGX_Request* r)
{
	int handler_type = handler_type_unknown;

	char* handler = FCGX_GetParam("SCRIPT_NAME", r->envp);

	if(handler)
    {
		handler=strrchr(handler,'.');
		if(!handler)
		{
			log(LOG_ERR, "%s", "Script name has no extension name");
			return -1;
		}
		if(!strcmp(handler,".lsp") || !strcmp(handler,".lp") ) 
			handler_type = handler_type_lsp;
		else if(!strcmp(handler,".lua"))
		{
			handler_type = handler_type_lua;
			log(LOG_ERR, "%s", "lua handler");
		}
		else
		{
			log(LOG_ERR, "%s:%s", "Not correct extension name, valid extension are lp, lsp, lua", handler);
			return -1;
		}
    }
	else
	{
		log(LOG_ERR, "%s", "Not script name");
		return -1;
	}

    lsp_io lio={r, lputs:io_def_puts, lputc:io_def_putc, lwrite:io_def_write};

    luaL_lsp_set_io(luabag->L,&lio);

	char* p = FCGX_GetParam("REQUEST_METHOD", r->envp);
	if(p && !strcmp(p,"POST"))
    {
		int rc = read_request_data(luabag->L);
		if(rc!= 0)
			return rc;
    }

	p = FCGX_GetParam("QUERY_STRING", r->envp);
    luaL_lsp_setargs(luabag->L, p, p ? strlen(p) : 0);

    lua_getfield(luabag->L,LUA_GLOBALSINDEX,"env");    
    //luaL_lsp_setfield(luabag->L,"server_admin",r->server->server_admin);
    luaL_lsp_setfield(luabag->L,"server_hostname", FCGX_GetParam("SERVER_NAME", r->envp));
    luaL_lsp_setfield(luabag->L,"remote_ip",FCGX_GetParam("REMOTE_ADDR", r->envp));
    luaL_lsp_setfield(luabag->L,"remote_host",FCGX_GetParam("REMOTE_ADDR", r->envp));
    luaL_lsp_setfield(luabag->L,"remote_port",FCGX_GetParam("REMOTE_PORT", r->envp));
    luaL_lsp_setfield(luabag->L,"local_ip", FCGX_GetParam("SERVER_ADDR", r->envp));
	luaL_lsp_setfield(luabag->L,"local_host",FCGX_GetParam("SERVER_NAME", r->envp));
    luaL_lsp_setfield(luabag->L,"local_port",FCGX_GetParam("SERVER_PORT", r->envp));
	char hostname[256];
	if (0 == gethostname(hostname, 256))
	{
		luaL_lsp_setfield(luabag->L,"local_host", hostname);
		luaL_lsp_setfield(luabag->L,"hostname", hostname);
	}
    luaL_lsp_setfield(luabag->L,"method", FCGX_GetParam("REQUEST_METHOD", r->envp));
    luaL_lsp_setfield(luabag->L,"handler", handler);
    luaL_lsp_setfield(luabag->L,"uri", FCGX_GetParam("REQUEST_URI", r->envp));
    luaL_lsp_setfield(luabag->L,"doc_uri", FCGX_GetParam("DOCUMENT_URI", r->envp));
    luaL_lsp_setfield(luabag->L,"doc_root", FCGX_GetParam("DOCUMENT_ROOT", r->envp));
	char* filename = FCGX_GetParam("SCRIPT_FILENAME", r->envp);
    luaL_lsp_setfield(luabag->L,"filename", filename);
    luaL_lsp_setfield(luabag->L,"accept_lang", FCGX_GetParam("HTTP_ACCEPT_LANGUAGE", r->envp));
    lua_pop(luabag->L,1);
    
    luaL_lsp_chdir_to_file(luabag->L, filename);
    
    luaL_lsp_session_init(luabag->L,
			!g_conf->cookie_name.empty() ? g_conf->cookie_name.c_str() : "LSPSESSID",
			g_conf->cookie_days > 0 ? g_conf->cookie_days : 7,
			!g_conf->cookie_path.empty() ? g_conf->cookie_path.c_str() : "/");
    
    int status=0;
    
    switch(handler_type)
    {
		case handler_type_lsp: 
			status=luaL_load_lsp_file(luabag->L, filename); 
			header_table_set(r, "CONTENT-TYPE", "text/html");
			break;
		case handler_type_lua:
			status=luaL_loadfile(luabag->L, filename);
			header_table_set(r, "CONTENT-TYPE", "text/plain");
			break;
    }

    if(status)
    {
		const char* e=lua_tostring(luabag->L,-1);
		FCGX_PutS(e, r->err);

		log(LOG_ERR, "%s", e);

        lua_pop(luabag->L,1);
		luaL_lsp_chdir_restore(luabag->L);
		return 500;
    }

    status=lua_pcall(luabag->L,0,LUA_MULTRET,0);
	// won't return other than 0, as the code has been excuted with outputs
    
    if(status)
    {
		const char* e=lua_tostring(luabag->L,-1);

		log(LOG_ERR, "%s", e);
		FCGX_PutS(e, r->err);

		if(g_conf->show_exception)	// if not 0
			FCGX_PutS(e, r->err);

		lua_pop(luabag->L,1);
    }
    

    int rnum=lua_gettop(luabag->L);

    int result = 0;
    
    if(rnum>0)
    {
		result = lua_tointeger(luabag->L,-1);

		if(!result || result==200)
			result = 0;

		lua_pop(luabag->L,rnum);
    }

    luaL_lsp_chdir_restore(luabag->L);

	/*
    if(result == 0)
		FCGX_FFlush(r->out);
	else
		FCGX_FFlush(r->err);
		*/

    return result;
}
Esempio n. 2
0
int luaL_do_lsp_file(lua_State* L,const char* filename)
{
    int status;

    if(!llsplib::use_cache)
    {
	if((status=luaL_load_lsp_file(L,filename)) || (status=lua_pcall(L,0,0,0)))
	    return status;
		
	return 0;
    }

    char cachefile[512];

    int n=snprintf(cachefile,sizeof(cachefile),"%s.luac",filename);
    if(n<0 || n>=0)
	cachefile[sizeof(cachefile)-1]=0;

    time_t mtime1=0;
    time_t mtime2=0;
    
    {
	struct stat st;
	if(!lstat(filename,&st))
	    mtime1=st.st_mtime;
	if(!lstat(cachefile,&st))
	    mtime2=st.st_mtime;
    }
    
    if(llsplib::use_cache==1)
    {
	if(mtime2)
	{
	    if((status=luaL_loadfile(L,cachefile)) || (status=lua_pcall(L,0,0,0)))
		return status;
	}else
	{
	    if((status=luaL_load_lsp_file(L,filename)) || (status=lua_pcall(L,0,0,0)))
		return status;
	}
	return 0;
    }


    if(!mtime2 || mtime2<mtime1)
    {

	if((status=luaL_load_lsp_file(L,filename)))
	    return status;
	    
        char tmp[]="/tmp/lsp_cache.XXXXXX";

	int fd=mkstemp(tmp);
	if(fd!=-1)
	{
	    status=lua_dump(L,llsplib::lsp_writer,&fd);
	    close(fd);
	    
	    if(!status)
		rename(tmp,cachefile);
	}

	if((status=lua_pcall(L,0,0,0)))
	    return status;

	return 0;
    }

    if((status=luaL_loadfile(L,cachefile)) || (status=lua_pcall(L,0,0,0)))
	return status;

    return 0;
}