gwenhywfar  5.4.1
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  GWEN_HTTP_SESSION *sess;
102 
104  assert(sess);
105  sess->usage=1;
107 
108  sess->syncIo=sio;
109  sess->flags|=GWEN_HTTP_SESSION_FLAGS_PASSIVE;
110 
111  /* add PASSIVE flag to every syncIO in the chain */
112  while (sio) {
114  sio=GWEN_SyncIo_GetBaseIo(sio);
115  }
116 
117  return sess;
118 }
119 
120 
121 
123 {
124  assert(sess);
125  assert(sess->usage);
126  sess->usage++;
127 }
128 
129 
130 
132 {
133  if (sess) {
134  assert(sess->usage);
135  if (sess->usage==1) {
137  GWEN_SyncIo_free(sess->syncIo);
138  free(sess->url);
139  free(sess->defaultProtocol);
140  free(sess->httpUserAgent);
141  free(sess->httpContentType);
142  GWEN_FREE_OBJECT(sess);
143  }
144  else {
145  sess->usage--;
146  }
147  }
148 }
149 
150 
151 
154 {
156 
157  oldFn=sess->initSyncIoFn;
158  sess->initSyncIoFn=f;
159  return oldFn;
160 }
161 
162 
163 
165 {
166  assert(sess);
167  assert(sess->usage);
168 
169  return sess->flags;
170 }
171 
172 
173 
175 {
176  assert(sess);
177  assert(sess->usage);
178 
179  sess->flags=fl;
180 }
181 
182 
183 
185 {
186  assert(sess);
187  assert(sess->usage);
188 
189  sess->flags|=fl;
190 }
191 
192 
193 
195 {
196  assert(sess);
197  assert(sess->usage);
198 
199  sess->flags&=~fl;
200 }
201 
202 
203 
205 {
206  assert(sess);
207  assert(sess->usage);
208 
209  return sess->httpUserAgent;
210 }
211 
212 
213 
215 {
216  assert(sess);
217  assert(sess->usage);
218 
219  free(sess->httpUserAgent);
220  if (s)
221  sess->httpUserAgent=strdup(s);
222  else
223  sess->httpUserAgent=NULL;
224 }
225 
226 
227 
229 {
230  assert(sess);
231  assert(sess->usage);
232 
233  return sess->httpContentType;
234 }
235 
236 
237 
239 {
240  assert(sess);
241  assert(sess->usage);
242 
243  free(sess->httpContentType);
244  if (s)
245  sess->httpContentType=strdup(s);
246  else
247  sess->httpContentType=NULL;
248 }
249 
250 
251 
253 {
254  assert(sess);
255  assert(sess->usage);
256 
257  return sess->httpVMajor;
258 }
259 
260 
261 
263 {
264  assert(sess);
265  assert(sess->usage);
266 
267  sess->httpVMajor=i;
268 }
269 
270 
271 
273 {
274  assert(sess);
275  assert(sess->usage);
276 
277  return sess->httpVMinor;
278 }
279 
280 
281 
283 {
284  assert(sess);
285  assert(sess->usage);
286 
287  sess->httpVMinor=i;
288 }
289 
290 
291 
292 
293 
294 
296 {
297  GWEN_SYNCIO *sioTls;
298  GWEN_DB_NODE *db;
299  int rv;
300 
301  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
302  GWEN_SYNCIO *sio;
303 
304  rv=GWEN_Gui_GetSyncIo(sess->url,
305  (sess->defaultProtocol)?(sess->defaultProtocol):"http",
306  sess->defaultPort,
307  &sio);
308  if (rv<0) {
309  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
310  return rv;
311  }
312 
313  if (strcasecmp(GWEN_SyncIo_GetTypeName(sio), GWEN_SYNCIO_HTTP_TYPE)!=0) {
314  DBG_ERROR(GWEN_LOGDOMAIN, "URL does not lead to a HTTP layer");
315  GWEN_SyncIo_free(sio);
316  return GWEN_ERROR_INVALID;
317  }
318 
319  /* allow derived classes to modify the given GWEN_SIO */
320  rv=GWEN_HttpSession_InitSyncIo(sess, sio);
321  if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
322  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
323  GWEN_SyncIo_free(sio);
324  return rv;
325  }
326  sess->syncIo=sio;
327  }
328 
329  if (sess->syncIo==NULL) {
330  DBG_ERROR(GWEN_LOGDOMAIN, "No SYNCIO object, SNH!");
331  return GWEN_ERROR_INTERNAL;
332  }
333 
334  /* prepare TLS layer */
336  if (sioTls) {
337  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
338  GWEN_SyncIo_AddFlags(sioTls,
341  }
342  else { /* server mode */
343  }
344 
346  /* make TLS layer ignore problem of premature connection termination */
348  }
349  }
350 
351 
352  /* prepare HTTP out header */
353  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
354  if (sess->flags & GWEN_HTTP_SESSION_FLAGS_NO_CACHE) {
356  "Pragma", "no-cache");
358  "Cache-control", "no cache");
359  }
360  if (sess->httpContentType)
362  "Content-type", sess->httpContentType);
363 
364  if (sess->httpUserAgent)
366  "User-Agent", sess->httpUserAgent);
367  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
368  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
369 
370  return 0;
371 }
372 
373 
374 
376 {
377  assert(sess);
378  assert(sess->usage);
379 
380  if (sess->syncIo) {
381  GWEN_SyncIo_Disconnect(sess->syncIo);
382  GWEN_SyncIo_free(sess->syncIo);
383  sess->syncIo=NULL;
384  }
385 
386  return 0;
387 }
388 
389 
390 
392  const char *httpCommand,
393  const uint8_t *buf, uint32_t blen)
394 {
395  int rv;
396 
397  assert(sess);
398  assert(sess->usage);
399 
400  /* first connect to server */
403  I18N("Connecting to server..."));
404  rv=GWEN_SyncIo_Connect(sess->syncIo);
405  if (rv<0) {
406  if (rv==GWEN_ERROR_SSL) {
408  "SSL-Error connecting (%d)", rv);
409  }
410  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
413  I18N("Could not connect to server"));
414  GWEN_SyncIo_Disconnect(sess->syncIo);
415  return rv;
416  }
417  else {
418  GWEN_DB_NODE *db;
419 
422  I18N("Connected."));
423 
424  /* set command */
425  db=GWEN_SyncIo_Http_GetDbCommandOut(sess->syncIo);
427  "command",
428  httpCommand);
429  if (sess->httpVMajor) {
430  char numbuf[32];
431 
432  snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d",
433  sess->httpVMajor, sess->httpVMinor);
434  numbuf[sizeof(numbuf)-1]=0;
436  "protocol",
437  numbuf);
438  }
439  else
441  "protocol",
442  "HTTP/1.0");
443 
444  /* set content length */
445  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
447  "Content-length", blen);
448 
451  I18N("Sending message..."));
452 
453  /* send request */
454  rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
455  if (rv<0) {
456  DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
459  I18N("Could not send message (%d)"),
460  rv);
461  GWEN_SyncIo_Disconnect(sess->syncIo);
462  return rv;
463  }
464 
465  DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
468  I18N("Message sent."));
469  return 0;
470  }
471 }
472 
473 
474 
476  int resultCode,
477  const char *resultText,
478  const uint8_t *buf, uint32_t blen)
479 {
480  int rv;
481  GWEN_DB_NODE *db;
482 
483  assert(sess);
484  assert(sess->usage);
485 
486  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
487  DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot send status");
488  return GWEN_ERROR_INVALID;
489  }
490 
491  /* set result */
492  db=GWEN_SyncIo_Http_GetDbStatusOut(sess->syncIo);
493  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "code", resultCode);
494  if (resultText && *resultText)
495  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "text", resultText);
496 
497  /* set protocol */
498  if (sess->httpVMajor) {
499  char numbuf[32];
500 
501  snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
502  numbuf[sizeof(numbuf)-1]=0;
503  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", numbuf);
504  }
505  else
506  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", "HTTP/1.0");
507 
508  /* set content length */
509  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
510  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", blen);
511 
512  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Sending response..."));
513 
514  /* send request */
515  rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
516  if (rv<0) {
517  DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
518  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not send message (%d)"), rv);
519  GWEN_SyncIo_Disconnect(sess->syncIo);
520  return rv;
521  }
522 
523  DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
524  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Message sent."));
525 
526  /* disconnect */
529  I18N("Disconnecting from server..."));
530  GWEN_SyncIo_Disconnect(sess->syncIo);
533  I18N("Disconnected."));
534 
535  return 0;
536 }
537 
538 
539 
541 {
542  int rv;
543 
544  assert(sess);
545  assert(sess->usage);
546 
547  rv=GWEN_SyncIo_Http_RecvBody(sess->syncIo, buf);
548  if (rv<0) {
549  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
550  return rv;
551  }
552  else if ((rv>0 && rv<200) || rv>299) {
553  /* response is only ok for continuation (100) code */
554  if (rv==100) {
555  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
556  }
557  else {
558  GWEN_DB_NODE *dbHeaderIn;
559 
560  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
561 
563  DBG_INFO(GWEN_LOGDOMAIN, "Detailed Error Log For Packet:");
564 
565  if (dbHeaderIn) {
566  DBG_INFO(GWEN_LOGDOMAIN, "Recevied this HTTP header:");
567  GWEN_DB_Dump(dbHeaderIn, 2);
568  }
569  else {
570  DBG_INFO(GWEN_LOGDOMAIN, "-- No HTTP header recevied --");
571  }
572 
573  if (GWEN_Buffer_GetUsedBytes(buf)) {
574  DBG_INFO(GWEN_LOGDOMAIN, "Recevied this body:");
577  }
578  else {
579  DBG_INFO(GWEN_LOGDOMAIN, "-- No body recevied --");
580  }
581 
582  }
583 
584  if (rv==301 || rv==303 || rv==305 || rv==307) {
585  /* moved */
586  if (dbHeaderIn) {
587  const char *s;
588 
589  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
590  if (s) {
591  switch (rv) {
592  case 301:
593  case 303:
594  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
595  break;
596  case 305:
597  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
598  break;
599  case 307:
600  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
601  break;
602  default:
603  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
604  } /* switch */
605  }
606  }
607  } /* if moved */
608  }
609  }
610 
611  return rv;
612 }
613 
614 
615 
617 {
618  int rv;
619  uint32_t pos;
620 
621  /* read response */
622  pos=GWEN_Buffer_GetPos(buf);
623  for (;;) {
626  I18N("Receiving response..."));
627  rv=GWEN_HttpSession__RecvPacket(sess, buf);
628  if (rv<0 || rv<200 || rv>299) {
630  "Error receiving packet (%d)", rv);
631  GWEN_SyncIo_Disconnect(sess->syncIo);
632  return rv;
633  }
634  if (rv!=100)
635  break;
638  I18N("Received continuation response."));
639  GWEN_Buffer_Crop(buf, 0, pos);
640  }
641 
644  I18N("Response received."));
645 
646  /* disconnect */
649  I18N("Disconnecting from server..."));
650  GWEN_SyncIo_Disconnect(sess->syncIo);
653  I18N("Disconnected."));
654  return rv;
655 }
656 
657 
658 
660  GWEN_DB_NODE *dbCommandAndHeader,
661  GWEN_BUFFER *buf)
662 {
663  int rv;
664  GWEN_DB_NODE *db;
665  uint32_t pos;
666 
667  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
668  DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot receive command.");
669  return GWEN_ERROR_INVALID;
670  }
671 
672  /* read response */
673  pos=GWEN_Buffer_GetPos(buf);
674  for (;;) {
675  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Receiving command..."));
676  rv=GWEN_HttpSession__RecvPacket(sess, buf);
677  if (rv<0 || (rv>0 && rv<200) || rv>299) {
678  DBG_INFO(GWEN_LOGDOMAIN, "Error receiving packet (%d)", rv);
679  GWEN_SyncIo_Disconnect(sess->syncIo);
680  return rv;
681  }
682  if (rv!=100)
683  break;
684  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Received continuation response."));
685  GWEN_Buffer_Crop(buf, 0, pos);
686  }
687 
688  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Command received."));
689 
690 
691  /* copy command db */
692  db=GWEN_SyncIo_Http_GetDbCommandIn(sess->syncIo);
693  if (db) {
694  GWEN_DB_NODE *dbDest;
695 
696  dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "command");
697  assert(dbDest);
698  GWEN_DB_AddGroupChildren(dbDest, db);
699  }
700 
701  /* copy header db */
702  db=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
703  if (db) {
704  GWEN_DB_NODE *dbDest;
705 
706  dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "header");
707  assert(dbDest);
708  GWEN_DB_AddGroupChildren(dbDest, db);
709  }
710 
711  return rv;
712 }
713 
714 
715 
717 {
718  int rv;
719 
720  assert(sess);
721  assert(sess->usage);
722 
723  rv=GWEN_SyncIo_Http_RecvBodyToSio(sess->syncIo, sio);
724  if (rv<0) {
725  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
726  return rv;
727  }
728  else if (rv<200 || rv>299) {
729  /* response is only ok for continuation (100) code */
730  if (rv==100) {
731  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
732  }
733  else {
734  GWEN_DB_NODE *dbHeaderIn;
735 
736  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
737 
738  if (rv==301 || rv==303 || rv==305 || rv==307) {
739  /* moved */
740  if (dbHeaderIn) {
741  const char *s;
742 
743  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
744  if (s) {
745  switch (rv) {
746  case 301:
747  case 303:
748  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
749  break;
750  case 305:
751  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
752  break;
753  case 307:
754  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
755  break;
756  default:
757  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
758  } /* switch */
759  }
760  }
761  } /* if moved */
762  }
763  }
764 
765  return rv;
766 }
767 
768 
769 
771 {
772  int rv;
773 
774  /* read response */
775  for (;;) {
776  GWEN_SYNCIO *sio;
777 
786  rv=GWEN_SyncIo_Connect(sio);
787  if (rv<0) {
788  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
789  GWEN_SyncIo_free(sio);
790  return rv;
791  }
792 
795  I18N("Receiving response..."));
796  rv=GWEN_HttpSession__RecvPacketToSio(sess, sio);
797  if (rv<0 || rv<200 || rv>299) {
799  "Error receiving packet (%d)", rv);
801  GWEN_SyncIo_free(sio);
802  unlink(fname);
803  GWEN_SyncIo_Disconnect(sess->syncIo);
804  return rv;
805  }
806  if (rv!=100) {
807  int rv2;
808 
809  /* flush file and close it */
810  rv2=GWEN_SyncIo_Flush(sio);
811  if (rv2<0) {
812  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
813  GWEN_SyncIo_free(sio);
814  return rv2;
815  }
816  rv2=GWEN_SyncIo_Disconnect(sio);
817  if (rv2<0) {
818  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
819  GWEN_SyncIo_free(sio);
820  return rv2;
821  }
822  GWEN_SyncIo_free(sio);
823  break;
824  }
827  I18N("Received continuation response."));
829  GWEN_SyncIo_free(sio);
830  unlink(fname);
831  }
832 
835  I18N("Response received."));
836 
837  /* disconnect */
840  I18N("Disconnecting from server..."));
841  GWEN_SyncIo_Disconnect(sess->syncIo);
844  I18N("Disconnected."));
845  return rv;
846 }
847 
848 
849 
851 {
852  int rv;
853 
854  assert(sess);
855  assert(sess->usage);
856 
857  /* connect to server */
860  I18N("Connecting to server..."));
861  rv=GWEN_SyncIo_Connect(sess->syncIo);
862  if (rv<0) {
863  if (rv==GWEN_ERROR_SSL) {
864  DBG_NOTICE(GWEN_LOGDOMAIN, "SSL-Error connecting (%d)", rv);
865  }
866  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
869  I18N("Could not connect to server"));
870  GWEN_SyncIo_Disconnect(sess->syncIo);
871  return rv;
872  }
873  else {
876  I18N("Connected."));
877 
878  GWEN_SyncIo_Disconnect(sess->syncIo);
881  I18N("Disconnected."));
882  return 0;
883  }
884 }
885 
886 
887 
889 {
890  if (sess->initSyncIoFn)
891  return sess->initSyncIoFn(sess, sio);
892  DBG_INFO(GWEN_LOGDOMAIN, "initSyncIoFn not set");
894 }
895 
896 
897 
898 
899 
900 
901 
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:1003
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:1418
#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:228
#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:277
#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:238
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:391
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:151
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:61
#define NULL
Definition: binreloc.c:300
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:252
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:282
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
#define GWEN_HTTP_SESSION_FLAGS_PASSIVE
Definition: httpsession.h:49
int GWEN_HttpSession_RecvCommand(GWEN_HTTP_SESSION *sess, GWEN_DB_NODE *dbCommandAndHeader, GWEN_BUFFER *buf)
Definition: httpsession.c:659
int GWEN_HttpSession__RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:540
int GWEN_HttpSession_InitSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:888
#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:850
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1311
int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui.c:1568
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:164
#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:270
int GWEN_HttpSession_SendStatus(GWEN_HTTP_SESSION *sess, int resultCode, const char *resultText, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:475
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
Definition: httpsession.c:99
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:194
GWEN_SYNCIO * GWEN_Gui_ExtendSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO *baseSio)
Definition: gui.c:2132
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
Definition: gui.c:1015
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
Definition: db.h:123
#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:295
#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:1606
#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:969
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1379
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:184
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
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:122
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:947
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:174
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:716
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:214
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:770
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:995
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:178
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
Definition: httpsession.c:152
#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:40
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:131
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:262
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1200
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:204
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:272
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:375
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
Definition: db.c:1522
#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:616
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1259
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108