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>
57 sess->url=strdup(url);
59 sess->defaultProtocol=strdup(defaultProto);
60 sess->defaultPort=defaultPort;
143 if (sess->usage==1) {
147 free(sess->defaultProtocol);
148 free(sess->httpUserAgent);
149 free(sess->httpContentType);
165 oldFn=sess->initSyncIoFn;
166 sess->initSyncIoFn=f;
217 return sess->httpUserAgent;
227 free(sess->httpUserAgent);
229 sess->httpUserAgent=strdup(s);
231 sess->httpUserAgent=
NULL;
241 return sess->httpContentType;
251 free(sess->httpContentType);
253 sess->httpContentType=strdup(s);
255 sess->httpContentType=
NULL;
265 return sess->httpVMajor;
285 return sess->httpVMinor;
313 (sess->defaultProtocol)?(sess->defaultProtocol):
"http",
337 if (sess->syncIo==
NULL) {
366 "Pragma",
"no-cache");
368 "Cache-control",
"no-cache");
370 if (sess->httpContentType)
372 "Content-type", sess->httpContentType);
374 if (sess->httpUserAgent)
376 "User-Agent", sess->httpUserAgent);
421 const char *httpCommand,
422 const uint8_t *buf, uint32_t blen)
432 I18N(
"Connecting to server..."));
437 "SSL-Error connecting (%d)", rv);
442 I18N(
"Could not connect to server"));
458 if (sess->httpVMajor) {
461 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d",
462 sess->httpVMajor, sess->httpVMinor);
463 numbuf[
sizeof(numbuf)-1]=0;
476 "Content-length", blen);
480 I18N(
"Sending message..."));
488 I18N(
"Could not send message (%d)"),
497 I18N(
"Message sent."));
506 const char *resultText,
507 const uint8_t *buf, uint32_t blen)
523 if (resultText && *resultText)
527 if (sess->httpVMajor) {
530 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
531 numbuf[
sizeof(numbuf)-1]=0;
558 I18N(
"Disconnecting from server..."));
562 I18N(
"Disconnected."));
581 else if ((rv>0 && rv<200) || rv>299) {
613 if (rv==301 || rv==303 || rv==305 || rv==307) {
655 I18N(
"Receiving response..."));
657 if (rv<0 || rv<200 || rv>299) {
659 "Error receiving packet (%d)", rv);
667 I18N(
"Received continuation response."));
673 I18N(
"Response received."));
678 I18N(
"Disconnecting from server..."));
682 I18N(
"Disconnected."));
706 if (rv<0 || (rv>0 && rv<200) || rv>299) {
757 else if (rv<200 || rv>299) {
767 if (rv==301 || rv==303 || rv==305 || rv==307) {
824 I18N(
"Receiving response..."));
826 if (rv<0 || rv<200 || rv>299) {
828 "Error receiving packet (%d)", rv);
856 I18N(
"Received continuation response."));
864 I18N(
"Response received."));
869 I18N(
"Disconnecting from server..."));
873 I18N(
"Disconnected."));
889 I18N(
"Connecting to server..."));
898 I18N(
"Could not connect to server"));
910 I18N(
"Disconnected."));
919 if (sess->initSyncIoFn)
920 return sess->initSyncIoFn(sess, sio);
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
#define GWEN_DB_FLAGS_OVERWRITE_VARS
struct GWEN_DB_NODE GWEN_DB_NODE
#define DBG_INFO(dbg_logger, format,...)
#define DBG_NOTICE(dbg_logger, format,...)
#define DBG_ERROR(dbg_logger, format,...)
#define GWEN_ERROR_NOT_IMPLEMENTED
#define GWEN_ERROR_INTERNAL
#define GWEN_ERROR_INVALID
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
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,...)
GWENHYWFAR_API int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
int GWEN_HttpSession_SendStatus(GWEN_HTTP_SESSION *sess, int resultCode, const char *resultText, const uint8_t *buf, uint32_t blen)
static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
static int _recvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_RecvCommand(GWEN_HTTP_SESSION *sess, GWEN_DB_NODE *dbCommandAndHeader, GWEN_BUFFER *buf)
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSocketPassive(GWEN_SOCKET *sk, const char *proto, int port)
static int _recvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
static int _initSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
void GWEN_HttpSession_SetHttpContentType(GWEN_HTTP_SESSION *sess, const char *s)
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
void GWEN_HttpSession_SetFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
struct GWEN_HTTP_SESSION GWEN_HTTP_SESSION
#define GWEN_HTTP_SESSION_FLAGS_PASSIVE
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
#define GWEN_HTTP_SESSION_FLAGS_NO_CACHE
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
struct GWEN_SOCKET GWEN_SOCKET
#define GWEN_INHERIT_FUNCTIONS(t)
#define GWEN_INHERIT_INIT(t, element)
#define GWEN_INHERIT_FINI(t, element)
int GWEN_Logger_GetLevel(const char *logDomain)
@ GWEN_LoggerLevel_Warning
@ GWEN_LoggerLevel_Notice
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIoByTypeName(const GWEN_SYNCIO *sio, const char *typeName)
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_FLAGS_PASSIVE
struct GWEN_SYNCIO GWEN_SYNCIO
@ GWEN_SyncIo_File_CreationMode_CreateAlways
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
int GWEN_SyncIo_Http_RecvBodyToSio(GWEN_SYNCIO *sio, GWEN_SYNCIO *sout)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandIn(const GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_HTTP_TYPE
GWEN_SYNCIO * GWEN_SyncIo_Socket_TakeOver(GWEN_SOCKET *socket)
#define GWEN_SYNCIO_TLS_TYPE
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
void GWEN_Url_free(GWEN_URL *st)
const char * GWEN_Url_GetServer(const GWEN_URL *st)
GWEN_URL * GWEN_Url_fromString(const char *str)