gwenhywfar  4.99.15beta
httpsession.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Feb 15 2008
3  copyright : (C) 2019 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 
11 #ifdef HAVE_CONFIG_H
12 # include <config.h>
13 #endif
14 
15 #define DISABLE_DEBUGLOG
16 
17 
18 #include "httpsession_p.h"
19 #include "i18n_l.h"
20 
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>
26 
27 #include <gwenhywfar/misc.h>
28 #include <gwenhywfar/debug.h>
29 #include <gwenhywfar/gui.h>
30 #include <gwenhywfar/text.h>
31 
32 #include <assert.h>
33 #include <unistd.h>
34 
35 
37 
38 
39 
40 GWEN_HTTP_SESSION *GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
41 {
42  GWEN_HTTP_SESSION *sess;
43 
45  assert(sess);
46  sess->usage=1;
48  if (url)
49  sess->url=strdup(url);
50  if (defaultProto)
51  sess->defaultProtocol=strdup(defaultProto);
52  sess->defaultPort=defaultPort;
53 
54  return sess;
55 }
56 
57 
58 
60 {
61  GWEN_HTTP_SESSION *sess;
62  GWEN_SYNCIO *baseSio;
63  GWEN_SYNCIO *sio;
64 
66  assert(sess);
67  sess->usage=1;
69 
70  baseSio=GWEN_SyncIo_Socket_TakeOver(sk);
71  if (baseSio==NULL) {
72  DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_SyncIo_Socket_TakeOver()");
74  return NULL;
75  }
76 
77  /* extend syncio to support the given protocol */
78  sio=GWEN_Gui_ExtendSyncIo(NULL, proto, port, baseSio);
79  if (sio==NULL) {
80  DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_Gui_ExtendSyncIo()");
82  return NULL;
83  }
84 
85  sess->syncIo=sio;
87 
88  /* add PASSIVE flag to every syncIO in the chain */
89  while (sio) {
91  sio=GWEN_SyncIo_GetBaseIo(sio);
92  }
93 
94  return sess;
95 }
96 
97 
98 
100 {
101  assert(sess);
102  assert(sess->usage);
103  sess->usage++;
104 }
105 
106 
107 
109 {
110  if (sess) {
111  assert(sess->usage);
112  if (sess->usage==1) {
114  GWEN_SyncIo_free(sess->syncIo);
115  free(sess->url);
116  free(sess->defaultProtocol);
117  free(sess->httpUserAgent);
118  free(sess->httpContentType);
119  GWEN_FREE_OBJECT(sess);
120  }
121  else {
122  sess->usage--;
123  }
124  }
125 }
126 
127 
128 
131 {
133 
134  oldFn=sess->initSyncIoFn;
135  sess->initSyncIoFn=f;
136  return oldFn;
137 }
138 
139 
140 
142 {
143  assert(sess);
144  assert(sess->usage);
145 
146  return sess->flags;
147 }
148 
149 
150 
152 {
153  assert(sess);
154  assert(sess->usage);
155 
156  sess->flags=fl;
157 }
158 
159 
160 
162 {
163  assert(sess);
164  assert(sess->usage);
165 
166  sess->flags|=fl;
167 }
168 
169 
170 
172 {
173  assert(sess);
174  assert(sess->usage);
175 
176  sess->flags&=~fl;
177 }
178 
179 
180 
182 {
183  assert(sess);
184  assert(sess->usage);
185 
186  return sess->httpUserAgent;
187 }
188 
189 
190 
192 {
193  assert(sess);
194  assert(sess->usage);
195 
196  free(sess->httpUserAgent);
197  if (s)
198  sess->httpUserAgent=strdup(s);
199  else
200  sess->httpUserAgent=NULL;
201 }
202 
203 
204 
206 {
207  assert(sess);
208  assert(sess->usage);
209 
210  return sess->httpContentType;
211 }
212 
213 
214 
216 {
217  assert(sess);
218  assert(sess->usage);
219 
220  free(sess->httpContentType);
221  if (s)
222  sess->httpContentType=strdup(s);
223  else
224  sess->httpContentType=NULL;
225 }
226 
227 
228 
230 {
231  assert(sess);
232  assert(sess->usage);
233 
234  return sess->httpVMajor;
235 }
236 
237 
238 
240 {
241  assert(sess);
242  assert(sess->usage);
243 
244  sess->httpVMajor=i;
245 }
246 
247 
248 
250 {
251  assert(sess);
252  assert(sess->usage);
253 
254  return sess->httpVMinor;
255 }
256 
257 
258 
260 {
261  assert(sess);
262  assert(sess->usage);
263 
264  sess->httpVMinor=i;
265 }
266 
267 
268 
269 
270 
271 
273 {
274  GWEN_SYNCIO *sioTls;
275  GWEN_DB_NODE *db;
276  int rv;
277 
278  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
279  GWEN_SYNCIO *sio;
280 
281  rv=GWEN_Gui_GetSyncIo(sess->url,
282  (sess->defaultProtocol)?(sess->defaultProtocol):"http",
283  sess->defaultPort,
284  &sio);
285  if (rv<0) {
286  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
287  return rv;
288  }
289 
290  if (strcasecmp(GWEN_SyncIo_GetTypeName(sio), GWEN_SYNCIO_HTTP_TYPE)!=0) {
291  DBG_ERROR(GWEN_LOGDOMAIN, "URL does not lead to a HTTP layer");
292  GWEN_SyncIo_free(sio);
293  return GWEN_ERROR_INVALID;
294  }
295 
296  /* allow derived classes to modify the given GWEN_SIO */
297  rv=GWEN_HttpSession_InitSyncIo(sess, sio);
298  if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
299  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
300  GWEN_SyncIo_free(sio);
301  return rv;
302  }
303  sess->syncIo=sio;
304  }
305 
306  if (sess->syncIo==NULL) {
307  DBG_ERROR(GWEN_LOGDOMAIN, "No SYNCIO object, SNH!");
308  return GWEN_ERROR_INTERNAL;
309  }
310 
311  /* prepare TLS layer */
313  if (sioTls) {
314  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
315  GWEN_SyncIo_AddFlags(sioTls,
318  }
319  else { /* server mode */
320  }
321 
323  /* make TLS layer ignore problem of premature connection termination */
325  }
326  }
327 
328 
329  /* prepare HTTP out header */
330  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
331  if (sess->flags & GWEN_HTTP_SESSION_FLAGS_NO_CACHE) {
333  "Pragma", "no-cache");
335  "Cache-control", "no cache");
336  }
337  if (sess->httpContentType)
339  "Content-type", sess->httpContentType);
340 
341  if (sess->httpUserAgent)
343  "User-Agent", sess->httpUserAgent);
344  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
345  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
346 
347  return 0;
348 }
349 
350 
351 
353 {
354  assert(sess);
355  assert(sess->usage);
356 
357  if (sess->syncIo) {
358  GWEN_SyncIo_Disconnect(sess->syncIo);
359  GWEN_SyncIo_free(sess->syncIo);
360  sess->syncIo=NULL;
361  }
362 
363  return 0;
364 }
365 
366 
367 
369  const char *httpCommand,
370  const uint8_t *buf, uint32_t blen)
371 {
372  int rv;
373 
374  assert(sess);
375  assert(sess->usage);
376 
377  /* first connect to server */
380  I18N("Connecting to server..."));
381  rv=GWEN_SyncIo_Connect(sess->syncIo);
382  if (rv<0) {
383  if (rv==GWEN_ERROR_SSL) {
385  "SSL-Error connecting (%d)", rv);
386  }
387  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
390  I18N("Could not connect to server"));
391  GWEN_SyncIo_Disconnect(sess->syncIo);
392  return rv;
393  }
394  else {
395  GWEN_DB_NODE *db;
396 
399  I18N("Connected."));
400 
401  /* set command */
402  db=GWEN_SyncIo_Http_GetDbCommandOut(sess->syncIo);
404  "command",
405  httpCommand);
406  if (sess->httpVMajor) {
407  char numbuf[32];
408 
409  snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d",
410  sess->httpVMajor, sess->httpVMinor);
411  numbuf[sizeof(numbuf)-1]=0;
413  "protocol",
414  numbuf);
415  }
416  else
418  "protocol",
419  "HTTP/1.0");
420 
421  /* set content length */
422  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
424  "Content-length", blen);
425 
428  I18N("Sending message..."));
429 
430  /* send request */
431  rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
432  if (rv<0) {
433  DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
436  I18N("Could not send message (%d)"),
437  rv);
438  GWEN_SyncIo_Disconnect(sess->syncIo);
439  return rv;
440  }
441 
442  DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
445  I18N("Message sent."));
446  return 0;
447  }
448 }
449 
450 
451 
453 {
454  int rv;
455 
456  assert(sess);
457  assert(sess->usage);
458 
459  rv=GWEN_SyncIo_Http_RecvBody(sess->syncIo, buf);
460  if (rv<0) {
461  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
462  return rv;
463  }
464  else if (rv<200 || rv>299) {
465  /* response is only ok for continuation (100) code */
466  if (rv==100) {
467  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
468  }
469  else {
470  GWEN_DB_NODE *dbHeaderIn;
471 
472  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
473 
475  DBG_INFO(GWEN_LOGDOMAIN, "Detailed Error Log For Packet:");
476 
477  if (dbHeaderIn) {
478  DBG_INFO(GWEN_LOGDOMAIN, "Recevied this HTTP header:");
479  GWEN_DB_Dump(dbHeaderIn, 2);
480  }
481  else {
482  DBG_INFO(GWEN_LOGDOMAIN, "-- No HTTP header recevied --");
483  }
484 
485  if (GWEN_Buffer_GetUsedBytes(buf)) {
486  DBG_INFO(GWEN_LOGDOMAIN, "Recevied this body:");
489  }
490  else {
491  DBG_INFO(GWEN_LOGDOMAIN, "-- No body recevied --");
492  }
493 
494  }
495 
496  if (rv==301 || rv==303 || rv==305 || rv==307) {
497  /* moved */
498  if (dbHeaderIn) {
499  const char *s;
500 
501  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
502  if (s) {
503  switch (rv) {
504  case 301:
505  case 303:
506  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
507  break;
508  case 305:
509  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
510  break;
511  case 307:
512  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
513  break;
514  default:
515  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
516  } /* switch */
517  }
518  }
519  } /* if moved */
520  }
521  }
522 
523  return rv;
524 }
525 
526 
527 
529 {
530  int rv;
531  uint32_t pos;
532 
533  /* read response */
534  pos=GWEN_Buffer_GetPos(buf);
535  for (;;) {
538  I18N("Receiving response..."));
539  rv=GWEN_HttpSession__RecvPacket(sess, buf);
540  if (rv<0 || rv<200 || rv>299) {
542  "Error receiving packet (%d)", rv);
543  GWEN_SyncIo_Disconnect(sess->syncIo);
544  return rv;
545  }
546  if (rv!=100)
547  break;
550  I18N("Received continuation response."));
551  GWEN_Buffer_Crop(buf, 0, pos);
552  }
553 
556  I18N("Response received."));
557 
558  /* disconnect */
561  I18N("Disconnecting from server..."));
562  GWEN_SyncIo_Disconnect(sess->syncIo);
565  I18N("Disconnected."));
566  return rv;
567 }
568 
569 
570 
572 {
573  int rv;
574 
575  assert(sess);
576  assert(sess->usage);
577 
578  rv=GWEN_SyncIo_Http_RecvBodyToSio(sess->syncIo, sio);
579  if (rv<0) {
580  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
581  return rv;
582  }
583  else if (rv<200 || rv>299) {
584  /* response is only ok for continuation (100) code */
585  if (rv==100) {
586  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
587  }
588  else {
589  GWEN_DB_NODE *dbHeaderIn;
590 
591  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
592 
593  if (rv==301 || rv==303 || rv==305 || rv==307) {
594  /* moved */
595  if (dbHeaderIn) {
596  const char *s;
597 
598  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
599  if (s) {
600  switch (rv) {
601  case 301:
602  case 303:
603  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
604  break;
605  case 305:
606  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
607  break;
608  case 307:
609  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
610  break;
611  default:
612  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
613  } /* switch */
614  }
615  }
616  } /* if moved */
617  }
618  }
619 
620  return rv;
621 }
622 
623 
624 
626 {
627  int rv;
628 
629  /* read response */
630  for (;;) {
631  GWEN_SYNCIO *sio;
632 
641  rv=GWEN_SyncIo_Connect(sio);
642  if (rv<0) {
643  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
644  GWEN_SyncIo_free(sio);
645  return rv;
646  }
647 
650  I18N("Receiving response..."));
651  rv=GWEN_HttpSession__RecvPacketToSio(sess, sio);
652  if (rv<0 || rv<200 || rv>299) {
654  "Error receiving packet (%d)", rv);
656  GWEN_SyncIo_free(sio);
657  unlink(fname);
658  GWEN_SyncIo_Disconnect(sess->syncIo);
659  return rv;
660  }
661  if (rv!=100) {
662  int rv2;
663 
664  /* flush file and close it */
665  rv2=GWEN_SyncIo_Flush(sio);
666  if (rv2<0) {
667  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
668  GWEN_SyncIo_free(sio);
669  return rv2;
670  }
671  rv2=GWEN_SyncIo_Disconnect(sio);
672  if (rv2<0) {
673  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
674  GWEN_SyncIo_free(sio);
675  return rv2;
676  }
677  GWEN_SyncIo_free(sio);
678  break;
679  }
682  I18N("Received continuation response."));
684  GWEN_SyncIo_free(sio);
685  unlink(fname);
686  }
687 
690  I18N("Response received."));
691 
692  /* disconnect */
695  I18N("Disconnecting from server..."));
696  GWEN_SyncIo_Disconnect(sess->syncIo);
699  I18N("Disconnected."));
700  return rv;
701 }
702 
703 
704 
706 {
707  int rv;
708 
709  assert(sess);
710  assert(sess->usage);
711 
712  /* connect to server */
715  I18N("Connecting to server..."));
716  rv=GWEN_SyncIo_Connect(sess->syncIo);
717  if (rv<0) {
718  if (rv==GWEN_ERROR_SSL) {
719  DBG_NOTICE(GWEN_LOGDOMAIN, "SSL-Error connecting (%d)", rv);
720  }
721  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
724  I18N("Could not connect to server"));
725  GWEN_SyncIo_Disconnect(sess->syncIo);
726  return rv;
727  }
728  else {
731  I18N("Connected."));
732 
733  GWEN_SyncIo_Disconnect(sess->syncIo);
736  I18N("Disconnected."));
737  return 0;
738  }
739 }
740 
741 
742 
744 {
745  if (sess->initSyncIoFn)
746  return sess->initSyncIoFn(sess, sio);
747  DBG_INFO(GWEN_LOGDOMAIN, "initSyncIoFn not set");
749 }
750 
751 
752 
753 
754 
755 
756 
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
Definition: syncio.c:317
int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui.c:989
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
#define I18N(m)
Definition: error.c:42
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1407
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
Definition: syncio_tls.h:38
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
int GWEN_SyncIo_Http_RecvBodyToSio(GWEN_SYNCIO *sio, GWEN_SYNCIO *sout)
Definition: syncio_http.c:1483
#define GWEN_ERROR_INVALID
Definition: error.h:67
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:205
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1324
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:282
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
void GWEN_HttpSession_SetHttpContentType(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:215
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:368
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:150
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
Definition: syncio_http.c:1338
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSocketPassive(GWEN_SOCKET *sk, const char *proto, int port)
Definition: httpsession.c:59
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:297
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:229
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:259
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
#define GWEN_HTTP_SESSION_FLAGS_PASSIVE
Definition: httpsession.h:49
int GWEN_HttpSession__RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:452
int GWEN_HttpSession_InitSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:743
#define GWEN_LOGDOMAIN
Definition: logger.h:35
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition: buffer.c:253
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
Definition: syncio.c:224
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
Definition: httpsession.h:47
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:705
int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui.c:1554
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1285
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:141
#define GWEN_ERROR_SSL
Definition: error.h:105
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.h:217
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:171
GWEN_SYNCIO * GWEN_Gui_ExtendSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO *baseSio)
Definition: gui.c:2118
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
Definition: gui.c:1001
#define GWEN_HTTP_SESSION_FLAGS_NO_CACHE
Definition: httpsession.h:41
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
Definition: syncio_tls.h:45
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:272
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
Definition: syncio_file.h:63
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
Definition: text.c:1579
#define GWEN_SYNCIO_FLAGS_PASSIVE
Definition: syncio.h:57
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:958
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:161
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIoByTypeName(const GWEN_SYNCIO *sio, const char *typeName)
Definition: syncio.c:233
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:99
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
Definition: syncio_tls.h:40
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
Definition: buffer.c:1020
struct GWEN_HTTP_SESSION GWEN_HTTP_SESSION
Definition: httpsession.h:21
void GWEN_HttpSession_SetFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:151
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1298
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_SYNCIO_TLS_TYPE
Definition: syncio_tls.h:33
int GWEN_HttpSession__RecvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:571
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:191
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
Definition: httpsession.c:625
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:984
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:177
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
Definition: httpsession.c:129
#define GWEN_SYNCIO_HTTP_TYPE
Definition: syncio_http.h:33
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
Definition: syncio.c:215
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
Definition: httpsession.c:40
struct GWEN_SOCKET GWEN_SOCKET
Definition: inetsocket.h:43
GWEN_SYNCIO * GWEN_SyncIo_Socket_TakeOver(GWEN_SOCKET *socket)
Definition: syncio_socket.c:76
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:108
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
int GWEN_Logger_GetLevel(const char *logDomain)
Definition: logger.c:638
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:239
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1189
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:181
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:249
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:352
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
Definition: syncio.c:121
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:528
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108