blob: ab4b0ef0ac901e1272a42da48f5cc4a27ed12377 [file] [log] [blame]
#include <sys/epoll.h>
#include <string.h>
#include "mbtk_log.h"
#include "mbtk_http_base.h"
static bool http_sock_inited = FALSE;
static mbtk_sock_handle http_handle = -1;
static mbtk_sock_session http_fd = -1;
static void http_sock_cb_func(mbtk_sock_handle handle, mbtk_sock_cb_info_s *sock_info)
{
if(http_handle == handle && sock_info && http_fd == sock_info->sock_fd) {
if(sock_info->event & EPOLLIN) { // READ
} else if(sock_info->event & EPOLLRDHUP) { // Close
} else {
LOGW("Unknown event:%x",sock_info->event);
}
}
}
int mbtk_http_init()
{
if(http_sock_inited) {
LOGE("HTTP has inited.");
return -1;
}
mbtk_init_info init_info;
memset(&init_info, 0x0, sizeof(mbtk_init_info));
init_info.net_type = MBTK_NET_LINUX;
init_info.sock_cb = http_sock_cb_func;
http_handle = mbtk_sock_init(&init_info);
if(http_handle < 0) {
LOGE("mbtk_sock_init() fail.");
return -1;
}
http_sock_inited = TRUE;
return 0;
}
int mbtk_http_deinit()
{
if(!http_sock_inited) {
LOGE("HTTP not inited.");
return -1;
}
int err = mbtk_sock_deinit(http_handle);
if(err != MBTK_SOCK_SUCCESS) {
LOGE("mbtk_sock_deinit() fail.");
return -1;
}
http_handle = -1;
http_sock_inited = FALSE;
return 0;
}
int mbtk_http_open
(
bool is_ssl,
bool ingnore_cert,
const void *host,
uint16 port
)
{
int err;
mbtk_sock_info sock_info;
memset(&sock_info,0x0,sizeof(mbtk_sock_info));
sock_info.type = MBTK_SOCK_TCP;
sock_info.is_support_ssl = is_ssl;
sock_info.ingnore_cert = ingnore_cert;
memcpy(sock_info.address,host,strlen(host));
sock_info.port = port;
http_fd = mbtk_sock_open(http_handle,&sock_info, 3000, &err);
return http_fd;
}
/*=============================================
FUNCTION
mbtk_http_read
DESCRIPTION
read content from socket.
DEPENDENCIES
None
PARAMETERS
*buf Store read content.
len the length of Content.
timeout Set timeout
RETURN VALUE
Length of read content
SIDE EFFECTS
None
=============================================*/
int mbtk_http_read
(
int sock_fd,
void *buf,
uint16 len,
int timeout_ms
)
{
int err;
int read_len = mbtk_sock_read(http_handle, sock_fd, buf, len, timeout_ms, &err);
if(read_len < 0) {
if(err == MBTK_SOCK_ETIMEOUT) {
return -2;
} else {
return -1;
}
} else {
return read_len;
}
}
#if 0
int mbtk_http_read_line
(
FILE *file,
void *buf,
uint16 len
)
{
if(file) {
char *buf_ptr = (char*)buf;
char *line = NULL;
read_again:
line = fgets(buf_ptr,len,file);
if(!line && errno == EWOULDBLOCK) {
usleep(100000);
goto read_again;
}
if(line && strlen(line) > 0
&& strlen(line) <= len
&& buf_ptr[strlen(line) - 1] == '\n') {
LOGV("Read-Line[%d]:%s",strlen(line),line);
return strlen(line);
}else{
LOGE("fgets() fail.");
return -1;
}
}
return -1;
}
#else
int mbtk_http_read_line
(
int sock_fd,
void *buf,
uint16 len
)
{
#if 1
if(sock_fd > 0) {
char *buf_ptr = (char*)buf;
char read_buf[1];
int read_len = 0;
while(TRUE) {
if(mbtk_sock_read_sync(http_handle, sock_fd, read_buf, 1) == 1) {
*buf_ptr++ = read_buf[0];
read_len++;
if(read_buf[0] == '\n' || read_len >= len) {
return read_len;
}
} else {
return -1;
}
}
}
#else
if(http_handle >= 0) {
char *buf_ptr = (char*)buf;
char read_buf[1];
int read_len = 0;
while(TRUE) {
if(read(http_fd, read_buf, 1) == 1) {
*buf_ptr++ = read_buf[0];
read_len++;
if(read_buf[0] == '\n' || read_len >= len) {
return read_len;
}
} else {
if(errno == EWOULDBLOCK) {
usleep(100000);
}
}
}
}
#endif
return -1;
}
#endif
/*=============================================
FUNCTION
mbtk_http_write
DESCRIPTION
Write content to socket.
DEPENDENCIES
None
PARAMETERS
*buf Content to be transferred
len the length of Content.
RETURN VALUE
Length of written content
SIDE EFFECTS
None
=============================================*/
int mbtk_http_write
(
int sock_fd,
void *buf,
uint16 len
)
{
int err;
LOGV("Write[%d]:%s",len,(char*)buf);
return mbtk_sock_write(http_handle, sock_fd, buf, len, 300, &err);
}
/*=============================================
FUNCTION
mbtk_http_close
DESCRIPTION
close HTTP service.
DEPENDENCIES
None
PARAMETERS
*err Error number
RETURN VALUE
TURE or FALSE
SIDE EFFECTS
None
=============================================*/
int mbtk_http_close(int sock_fd)
{
int err;
if(mbtk_sock_close(http_handle, sock_fd,1000, &err)) {
return -1;
}
sock_fd = -1;
return 0;
}