15 #define DISABLE_DEBUGLOG
18 #include "httpsession_p.h"
21 #include <gwenhywfar/syncio.h>
22 #include <gwenhywfar/syncio_tls.h>
23 #include <gwenhywfar/syncio_http.h>
24 #include <gwenhywfar/syncio_file.h>
26 #include <gwenhywfar/misc.h>
27 #include <gwenhywfar/debug.h>
28 #include <gwenhywfar/gui.h>
29 #include <gwenhywfar/text.h>
47 sess->url=strdup(url);
49 sess->defaultProtocol=strdup(defaultProto);
50 sess->defaultPort=defaultPort;
72 free(sess->defaultProtocol);
73 free(sess->httpUserAgent);
74 free(sess->httpContentType);
88 oldFn=sess->initSyncIoFn;
135 return sess->httpUserAgent;
144 free(sess->httpUserAgent);
146 sess->httpUserAgent=strdup(s);
148 sess->httpUserAgent=
NULL;
157 return sess->httpContentType;
166 free(sess->httpContentType);
168 sess->httpContentType=strdup(s);
170 sess->httpContentType=
NULL;
179 return sess->httpVMajor;
197 return sess->httpVMinor;
221 (sess->defaultProtocol)?(sess->defaultProtocol):
"http",
261 "Pragma",
"no-cache");
263 "Cache-control",
"no cache");
265 if (sess->httpContentType)
267 "Content-type", sess->httpContentType);
269 if (sess->httpUserAgent)
271 "User-Agent", sess->httpUserAgent);
298 const char *httpCommand,
299 const uint8_t *buf, uint32_t blen) {
308 I18N(
"Connecting to server..."));
313 "SSL-Error connecting (%d)", rv);
318 I18N(
"Could not connect to server"));
334 if (sess->httpVMajor) {
337 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d",
338 sess->httpVMajor, sess->httpVMinor);
339 numbuf[
sizeof(numbuf)-1]=0;
352 "Content-length", blen);
356 I18N(
"Sending message..."));
364 I18N(
"Could not send message (%d)"),
373 I18N(
"Message sent."));
391 else if (rv<200 || rv>299) {
423 if (rv==301 || rv==303 || rv==305 || rv==307) {
464 I18N(
"Receiving response..."));
466 if (rv<0 || rv<200 || rv>299) {
468 "Error receiving packet (%d)", rv);
476 I18N(
"Received continuation response."));
482 I18N(
"Response received."));
487 I18N(
"Disconnecting from server..."));
491 I18N(
"Disconnected."));
508 else if (rv<200 || rv>299) {
518 if (rv==301 || rv==303 || rv==305 || rv==307) {
574 I18N(
"Receiving response..."));
576 if (rv<0 || rv<200 || rv>299) {
578 "Error receiving packet (%d)", rv);
606 I18N(
"Received continuation response."));
614 I18N(
"Response received."));
619 I18N(
"Disconnecting from server..."));
623 I18N(
"Disconnected."));
638 I18N(
"Connecting to server..."));
647 I18N(
"Could not connect to server"));
659 I18N(
"Disconnected."));
667 if (sess->initSyncIoFn)
668 return sess->initSyncIoFn(sess, sio);
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *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)
#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
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)
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
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)
#define GWEN_NEW_OBJECT(typ, varname)
struct GWEN_SYNCIO GWEN_SYNCIO
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
#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)
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)
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)
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)
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)
#define GWEN_INHERIT_FUNCTIONS(t)
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
#define GWEN_ERROR_NOT_IMPLEMENTED