15 #define DISABLE_DEBUGLOG 18 #include "httpsession_p.h" 21 #include <gwenhywfar/syncio.h> 22 #include <gwenhywfar/syncio_socket.h> 23 #include <gwenhywfar/syncio_tls.h> 24 #include <gwenhywfar/syncio_http.h> 25 #include <gwenhywfar/syncio_file.h> 27 #include <gwenhywfar/misc.h> 28 #include <gwenhywfar/debug.h> 29 #include <gwenhywfar/gui.h> 30 #include <gwenhywfar/text.h> 54 sess->url=strdup(url);
56 sess->defaultProtocol=strdup(defaultProto);
57 sess->defaultPort=defaultPort;
140 if (sess->usage==1) {
144 free(sess->defaultProtocol);
145 free(sess->httpUserAgent);
146 free(sess->httpContentType);
162 oldFn=sess->initSyncIoFn;
163 sess->initSyncIoFn=f;
214 return sess->httpUserAgent;
224 free(sess->httpUserAgent);
226 sess->httpUserAgent=strdup(s);
228 sess->httpUserAgent=
NULL;
238 return sess->httpContentType;
248 free(sess->httpContentType);
250 sess->httpContentType=strdup(s);
252 sess->httpContentType=
NULL;
262 return sess->httpVMajor;
282 return sess->httpVMinor;
310 (sess->defaultProtocol)?(sess->defaultProtocol):
"http",
334 if (sess->syncIo==
NULL) {
363 "Pragma",
"no-cache");
365 "Cache-control",
"no cache");
367 if (sess->httpContentType)
369 "Content-type", sess->httpContentType);
371 if (sess->httpUserAgent)
373 "User-Agent", sess->httpUserAgent);
418 const char *httpCommand,
419 const uint8_t *buf, uint32_t blen)
429 I18N(
"Connecting to server..."));
434 "SSL-Error connecting (%d)", rv);
439 I18N(
"Could not connect to server"));
455 if (sess->httpVMajor) {
458 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d",
459 sess->httpVMajor, sess->httpVMinor);
460 numbuf[
sizeof(numbuf)-1]=0;
473 "Content-length", blen);
477 I18N(
"Sending message..."));
485 I18N(
"Could not send message (%d)"),
494 I18N(
"Message sent."));
503 const char *resultText,
504 const uint8_t *buf, uint32_t blen)
520 if (resultText && *resultText)
524 if (sess->httpVMajor) {
527 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
528 numbuf[
sizeof(numbuf)-1]=0;
555 I18N(
"Disconnecting from server..."));
559 I18N(
"Disconnected."));
578 else if ((rv>0 && rv<200) || rv>299) {
610 if (rv==301 || rv==303 || rv==305 || rv==307) {
652 I18N(
"Receiving response..."));
654 if (rv<0 || rv<200 || rv>299) {
656 "Error receiving packet (%d)", rv);
664 I18N(
"Received continuation response."));
670 I18N(
"Response received."));
675 I18N(
"Disconnecting from server..."));
679 I18N(
"Disconnected."));
703 if (rv<0 || (rv>0 && rv<200) || rv>299) {
754 else if (rv<200 || rv>299) {
764 if (rv==301 || rv==303 || rv==305 || rv==307) {
821 I18N(
"Receiving response..."));
823 if (rv<0 || rv<200 || rv>299) {
825 "Error receiving packet (%d)", rv);
853 I18N(
"Received continuation response."));
861 I18N(
"Response received."));
866 I18N(
"Disconnecting from server..."));
870 I18N(
"Disconnected."));
886 I18N(
"Connecting to server..."));
895 I18N(
"Could not connect to server"));
907 I18N(
"Disconnected."));
916 if (sess->initSyncIoFn)
917 return sess->initSyncIoFn(sess, sio);
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
void GWEN_Url_free(GWEN_URL *st)
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
#define GWEN_DB_FLAGS_OVERWRITE_VARS
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
struct GWEN_DB_NODE GWEN_DB_NODE
#define GWEN_INHERIT_FINI(t, element)
int GWEN_SyncIo_Http_RecvBodyToSio(GWEN_SYNCIO *sio, GWEN_SYNCIO *sout)
#define GWEN_ERROR_INVALID
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
#define GWEN_SYNCIO_FILE_FLAGS_READ
void GWEN_HttpSession_SetHttpContentType(GWEN_HTTP_SESSION *sess, const char *s)
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
#define DBG_NOTICE(dbg_logger, format, args...)
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSocketPassive(GWEN_SOCKET *sk, const char *proto, int port)
#define GWEN_FREE_OBJECT(varname)
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
#define GWEN_HTTP_SESSION_FLAGS_PASSIVE
int GWEN_HttpSession_RecvCommand(GWEN_HTTP_SESSION *sess, GWEN_DB_NODE *dbCommandAndHeader, GWEN_BUFFER *buf)
int GWEN_HttpSession__RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
int GWEN_HttpSession_InitSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
GWENHYWFAR_API int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
int GWEN_HttpSession_SendStatus(GWEN_HTTP_SESSION *sess, int resultCode, const char *resultText, const uint8_t *buf, uint32_t blen)
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
#define GWEN_NEW_OBJECT(typ, varname)
struct GWEN_SYNCIO GWEN_SYNCIO
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
GWEN_SYNCIO * GWEN_Gui_ExtendSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO *baseSio)
GWENHYWFAR_API int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text,...)
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
#define GWEN_HTTP_SESSION_FLAGS_NO_CACHE
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
#define GWEN_SYNCIO_FLAGS_PASSIVE
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
#define GWEN_INHERIT_INIT(t, element)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIoByTypeName(const GWEN_SYNCIO *sio, const char *typeName)
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
const char * GWEN_Url_GetServer(const GWEN_URL *st)
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
struct GWEN_HTTP_SESSION GWEN_HTTP_SESSION
void GWEN_HttpSession_SetFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
#define DBG_ERROR(dbg_logger, format, args...)
#define GWEN_SYNCIO_TLS_TYPE
int GWEN_HttpSession__RecvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
GWEN_URL * GWEN_Url_fromString(const char *str)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
#define DBG_INFO(dbg_logger, format, args...)
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
#define GWEN_SYNCIO_HTTP_TYPE
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
struct GWEN_SOCKET GWEN_SOCKET
GWEN_SYNCIO * GWEN_SyncIo_Socket_TakeOver(GWEN_SOCKET *socket)
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
int GWEN_Logger_GetLevel(const char *logDomain)
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
#define GWEN_ERROR_INTERNAL
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
#define GWEN_INHERIT_FUNCTIONS(t)
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandIn(const GWEN_SYNCIO *sio)
#define GWEN_ERROR_NOT_IMPLEMENTED