change some parameters in the library to meet the needs of the website httpbin.org
Fork of MiniTLS-GPL by
cpp/TLSSocket.cpp
- Committer:
- shiyilei
- Date:
- 2015-02-06
- Revision:
- 5:95f70ebfe61f
- Parent:
- 2:527a66d0a1a9
File content as of revision 5:95f70ebfe61f:
/* MiniTLS - A super trimmed down TLS/SSL Library for embedded devices Author: Donatien Garnier Copyright (C) 2013-2014 AppNearMe Ltd This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *//** * \file TLSSocket.cpp * \copyright Copyright (c) AppNearMe Ltd 2013 * \author Donatien Garnier */ #define __DEBUG__ 0//4 #ifndef __MODULE__ #define __MODULE__ "TLSSocket.cpp" #endif #include "core/fwk.h" #include "TLSSocket.h" #include "tls/minitls.h" #include "tls/tls_socket.h" /** Instantiate a TLS socket * */ TLSSocket::TLSSocket(MiniTLS* pMiniTLS) : m_pMiniTLS(pMiniTLS) { } TLSSocket::~TLSSocket() { } /** Initialize socket * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise */ minitls_err_t TLSSocket::init() { int ret = tls_socket_init(&m_sock, &m_pMiniTLS->m_minitls, m_writeBuf, sizeof(m_writeBuf), m_readBuf, sizeof(m_readBuf)); if(ret) { ERR("Could not init socket: error %d", ret); return ret; } return MINITLS_OK; } /** Connect to server * \param hostname server to connect to * \param port port to connect to * \param timeout timeout in ms * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise */ minitls_err_t TLSSocket::connect(const char* hostname, uint16_t port, int timeout) { minitls_err_t ret = tls_socket_connect(&m_sock, hostname, port, timeout); if(ret) { return ret; } return MINITLS_OK; } /** Read data from server * \param buf buffer to read bytes to * \param minLength minimum number of bytes to read (will block before this number of bytes are read) * \param maxLength maximum number of bytes to read * \param readLength will receive actual number of bytes read * \param timeout timeout in ms * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise */ minitls_err_t TLSSocket::read(uint8_t* buf, size_t minLength, size_t maxLength, size_t* readLength, int timeout) { if(minLength > maxLength) { return MINITLS_ERR_PARAMETERS; } *readLength = 0; minitls_err_t ret; while( *readLength < minLength ) { ret = tls_socket_flush_read(&m_sock, timeout); if(ret == MINITLS_ERR_SOCKET_CLOSED) { return MINITLS_OK; } else if(ret) { return ret; } size_t bytesRead = 0; ret = tls_socket_read(&m_sock, buf + *readLength, maxLength - *readLength, &bytesRead); if(ret) { return ret; } *readLength += bytesRead; } return MINITLS_OK; } /** Write data to server * \param buf buffer to write bytes from * \param length number of bytes to write * \param writtenLength will receive actual number of bytes written * \param timeout timeout in ms * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise */ minitls_err_t TLSSocket::write(uint8_t* buf, size_t length, size_t* writtenLength, int timeout) { *writtenLength = 0; minitls_err_t ret; while( *writtenLength < length ) { size_t bytesToWrite = length - *writtenLength; size_t bytesWritten = 0; ret = tls_socket_write(&m_sock, buf + *writtenLength, bytesToWrite, &bytesWritten); if(ret == MINITLS_ERR_SOCKET_CLOSED) { return MINITLS_OK; } else if(ret) { return ret; } *writtenLength += bytesWritten; //Flush only if needed if( bytesWritten < bytesToWrite ) { ret = tls_socket_flush_write(&m_sock, timeout); if(ret) { return ret; } } } return MINITLS_OK; } /** Call to ensure transmission of bytes written using write * \param timeout timeout in ms * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise */ minitls_err_t TLSSocket::flush(int timeout) { minitls_err_t ret = tls_socket_flush_write(&m_sock, timeout); if(ret) { return ret; } return MINITLS_OK; } /** Tear down TLS connection and close socket * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise */ minitls_err_t TLSSocket::close() { minitls_err_t ret = tls_socket_close(&m_sock); if(ret) { return ret; } return MINITLS_OK; }