gwenhywfar  5.10.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 static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader);
41 
42 
43 
44 
45 GWEN_HTTP_SESSION *GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
46 {
47  GWEN_HTTP_SESSION *sess;
48 
50  assert(sess);
51  sess->usage=1;
53  if (url)
54  sess->url=strdup(url);
55  if (defaultProto)
56  sess->defaultProtocol=strdup(defaultProto);
57  sess->defaultPort=defaultPort;
58 
59  return sess;
60 }
61 
62 
63 
65 {
66  GWEN_HTTP_SESSION *sess;
67  GWEN_SYNCIO *baseSio;
68  GWEN_SYNCIO *sio;
69 
71  assert(sess);
72  sess->usage=1;
74 
75  baseSio=GWEN_SyncIo_Socket_TakeOver(sk);
76  if (baseSio==NULL) {
77  DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_SyncIo_Socket_TakeOver()");
79  return NULL;
80  }
81 
82  /* extend syncio to support the given protocol */
83  sio=GWEN_Gui_ExtendSyncIo(NULL, proto, port, baseSio);
84  if (sio==NULL) {
85  DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_Gui_ExtendSyncIo()");
87  return NULL;
88  }
89 
90  sess->syncIo=sio;
92 
93  /* add PASSIVE flag to every syncIO in the chain */
94  while (sio) {
96  sio=GWEN_SyncIo_GetBaseIo(sio);
97  }
98 
99  return sess;
100 }
101 
102 
103 
105 {
106  GWEN_HTTP_SESSION *sess;
107 
109  assert(sess);
110  sess->usage=1;
112 
113  sess->syncIo=sio;
114  sess->flags|=GWEN_HTTP_SESSION_FLAGS_PASSIVE;
115 
116  /* add PASSIVE flag to every syncIO in the chain */
117  while (sio) {
119  sio=GWEN_SyncIo_GetBaseIo(sio);
120  }
121 
122  return sess;
123 }
124 
125 
126 
128 {
129  assert(sess);
130  assert(sess->usage);
131  sess->usage++;
132 }
133 
134 
135 
137 {
138  if (sess) {
139  assert(sess->usage);
140  if (sess->usage==1) {
142  GWEN_SyncIo_free(sess->syncIo);
143  free(sess->url);
144  free(sess->defaultProtocol);
145  free(sess->httpUserAgent);
146  free(sess->httpContentType);
147  GWEN_FREE_OBJECT(sess);
148  }
149  else {
150  sess->usage--;
151  }
152  }
153 }
154 
155 
156 
159 {
161 
162  oldFn=sess->initSyncIoFn;
163  sess->initSyncIoFn=f;
164  return oldFn;
165 }
166 
167 
168 
170 {
171  assert(sess);
172  assert(sess->usage);
173 
174  return sess->flags;
175 }
176 
177 
178 
180 {
181  assert(sess);
182  assert(sess->usage);
183 
184  sess->flags=fl;
185 }
186 
187 
188 
190 {
191  assert(sess);
192  assert(sess->usage);
193 
194  sess->flags|=fl;
195 }
196 
197 
198 
200 {
201  assert(sess);
202  assert(sess->usage);
203 
204  sess->flags&=~fl;
205 }
206 
207 
208 
210 {
211  assert(sess);
212  assert(sess->usage);
213 
214  return sess->httpUserAgent;
215 }
216 
217 
218 
220 {
221  assert(sess);
222  assert(sess->usage);
223 
224  free(sess->httpUserAgent);
225  if (s)
226  sess->httpUserAgent=strdup(s);
227  else
228  sess->httpUserAgent=NULL;
229 }
230 
231 
232 
234 {
235  assert(sess);
236  assert(sess->usage);
237 
238  return sess->httpContentType;
239 }
240 
241 
242 
244 {
245  assert(sess);
246  assert(sess->usage);
247 
248  free(sess->httpContentType);
249  if (s)
250  sess->httpContentType=strdup(s);
251  else
252  sess->httpContentType=NULL;
253 }
254 
255 
256 
258 {
259  assert(sess);
260  assert(sess->usage);
261 
262  return sess->httpVMajor;
263 }
264 
265 
266 
268 {
269  assert(sess);
270  assert(sess->usage);
271 
272  sess->httpVMajor=i;
273 }
274 
275 
276 
278 {
279  assert(sess);
280  assert(sess->usage);
281 
282  return sess->httpVMinor;
283 }
284 
285 
286 
288 {
289  assert(sess);
290  assert(sess->usage);
291 
292  sess->httpVMinor=i;
293 }
294 
295 
296 
297 
298 
299 
301 {
302  GWEN_SYNCIO *sioTls;
303  GWEN_DB_NODE *db;
304  int rv;
305 
306  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
307  GWEN_SYNCIO *sio;
308 
309  rv=GWEN_Gui_GetSyncIo(sess->url,
310  (sess->defaultProtocol)?(sess->defaultProtocol):"http",
311  sess->defaultPort,
312  &sio);
313  if (rv<0) {
314  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
315  return rv;
316  }
317 
318  if (strcasecmp(GWEN_SyncIo_GetTypeName(sio), GWEN_SYNCIO_HTTP_TYPE)!=0) {
319  DBG_ERROR(GWEN_LOGDOMAIN, "URL does not lead to a HTTP layer");
320  GWEN_SyncIo_free(sio);
321  return GWEN_ERROR_INVALID;
322  }
323 
324  /* allow derived classes to modify the given GWEN_SIO */
325  rv=GWEN_HttpSession_InitSyncIo(sess, sio);
326  if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
327  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
328  GWEN_SyncIo_free(sio);
329  return rv;
330  }
331  sess->syncIo=sio;
332  }
333 
334  if (sess->syncIo==NULL) {
335  DBG_ERROR(GWEN_LOGDOMAIN, "No SYNCIO object, SNH!");
336  return GWEN_ERROR_INTERNAL;
337  }
338 
339  /* prepare TLS layer */
341  if (sioTls) {
342  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
343  GWEN_SyncIo_AddFlags(sioTls,
346  }
347  else { /* server mode */
348  }
349 
351  /* make TLS layer ignore problem of premature connection termination */
353  }
354  }
355 
356 
357  /* prepare HTTP out header */
358  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
359  _setHostHeaderFromUrl(sess->url, db);
360 
361  if (sess->flags & GWEN_HTTP_SESSION_FLAGS_NO_CACHE) {
363  "Pragma", "no-cache");
365  "Cache-control", "no cache");
366  }
367  if (sess->httpContentType)
369  "Content-type", sess->httpContentType);
370 
371  if (sess->httpUserAgent)
373  "User-Agent", sess->httpUserAgent);
374  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
375  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
376 
377  return 0;
378 }
379 
380 
381 
382 void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
383 {
384  if (sUrl && *sUrl) {
385  GWEN_URL *url;
386 
387  url=GWEN_Url_fromString(sUrl);
388  if (url) {
389  const char *s;
390 
391  s=GWEN_Url_GetServer(url);
392  if (s && *s)
394  GWEN_Url_free(url);
395  }
396  }
397 }
398 
399 
400 
402 {
403  assert(sess);
404  assert(sess->usage);
405 
406  if (sess->syncIo) {
407  GWEN_SyncIo_Disconnect(sess->syncIo);
408  GWEN_SyncIo_free(sess->syncIo);
409  sess->syncIo=NULL;
410  }
411 
412  return 0;
413 }
414 
415 
416 
418  const char *httpCommand,
419  const uint8_t *buf, uint32_t blen)
420 {
421  int rv;
422 
423  assert(sess);
424  assert(sess->usage);
425 
426  /* first connect to server */
429  I18N("Connecting to server..."));
430  rv=GWEN_SyncIo_Connect(sess->syncIo);
431  if (rv<0) {
432  if (rv==GWEN_ERROR_SSL) {
434  "SSL-Error connecting (%d)", rv);
435  }
436  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
439  I18N("Could not connect to server"));
440  GWEN_SyncIo_Disconnect(sess->syncIo);
441  return rv;
442  }
443  else {
444  GWEN_DB_NODE *db;
445 
448  I18N("Connected."));
449 
450  /* set command */
451  db=GWEN_SyncIo_Http_GetDbCommandOut(sess->syncIo);
453  "command",
454  httpCommand);
455  if (sess->httpVMajor) {
456  char numbuf[32];
457 
458  snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d",
459  sess->httpVMajor, sess->httpVMinor);
460  numbuf[sizeof(numbuf)-1]=0;
462  "protocol",
463  numbuf);
464  }
465  else
467  "protocol",
468  "HTTP/1.0");
469 
470  /* set content length */
471  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
473  "Content-length", blen);
474 
477  I18N("Sending message..."));
478 
479  /* send request */
480  rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
481  if (rv<0) {
482  DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
485  I18N("Could not send message (%d)"),
486  rv);
487  GWEN_SyncIo_Disconnect(sess->syncIo);
488  return rv;
489  }
490 
491  DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
494  I18N("Message sent."));
495  return 0;
496  }
497 }
498 
499 
500 
502  int resultCode,
503  const char *resultText,
504  const uint8_t *buf, uint32_t blen)
505 {
506  int rv;
507  GWEN_DB_NODE *db;
508 
509  assert(sess);
510  assert(sess->usage);
511 
512  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
513  DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot send status");
514  return GWEN_ERROR_INVALID;
515  }
516 
517  /* set result */
518  db=GWEN_SyncIo_Http_GetDbStatusOut(sess->syncIo);
519  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "code", resultCode);
520  if (resultText && *resultText)
521  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "text", resultText);
522 
523  /* set protocol */
524  if (sess->httpVMajor) {
525  char numbuf[32];
526 
527  snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
528  numbuf[sizeof(numbuf)-1]=0;
529  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", numbuf);
530  }
531  else
532  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", "HTTP/1.0");
533 
534  /* set content length */
535  db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
536  GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", blen);
537 
538  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Sending response..."));
539 
540  /* send request */
541  rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
542  if (rv<0) {
543  DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
544  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not send message (%d)"), rv);
545  GWEN_SyncIo_Disconnect(sess->syncIo);
546  return rv;
547  }
548 
549  DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
550  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Message sent."));
551 
552  /* disconnect */
555  I18N("Disconnecting from server..."));
556  GWEN_SyncIo_Disconnect(sess->syncIo);
559  I18N("Disconnected."));
560 
561  return 0;
562 }
563 
564 
565 
567 {
568  int rv;
569 
570  assert(sess);
571  assert(sess->usage);
572 
573  rv=GWEN_SyncIo_Http_RecvBody(sess->syncIo, buf);
574  if (rv<0) {
575  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
576  return rv;
577  }
578  else if ((rv>0 && rv<200) || rv>299) {
579  /* response is only ok for continuation (100) code */
580  if (rv==100) {
581  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
582  }
583  else {
584  GWEN_DB_NODE *dbHeaderIn;
585 
586  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
587 
589  DBG_INFO(GWEN_LOGDOMAIN, "Detailed Error Log For Packet:");
590 
591  if (dbHeaderIn) {
592  DBG_INFO(GWEN_LOGDOMAIN, "Received this HTTP header:");
593  GWEN_DB_Dump(dbHeaderIn, 2);
594  }
595  else {
596  DBG_INFO(GWEN_LOGDOMAIN, "-- No HTTP header received --");
597  }
598 
599  if (GWEN_Buffer_GetUsedBytes(buf)) {
600  DBG_INFO(GWEN_LOGDOMAIN, "Received this body:");
603  }
604  else {
605  DBG_INFO(GWEN_LOGDOMAIN, "-- No body received --");
606  }
607 
608  }
609 
610  if (rv==301 || rv==303 || rv==305 || rv==307) {
611  /* moved */
612  if (dbHeaderIn) {
613  const char *s;
614 
615  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
616  if (s) {
617  switch (rv) {
618  case 301:
619  case 303:
620  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
621  break;
622  case 305:
623  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
624  break;
625  case 307:
626  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
627  break;
628  default:
629  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
630  } /* switch */
631  }
632  }
633  } /* if moved */
634  }
635  }
636 
637  return rv;
638 }
639 
640 
641 
643 {
644  int rv;
645  uint32_t pos;
646 
647  /* read response */
648  pos=GWEN_Buffer_GetPos(buf);
649  for (;;) {
652  I18N("Receiving response..."));
653  rv=GWEN_HttpSession__RecvPacket(sess, buf);
654  if (rv<0 || rv<200 || rv>299) {
656  "Error receiving packet (%d)", rv);
657  GWEN_SyncIo_Disconnect(sess->syncIo);
658  return rv;
659  }
660  if (rv!=100)
661  break;
664  I18N("Received continuation response."));
665  GWEN_Buffer_Crop(buf, 0, pos);
666  }
667 
670  I18N("Response received."));
671 
672  /* disconnect */
675  I18N("Disconnecting from server..."));
676  GWEN_SyncIo_Disconnect(sess->syncIo);
679  I18N("Disconnected."));
680  return rv;
681 }
682 
683 
684 
686  GWEN_DB_NODE *dbCommandAndHeader,
687  GWEN_BUFFER *buf)
688 {
689  int rv;
690  GWEN_DB_NODE *db;
691  uint32_t pos;
692 
693  if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
694  DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot receive command.");
695  return GWEN_ERROR_INVALID;
696  }
697 
698  /* read response */
699  pos=GWEN_Buffer_GetPos(buf);
700  for (;;) {
701  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Receiving command..."));
702  rv=GWEN_HttpSession__RecvPacket(sess, buf);
703  if (rv<0 || (rv>0 && rv<200) || rv>299) {
704  DBG_INFO(GWEN_LOGDOMAIN, "Error receiving packet (%d)", rv);
705  GWEN_SyncIo_Disconnect(sess->syncIo);
706  return rv;
707  }
708  if (rv!=100)
709  break;
710  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Received continuation response."));
711  GWEN_Buffer_Crop(buf, 0, pos);
712  }
713 
714  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Command received."));
715 
716 
717  /* copy command db */
718  db=GWEN_SyncIo_Http_GetDbCommandIn(sess->syncIo);
719  if (db) {
720  GWEN_DB_NODE *dbDest;
721 
722  dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "command");
723  assert(dbDest);
724  GWEN_DB_AddGroupChildren(dbDest, db);
725  }
726 
727  /* copy header db */
728  db=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
729  if (db) {
730  GWEN_DB_NODE *dbDest;
731 
732  dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "header");
733  assert(dbDest);
734  GWEN_DB_AddGroupChildren(dbDest, db);
735  }
736 
737  return rv;
738 }
739 
740 
741 
743 {
744  int rv;
745 
746  assert(sess);
747  assert(sess->usage);
748 
749  rv=GWEN_SyncIo_Http_RecvBodyToSio(sess->syncIo, sio);
750  if (rv<0) {
751  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
752  return rv;
753  }
754  else if (rv<200 || rv>299) {
755  /* response is only ok for continuation (100) code */
756  if (rv==100) {
757  DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
758  }
759  else {
760  GWEN_DB_NODE *dbHeaderIn;
761 
762  dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
763 
764  if (rv==301 || rv==303 || rv==305 || rv==307) {
765  /* moved */
766  if (dbHeaderIn) {
767  const char *s;
768 
769  s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
770  if (s) {
771  switch (rv) {
772  case 301:
773  case 303:
774  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
775  break;
776  case 305:
777  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
778  break;
779  case 307:
780  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
781  break;
782  default:
783  GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
784  } /* switch */
785  }
786  }
787  } /* if moved */
788  }
789  }
790 
791  return rv;
792 }
793 
794 
795 
797 {
798  int rv;
799 
800  /* read response */
801  for (;;) {
802  GWEN_SYNCIO *sio;
803 
812  rv=GWEN_SyncIo_Connect(sio);
813  if (rv<0) {
814  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
815  GWEN_SyncIo_free(sio);
816  return rv;
817  }
818 
821  I18N("Receiving response..."));
822  rv=GWEN_HttpSession__RecvPacketToSio(sess, sio);
823  if (rv<0 || rv<200 || rv>299) {
825  "Error receiving packet (%d)", rv);
827  GWEN_SyncIo_free(sio);
828  unlink(fname);
829  GWEN_SyncIo_Disconnect(sess->syncIo);
830  return rv;
831  }
832  if (rv!=100) {
833  int rv2;
834 
835  /* flush file and close it */
836  rv2=GWEN_SyncIo_Flush(sio);
837  if (rv2<0) {
838  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
839  GWEN_SyncIo_free(sio);
840  return rv2;
841  }
842  rv2=GWEN_SyncIo_Disconnect(sio);
843  if (rv2<0) {
844  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
845  GWEN_SyncIo_free(sio);
846  return rv2;
847  }
848  GWEN_SyncIo_free(sio);
849  break;
850  }
853  I18N("Received continuation response."));
855  GWEN_SyncIo_free(sio);
856  unlink(fname);
857  }
858 
861  I18N("Response received."));
862 
863  /* disconnect */
866  I18N("Disconnecting from server..."));
867  GWEN_SyncIo_Disconnect(sess->syncIo);
870  I18N("Disconnected."));
871  return rv;
872 }
873 
874 
875 
877 {
878  int rv;
879 
880  assert(sess);
881  assert(sess->usage);
882 
883  /* connect to server */
886  I18N("Connecting to server..."));
887  rv=GWEN_SyncIo_Connect(sess->syncIo);
888  if (rv<0) {
889  if (rv==GWEN_ERROR_SSL) {
890  DBG_NOTICE(GWEN_LOGDOMAIN, "SSL-Error connecting (%d)", rv);
891  }
892  DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
895  I18N("Could not connect to server"));
896  GWEN_SyncIo_Disconnect(sess->syncIo);
897  return rv;
898  }
899  else {
902  I18N("Connected."));
903 
904  GWEN_SyncIo_Disconnect(sess->syncIo);
907  I18N("Disconnected."));
908  return 0;
909  }
910 }
911 
912 
913 
915 {
916  if (sess->initSyncIoFn)
917  return sess->initSyncIoFn(sess, sio);
918  DBG_INFO(GWEN_LOGDOMAIN, "initSyncIoFn not set");
920 }
921 
922 
923 
924 
925 
926 
927 
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
Definition: syncio.c:317
void GWEN_Url_free(GWEN_URL *st)
Definition: url.c:40
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui_virtual.c:444
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:1420
#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:233
#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:243
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:417
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:152
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:64
#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:257
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:287
#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:685
int GWEN_HttpSession__RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:566
int GWEN_HttpSession_InitSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:914
#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:876
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1311
GWENHYWFAR_API int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui_virtual.c:652
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:169
#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:501
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
Definition: httpsession.c:104
static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
Definition: httpsession.c:382
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
struct GWEN_URL GWEN_URL
Definition: url.h:77
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:199
GWEN_SYNCIO * GWEN_Gui_ExtendSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO *baseSio)
Definition: gui_syncio.c:29
GWENHYWFAR_API int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text,...)
Definition: gui_virtual.c:458
#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:300
#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:971
#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:1381
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:189
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
const char * GWEN_Url_GetServer(const GWEN_URL *st)
Definition: url.c:186
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:127
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:179
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:742
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:219
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:796
GWEN_URL * GWEN_Url_fromString(const char *str)
Definition: urlfns.c:24
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
Definition: httpsession.c:157
#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:45
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:136
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:267
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1202
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:209
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:277
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:401
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
Definition: db.c:1524
#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:642
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