예제 #1
0
파일: http_multi.c 프로젝트: gaaf/kamailio
/* CURLOPT_WRITEFUNCTION */
size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
{
	size_t realsize = size * nmemb;
	struct http_m_cell *cell;
	CURL *easy = (CURL*) data;
	int old_len;

	LM_DBG("data received: %.*s [%d]\n", (int)realsize, (char*)ptr, (int)realsize);

	cell = http_m_cell_lookup(easy);
	if (cell == NULL) {
		LM_ERR("Cell for handler %p not found in table\n", easy);
		return -1;
	}

	if (cell->reply == NULL) {
		cell->reply = (struct http_m_reply*)shm_malloc(sizeof(struct http_m_reply));
		if (cell->reply == NULL) {
			LM_ERR("Cannot allocate shm memory for reply\n");
			return -1;
		}
		memset( cell->reply, 0, sizeof(struct http_m_reply) );
		cell->reply->result = (str *)shm_malloc(sizeof(str));
		if (cell->reply->result == NULL) {
			LM_ERR("Cannot allocate shm memory for reply's result\n");
			shm_free(cell->reply);
			return -1;
		}
		memset( cell->reply->result, 0, sizeof(str) );
	}

	old_len = cell->reply->result->len;
	cell->reply->result->len += realsize;
	cell->reply->result->s = (char*)shm_reallocxf(cell->reply->result->s, cell->reply->result->len);
	if (cell->reply->result->s == NULL) {
		LM_ERR("Cannot allocate shm memory for reply's result\n");
		shm_free(cell->reply->result);
		shm_free(cell->reply);
		cell->reply = NULL;
		return -1;
	}
	strncpy(cell->reply->result->s + old_len, ptr, cell->reply->result->len - old_len);

	if (cell->easy == NULL ) { /* TODO: when does this happen? */
		LM_DBG("cell %p easy handler is null\n", cell);
	}
	else {
		LM_DBG("getting easy handler info (%p)\n", cell->easy);
		curl_easy_getinfo(cell->easy, CURLINFO_HTTP_CODE, &cell->reply->retcode);
	}

	return realsize;
}
예제 #2
0
int header_list_add(struct header_list *hl, str* hdr) {
	char *tmp;

	hl->len++;
	hl->t = shm_reallocxf(hl->t, hl->len * sizeof(char*));
	if (!hl->t) {
		LM_ERR("shm memory allocation failure\n");
		return -1;
	}
	hl->t[hl->len - 1] = shm_malloc(hdr->len + 1);
	tmp = hl->t[hl->len - 1];
	if (!tmp) {
		LM_ERR("shm memory allocation failure\n");
		return -1;
	}
	memcpy(tmp, hdr->s, hdr->len);
	*(tmp + hdr->len) = '\0';

	LM_DBG("stored new http header: [%s]\n", tmp);
	return 1;
}