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> 49 sess->url=strdup(url);
51 sess->defaultProtocol=strdup(defaultProto);
52 sess->defaultPort=defaultPort;
135 if (sess->usage==1) {
139 free(sess->defaultProtocol);
140 free(sess->httpUserAgent);
141 free(sess->httpContentType);
157 oldFn=sess->initSyncIoFn;
158 sess->initSyncIoFn=f;
209 return sess->httpUserAgent;
219 free(sess->httpUserAgent);
221 sess->httpUserAgent=strdup(s);
223 sess->httpUserAgent=
NULL;
233 return sess->httpContentType;
243 free(sess->httpContentType);
245 sess->httpContentType=strdup(s);
247 sess->httpContentType=
NULL;
257 return sess->httpVMajor;
277 return sess->httpVMinor;
305 (sess->defaultProtocol)?(sess->defaultProtocol):
"http",
329 if (sess->syncIo==
NULL) {
356 "Pragma",
"no-cache");
358 "Cache-control",
"no cache");
360 if (sess->httpContentType)
362 "Content-type", sess->httpContentType);
364 if (sess->httpUserAgent)
366 "User-Agent", sess->httpUserAgent);
392 const char *httpCommand,
393 const uint8_t *buf, uint32_t blen)
403 I18N(
"Connecting to server..."));
408 "SSL-Error connecting (%d)", rv);
413 I18N(
"Could not connect to server"));
429 if (sess->httpVMajor) {
432 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d",
433 sess->httpVMajor, sess->httpVMinor);
434 numbuf[
sizeof(numbuf)-1]=0;
447 "Content-length", blen);
451 I18N(
"Sending message..."));
459 I18N(
"Could not send message (%d)"),
468 I18N(
"Message sent."));
477 const char *resultText,
478 const uint8_t *buf, uint32_t blen)
494 if (resultText && *resultText)
498 if (sess->httpVMajor) {
501 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
502 numbuf[
sizeof(numbuf)-1]=0;
529 I18N(
"Disconnecting from server..."));
533 I18N(
"Disconnected."));
552 else if ((rv>0 && rv<200) || rv>299) {
584 if (rv==301 || rv==303 || rv==305 || rv==307) {
626 I18N(
"Receiving response..."));
628 if (rv<0 || rv<200 || rv>299) {
630 "Error receiving packet (%d)", rv);
638 I18N(
"Received continuation response."));
644 I18N(
"Response received."));
649 I18N(
"Disconnecting from server..."));
653 I18N(
"Disconnected."));
677 if (rv<0 || (rv>0 && rv<200) || rv>299) {
728 else if (rv<200 || rv>299) {
738 if (rv==301 || rv==303 || rv==305 || rv==307) {
795 I18N(
"Receiving response..."));
797 if (rv<0 || rv<200 || rv>299) {
799 "Error receiving packet (%d)", rv);
827 I18N(
"Received continuation response."));
835 I18N(
"Response received."));
840 I18N(
"Disconnecting from server..."));
844 I18N(
"Disconnected."));
860 I18N(
"Connecting to server..."));
869 I18N(
"Could not connect to server"));
881 I18N(
"Disconnected."));
890 if (sess->initSyncIoFn)
891 return sess->initSyncIoFn(sess, sio);
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
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)
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)
#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)
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
#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)
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)
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