gwenhywfar  4.99.8beta
httpsession.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Feb 15 2008
3  copyright : (C) 2008-2017 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_tls.h>
23 #include <gwenhywfar/syncio_http.h>
24 #include <gwenhywfar/syncio_file.h>
25 
26 #include <gwenhywfar/misc.h>
27 #include <gwenhywfar/debug.h>
28 #include <gwenhywfar/gui.h>
29 #include <gwenhywfar/text.h>
30 
31 #include <assert.h>
32 #include <unistd.h>
33 
34 
36 
37 
38 
39 GWEN_HTTP_SESSION *GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort) {
40  GWEN_HTTP_SESSION *sess;
41 
43  assert(sess);
44  sess->usage=1;
46  if (url)
47  sess->url=strdup(url);
48  if (defaultProto)
49  sess->defaultProtocol=strdup(defaultProto);
50  sess->defaultPort=defaultPort;
51 
52  return sess;
53 }
54 
55 
56 
58  assert(sess);
59  assert(sess->usage);
60  sess->usage++;
61 }
62 
63 
64 
66  if (sess) {
67  assert(sess->usage);
68  if (sess->usage==1) {
70  GWEN_SyncIo_free(sess->syncIo);
71  free(sess->url);
72  free(sess->defaultProtocol);
73  free(sess->httpUserAgent);
74  free(sess->httpContentType);
75  GWEN_FREE_OBJECT(sess);
76  }
77  else {
78  sess->usage--;
79  }
80  }
81 }
82 
83 
84 
87 
88  oldFn=sess->initSyncIoFn;
89  sess->initSyncIoFn=f;
90  return oldFn;
91 }
92 
93 
94 
96  assert(sess);
97  assert(sess->usage);
98 
99  return sess->flags;
100 }
101 
102 
103 
105  assert(sess);
106  assert(sess->usage);
107 
108  sess->flags=fl;
109 }
110 
111 
112 
114  assert(sess);
115  assert(sess->usage);
116 
117  sess->flags|=fl;
118 }
119 
120 
121 
123  assert(sess);
124  assert(sess->usage);
125 
126  sess->flags&=~fl;
127 }
128 
129 
130 
132  assert(sess);
133  assert(sess->usage);
134 
135  return sess->httpUserAgent;
136 }
137 
138 
139 
141  assert(sess);
142  assert(sess->usage);
143 
144  free(sess->httpUserAgent);
145  if (s)
146  sess->httpUserAgent=strdup(s);
147  else
148  sess->httpUserAgent=NULL;
149 }
150 
151 
152 
154  assert(sess);
155  assert(sess->usage);
156 
157  return sess->httpContentType;
158 }
159 
160 
161 
163  assert(sess);
164  assert(sess->usage);
165 
166  free(sess->httpContentType);
167  if (s)
168  sess->httpContentType=strdup(s);
169  else
170  sess->httpContentType=NULL;
171 }
172 
173 
174 
176  assert(sess);
177  assert(sess->usage);
178 
179  return sess->httpVMajor;
180 }
181 
182 
183 
185  assert(sess);
186  assert(sess->usage);
187 
188  sess->httpVMajor=i;
189 }
190 
191 
192 
194  assert(sess);
195  assert(sess->usage);
196 
197  return sess->httpVMinor;
198 }
199 
200 
201 
203  assert(sess);
204  assert(sess->usage);
205 
206  sess->httpVMinor=i;
207 }
208 
209 
210 
211 
212 
213 
215  GWEN_SYNCIO *sio;
216  GWEN_SYNCIO *sioTls;
217  GWEN_DB_NODE *db;
218  int rv;
219 
220  rv=GWEN_Gui_GetSyncIo(sess->url,
221  (sess->defaultProtocol)?(sess->defaultProtocol):"http",
222  sess->defaultPort,
223  &sio);
224  if (rv<0) {
225  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
226  return rv;
227  }
228 
229  if (strcasecmp(GWEN_SyncIo_GetTypeName(sio), GWEN_SYNCIO_HTTP_TYPE)!=0) {
230  DBG_ERROR(GWEN_LOGDOMAIN, "URL does not lead to a HTTP layer");
231  GWEN_SyncIo_free(sio);
232  return GWEN_ERROR_INVALID;
233  }
234 
235  /* allow derived classes to modify the given GWEN_SIO */
236  rv=GWEN_HttpSession_InitSyncIo(sess, sio);
237  if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
238  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
239  GWEN_SyncIo_free(sio);
240  return rv;
241  }
242 
243  /* prepare TLS layer */
245  if (sioTls) {
246  GWEN_SyncIo_AddFlags(sioTls,
249 
251  /* make TLS layer ignore problem of premature connection termination */
253  }
254  }
255 
256 
257  /* prepare HTTP out header */
259  if (sess->flags & GWEN_HTTP_SESSION_FLAGS_NO_CACHE) {
261  "Pragma", "no-cache");
263  "Cache-control", "no cache");
264  }
265  if (sess->httpContentType)
267  "Content-type", sess->httpContentType);
268 
269  if (sess->httpUserAgent)
271  "User-Agent", sess->httpUserAgent);
272  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
273  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
274 
275  sess->syncIo=sio;
276 
277  return 0;
278 }
279 
280 
281 
283  assert(sess);
284  assert(sess->usage);
285 
286  if (sess->syncIo) {
287  GWEN_SyncIo_Disconnect(sess->syncIo);
288  GWEN_SyncIo_free(sess->syncIo);
289  sess->syncIo=NULL;
290  }
291 
292  return 0;
293 }
294 
295 
296 
298  const char *httpCommand,
299  const uint8_t *buf, uint32_t blen) {
300  int rv;
301 
302  assert(sess);
303  assert(sess->usage);
304 
305  /* first connect to server */
308  I18N("Connecting to server..."));
309  rv=GWEN_SyncIo_Connect(sess->syncIo);
310  if (rv<0) {
311  if (rv==GWEN_ERROR_SSL) {
313  "SSL-Error connecting (%d)", rv);
314  }
315  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
318  I18N("Could not connect to server"));
319  GWEN_SyncIo_Disconnect(sess->syncIo);
320  return rv;
321  }
322  else {
323  GWEN_DB_NODE *db;
324 
327  I18N("Connected."));
328 
329  /* set command */
330  db=GWEN_SyncIo_Http_GetDbCommandOut(sess->syncIo);
332  "command",
333  httpCommand);
334  if (sess->httpVMajor) {
335  char numbuf[32];
336 
337  snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d",
338  sess->httpVMajor, sess->httpVMinor);
339  numbuf[sizeof(numbuf)-1]=0;
341  "protocol",
342  numbuf);
343  }
344  else
346  "protocol",
347  "HTTP/1.0");
348 
349  /* set content length */
350  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
352  "Content-length", blen);
353 
356  I18N("Sending message..."));
357 
358  /* send request */
359  rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
360  if (rv<0) {
361  DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
364  I18N("Could not send message (%d)"),
365  rv);
366  GWEN_SyncIo_Disconnect(sess->syncIo);
367  return rv;
368  }
369 
370  DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
373  I18N("Message sent."));
374  return 0;
375  }
376 }
377 
378 
379 
381  int rv;
382 
383  assert(sess);
384  assert(sess->usage);
385 
386  rv=GWEN_SyncIo_Http_RecvBody(sess->syncIo, buf);
387  if (rv<0) {
388  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
389  return rv;
390  }
391  else if (rv<200 || rv>299) {
392  /* response is only ok for continuation (100) code */
393  if (rv==100) {
394  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
395  }
396  else {
397  GWEN_DB_NODE *dbHeaderIn;
398 
399  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
400 
402  DBG_INFO(GWEN_LOGDOMAIN, "Detailed Error Log For Packet:");
403 
404  if (dbHeaderIn) {
405  DBG_INFO(GWEN_LOGDOMAIN, "Recevied this HTTP header:");
406  GWEN_DB_Dump(dbHeaderIn, 2);
407  }
408  else {
409  DBG_INFO(GWEN_LOGDOMAIN, "-- No HTTP header recevied --");
410  }
411 
412  if (GWEN_Buffer_GetUsedBytes(buf)) {
413  DBG_INFO(GWEN_LOGDOMAIN, "Recevied this body:");
416  }
417  else {
418  DBG_INFO(GWEN_LOGDOMAIN, "-- No body recevied --");
419  }
420 
421  }
422 
423  if (rv==301 || rv==303 || rv==305 || rv==307) {
424  /* moved */
425  if (dbHeaderIn) {
426  const char *s;
427 
428  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
429  if (s) {
430  switch(rv) {
431  case 301:
432  case 303:
433  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
434  break;
435  case 305:
436  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
437  break;
438  case 307:
439  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
440  break;
441  default:
442  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
443  } /* switch */
444  }
445  }
446  } /* if moved */
447  }
448  }
449 
450  return rv;
451 }
452 
453 
454 
456  int rv;
457  uint32_t pos;
458 
459  /* read response */
460  pos=GWEN_Buffer_GetPos(buf);
461  for (;;) {
464  I18N("Receiving response..."));
465  rv=GWEN_HttpSession__RecvPacket(sess, buf);
466  if (rv<0 || rv<200 || rv>299) {
468  "Error receiving packet (%d)", rv);
469  GWEN_SyncIo_Disconnect(sess->syncIo);
470  return rv;
471  }
472  if (rv!=100)
473  break;
476  I18N("Received continuation response."));
477  GWEN_Buffer_Crop(buf, 0, pos);
478  }
479 
482  I18N("Response received."));
483 
484  /* disconnect */
487  I18N("Disconnecting from server..."));
488  GWEN_SyncIo_Disconnect(sess->syncIo);
491  I18N("Disconnected."));
492  return rv;
493 }
494 
495 
496 
498  int rv;
499 
500  assert(sess);
501  assert(sess->usage);
502 
503  rv=GWEN_SyncIo_Http_RecvBodyToSio(sess->syncIo, sio);
504  if (rv<0) {
505  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
506  return rv;
507  }
508  else if (rv<200 || rv>299) {
509  /* response is only ok for continuation (100) code */
510  if (rv==100) {
511  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
512  }
513  else {
514  GWEN_DB_NODE *dbHeaderIn;
515 
516  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
517 
518  if (rv==301 || rv==303 || rv==305 || rv==307) {
519  /* moved */
520  if (dbHeaderIn) {
521  const char *s;
522 
523  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
524  if (s) {
525  switch(rv) {
526  case 301:
527  case 303:
528  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
529  break;
530  case 305:
531  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
532  break;
533  case 307:
534  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
535  break;
536  default:
537  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
538  } /* switch */
539  }
540  }
541  } /* if moved */
542  }
543  }
544 
545  return rv;
546 }
547 
548 
549 
551  int rv;
552 
553  /* read response */
554  for (;;) {
555  GWEN_SYNCIO *sio;
556 
565  rv=GWEN_SyncIo_Connect(sio);
566  if (rv<0) {
567  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
568  GWEN_SyncIo_free(sio);
569  return rv;
570  }
571 
574  I18N("Receiving response..."));
575  rv=GWEN_HttpSession__RecvPacketToSio(sess, sio);
576  if (rv<0 || rv<200 || rv>299) {
578  "Error receiving packet (%d)", rv);
580  GWEN_SyncIo_free(sio);
581  unlink(fname);
582  GWEN_SyncIo_Disconnect(sess->syncIo);
583  return rv;
584  }
585  if (rv!=100) {
586  int rv2;
587 
588  /* flush file and close it */
589  rv2=GWEN_SyncIo_Flush(sio);
590  if (rv2<0) {
591  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
592  GWEN_SyncIo_free(sio);
593  return rv2;
594  }
595  rv2=GWEN_SyncIo_Disconnect(sio);
596  if (rv2<0) {
597  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
598  GWEN_SyncIo_free(sio);
599  return rv2;
600  }
601  GWEN_SyncIo_free(sio);
602  break;
603  }
606  I18N("Received continuation response."));
608  GWEN_SyncIo_free(sio);
609  unlink(fname);
610  }
611 
614  I18N("Response received."));
615 
616  /* disconnect */
619  I18N("Disconnecting from server..."));
620  GWEN_SyncIo_Disconnect(sess->syncIo);
623  I18N("Disconnected."));
624  return rv;
625 }
626 
627 
628 
630  int rv;
631 
632  assert(sess);
633  assert(sess->usage);
634 
635  /* connect to server */
638  I18N("Connecting to server..."));
639  rv=GWEN_SyncIo_Connect(sess->syncIo);
640  if (rv<0) {
641  if (rv==GWEN_ERROR_SSL) {
642  DBG_NOTICE(GWEN_LOGDOMAIN, "SSL-Error connecting (%d)", rv);
643  }
644  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
647  I18N("Could not connect to server"));
648  GWEN_SyncIo_Disconnect(sess->syncIo);
649  return rv;
650  }
651  else {
654  I18N("Connected."));
655 
656  GWEN_SyncIo_Disconnect(sess->syncIo);
659  I18N("Disconnected."));
660  return 0;
661  }
662 }
663 
664 
665 
667  if (sess->initSyncIoFn)
668  return sess->initSyncIoFn(sess, sio);
669  DBG_INFO(GWEN_LOGDOMAIN, "initSyncIoFn not set");
671 }
672 
673 
674 
675 
676 
677 
678 
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.h:189
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
Definition: syncio.c:295
int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui.c:940
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
#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:94
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1297
#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:1454
#define GWEN_ERROR_INVALID
Definition: error.h:67
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:153
#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:1297
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:266
#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:162
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:297
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:140
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
Definition: syncio_http.c:1310
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:175
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:202
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
int GWEN_HttpSession__RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:380
int GWEN_HttpSession_InitSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:666
#define GWEN_LOGDOMAIN
Definition: logger.h:35
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition: buffer.c:239
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
Definition: httpsession.h:46
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:629
int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui.c:1486
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1261
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:95
#define GWEN_ERROR_SSL
Definition: error.h:105
#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:122
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
Definition: gui.c:951
#define GWEN_HTTP_SESSION_FLAGS_NO_CACHE
Definition: httpsession.h:40
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
Definition: syncio_tls.h:45
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:214
#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:1551
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:897
#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:113
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:217
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:76
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:57
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:169
#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:973
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:104
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1273
#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:497
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:140
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:105
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
Definition: httpsession.c:550
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:922
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
Definition: httpsession.c:85
#define GWEN_SYNCIO_HTTP_TYPE
Definition: syncio_http.h:33
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
Definition: syncio.c:201
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
Definition: httpsession.c:39
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:65
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:614
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:184
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1086
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:131
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:193
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:282
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
Definition: syncio.c:116
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:455
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108