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;
112 if (sess->usage==1) {
116 free(sess->defaultProtocol);
117 free(sess->httpUserAgent);
118 free(sess->httpContentType);
134 oldFn=sess->initSyncIoFn;
135 sess->initSyncIoFn=f;
186 return sess->httpUserAgent;
196 free(sess->httpUserAgent);
198 sess->httpUserAgent=strdup(s);
200 sess->httpUserAgent=
NULL;
210 return sess->httpContentType;
220 free(sess->httpContentType);
222 sess->httpContentType=strdup(s);
224 sess->httpContentType=
NULL;
234 return sess->httpVMajor;
254 return sess->httpVMinor;
282 (sess->defaultProtocol)?(sess->defaultProtocol):
"http",
306 if (sess->syncIo==
NULL) {
333 "Pragma",
"no-cache");
335 "Cache-control",
"no cache");
337 if (sess->httpContentType)
339 "Content-type", sess->httpContentType);
341 if (sess->httpUserAgent)
343 "User-Agent", sess->httpUserAgent);
369 const char *httpCommand,
370 const uint8_t *buf, uint32_t blen)
380 I18N(
"Connecting to server..."));
385 "SSL-Error connecting (%d)", rv);
390 I18N(
"Could not connect to server"));
406 if (sess->httpVMajor) {
409 snprintf(numbuf,
sizeof(numbuf)-1,
"HTTP/%d.%d",
410 sess->httpVMajor, sess->httpVMinor);
411 numbuf[
sizeof(numbuf)-1]=0;
424 "Content-length", blen);
428 I18N(
"Sending message..."));
436 I18N(
"Could not send message (%d)"),
445 I18N(
"Message sent."));
464 else if (rv<200 || rv>299) {
496 if (rv==301 || rv==303 || rv==305 || rv==307) {
538 I18N(
"Receiving response..."));
540 if (rv<0 || rv<200 || rv>299) {
542 "Error receiving packet (%d)", rv);
550 I18N(
"Received continuation response."));
556 I18N(
"Response received."));
561 I18N(
"Disconnecting from server..."));
565 I18N(
"Disconnected."));
583 else if (rv<200 || rv>299) {
593 if (rv==301 || rv==303 || rv==305 || rv==307) {
650 I18N(
"Receiving response..."));
652 if (rv<0 || rv<200 || rv>299) {
654 "Error receiving packet (%d)", rv);
682 I18N(
"Received continuation response."));
690 I18N(
"Response received."));
695 I18N(
"Disconnecting from server..."));
699 I18N(
"Disconnected."));
715 I18N(
"Connecting to server..."));
724 I18N(
"Could not connect to server"));
736 I18N(
"Disconnected."));
745 if (sess->initSyncIoFn)
746 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__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)
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)
#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_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)
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)
#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