示例#1
0
void wsframe_free(wsFrame * frame) {
	if (NULL != frame && frame->len > 0) {
		automem_t mem;
		mem.pdata = frame->pdata;
		mem.buffersize = mem.size = frame->len;
		automem_uninit(&mem);
	}
	free(frame);
}
示例#2
0
/* 对模板文件进行编译.*/
int _lua_tpl_compile(lua_State * L)
{
    int cache = 0,lbuf = 0;
    unsigned int _var_size = 0;
    size_t lfile;

    const char *cfile = NULL,
                * file= luaL_checklstring(L, 1,&lfile),
                  * buf = NULL;
#if defined(_WIN32) || defined(_WIN64)
    automem_t mem= {NULL};
#else
    automem_t mem= {
        .size = 0,
        .pdata = NULL
    };
#endif

    if(lua_isboolean(L, 2))
        cache =lua_toboolean(L, 2);

    if(0 != cache) {
        struct stat st1,st2;
        cfile=(char *)malloc(lfile+5);
        memcpy((char *)cfile,file,lfile);
        strcpy((char *)cfile+lfile,".tpl");
        if((0 == stat(file,&st1)) && (0 == stat(cfile, &st2)))
        {
            if(st1.st_mtime <= st2.st_mtime) {
                read_from_cached(L, &mem, cfile);
                free((void*)cfile);
                lua_pushlstring(L, mem.pdata, mem.size);
                goto lua_tpl_compile_final;
            }
        }
    }

    if(NULL != (buf = file_get_contents(file, &lbuf)))
    {
        lua_tpl_expand_variables(L, &mem, lbuf);
        _var_size = mem.size;
        lua_tpl_compile_local(L, &mem, buf, lbuf);
        free((void*)buf);
        lua_pushlstring(L,(char *)mem.pdata,mem.size);
    }
    if(0 != cache && mem.pdata != NULL)
        file_put_contents(cfile, mem.pdata + _var_size, mem.size - _var_size);

    if(NULL != cfile)
        free((void *)cfile);
lua_tpl_compile_final:
    automem_uninit(&mem);
    return 1;
}
示例#3
0
文件: webctx.c 项目: bywayboy/openwrt
static int getBodyParams(lua_State * L, char * s) {
	automem_t mem;
	automem_init(&mem, 128);
	lua_newtable(L);
	do {
		lua_url_decode(L, s++, &mem);
		s = strchr(s, '&');
	} while (s);
	automem_uninit(&mem);
	return 1;
}
示例#4
0
文件: melo.c 项目: susemm/melo
static void _cb_after_send_mem(uv_write_t * w, int status) 
{
    MELO_ASSERT(NULL != w, "w is NULL");
    MELO_ASSERT(OK == status, "_cb_after_send_mem failed");

    //see uxv_send_mem()
    automem_t mem;
    mem.pdata = (unsigned char*)w->data;
    automem_uninit(&mem);

    free(w);
}
示例#5
0
static void after_queue_work(uv_work_t* req, int status)
{
	automem_t mem;
	webqueuework_t * qwork = container_of(req, webqueuework_t, work);
	rbnode_t * n = rb_first(&qwork->request->headers);

	automem_init(&mem, 256);
	if (qwork->conn->proto == WEB_PROTO_HTTP) {
		if (qwork->status == 101 && qwork->request->upgrade) {
			webheader_t k;
			rbnode_t * n;
			const char * ver = NULL, *key = NULL;
			k.key = "Sec-WebSocket-Version";
			if (n = rb_find(&qwork->request->headers, &k.n)) ver = container_of(n, webheader_t, n)->val;
			k.key = "Sec-WebSocket-Key";
			if (n = rb_find(&qwork->request->headers, &k.n)) key = container_of(n, webheader_t, n)->val;
			if (NULL != key && NULL != ver) {
				ws_do_handeshake(&mem, key, strlen(key));
				qwork->conn->proto = WEB_PROTO_WEBSOCKET;
				if (uv_is_active((uv_handle_t *)&qwork->conn->conn)) {
					wsparser_init(&qwork->conn->ws_parser, 13, 20480);
					qwork->conn->request = webrequest_get(qwork->request);//引用起来,不丢掉.
				}
				goto contents_prepare_final;
			}
		}
		rbnode_t * n = rb_first(&qwork->headers);
		automem_init_headers(&mem, qwork->status, qwork->flags);
		while (n) {
			webheader_t * h = container_of(n, webheader_t, n);
			automem_append_voidp(&mem, h->key, strlen(h->key));
			automem_append_voidp(&mem, ": ", 2);
			automem_append_voidp(&mem, h->val, strlen(h->val));
			automem_append_voidp(&mem, "\r\n", 2);
			n = rb_next(n);
		}
		automem_append_contents(&mem, qwork->mem.pdata, qwork->mem.size);

	}
	else if(qwork->conn->proto==WEB_PROTO_WEBSOCKET) {
		wsframe_make(&mem, WS_TEXT_FRAME, 0, qwork->mem.pdata, qwork->mem.size);
	}
contents_prepare_final:
	if (0 != webconn_sendmem(qwork->conn, &mem)) {
		automem_uninit(&mem);
	}
	webqueuework_free(qwork);
}
示例#6
0
文件: automem.c 项目: cosim/uvx
int automem_erase_ex(automem_t* pmem, unsigned int size,unsigned int limit)
{

	if(size < pmem->size)
	{
		unsigned int newsize = pmem->size - size;

		if(pmem->buffersize > (newsize + limit))
		{
#if defined(_WIN32) || defined(_WIN64)
			char * buffer = (char*) HeapAlloc(GetProcessHeap(), 0, newsize + limit);
			memcpy(buffer, pmem->pdata + size, newsize);
			HeapFree(GetProcessHeap(),0,pmem->pdata);
#else
			char * buffer = (unsigned char*) malloc(newsize + limit);
			memcpy(buffer, pmem->pdata + size, newsize);
			free(pmem->pdata);
#endif
			pmem->pdata = (unsigned char*)buffer;
			pmem->size = newsize;
			pmem->buffersize = newsize + limit;
		}	
		else
		{
			memmove(pmem->pdata, pmem->pdata + size, newsize);
			pmem->size = newsize;
		}
	}
	else
	{
		pmem->size = 0;
		if(pmem->buffersize > limit)
		{
			automem_uninit(pmem);
			automem_init(pmem, limit);
		}
	}
	return pmem->size;
	
}
示例#7
0
static void webrequest_threadproc(uv_work_t * req)
{
	int ref = LUA_NOREF,sess_ref = LUA_NOREF;
	automem_t mem;
	webqueuework_t * qwork = container_of(req, webqueuework_t, work);
	
	lua_State * L = luaL_newstate();

	qwork->flags = qwork->conn->flags;
	luaL_openlibs(L);
	ref = lua_pushwebctx(L, qwork);
	sess_ref = luasession_init(L,qwork);
	automem_init(&mem,100);
	automem_append_voidp(&mem, "require(\"", sizeof("require(\"") - 1);
	automem_append_voidp(&mem, qwork->request->file, strlen(qwork->request->file));

	switch (qwork->conn->proto) {
	case WEB_PROTO_HTTP:
		automem_append_voidp(&mem, "\"):main()", sizeof("\"):main()"));
		break;
	case WEB_PROTO_WEBSOCKET:
		automem_append_voidp(&mem, "\"):websocket()", sizeof("\"):websocket()"));
		break;
	}
	luaL_dostring(L, mem.pdata);
	if (LUA_TSTRING == lua_type(L, -1)) {
		size_t len;
		const char * err = lua_tolstring(L, -1, &len);
		
		qwork->status = 500;
		automem_append_voidp(&qwork->mem, err, len);
	}

	automem_uninit(&mem);
	luaL_unref(L,LUA_REGISTRYINDEX, ref);
	lua_close(L);
}
示例#8
0
void wsparser_uninit(wsparser_t * parser) {
	automem_uninit(&parser->buf);
}
示例#9
0
文件: automem.c 项目: cosim/uvx
/*清理并重新初始化*/
void automem_clean(automem_t* pmen)
{
	automem_uninit(pmen);
	automem_init(pmen,128);
}