gwenhywfar  5.10.1
gui_syncio.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Feb 07 2003
3  copyright : (C) 2021 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 /* included from gui.c */
26 
27 
28 
30  const char *defaultProto,
31  int defaultPort,
32  GWEN_SYNCIO *baseSio)
33 {
34  GWEN_GUI *gui;
35  GWEN_URL *u=NULL;
36  const char *sProtocol=NULL;
37  int port=0;
38  const char *addr=NULL;
39 
40  gui=GWEN_Gui_GetGui();
41  assert(gui);
42 
43  if (!(url && *url)) {
44  DBG_ERROR(GWEN_LOGDOMAIN, "Empty URL");
45  return NULL;
46  }
47 
48  if (url && *url) {
49  u=GWEN_Url_fromString(url);
50  if (u==NULL) {
51  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid URL [%s]", url);
52  return NULL;
53  }
54 
55  /* determine protocol and port */
56  sProtocol=GWEN_Url_GetProtocol(u);
57  if (!(sProtocol && *sProtocol))
58  sProtocol=defaultProto;
59  port=GWEN_Url_GetPort(u);
60  if (port<1)
61  port=defaultPort;
62  addr=GWEN_Url_GetServer(u);
63  if (!(addr && *addr)) {
64  DBG_ERROR(GWEN_LOGDOMAIN, "Missing server in URL [%s]", url);
65  GWEN_Url_free(u);
66  return NULL;
67  }
68  }
69 
70  if (!(sProtocol && *sProtocol))
71  sProtocol="http";
72  if (port<1)
73  port=80;
74 
75  if (strcasecmp(sProtocol, "http")==0 ||
76  strcasecmp(sProtocol, "https")==0) {
77  GWEN_SYNCIO *sio;
78  GWEN_SYNCIO *baseLayer;
79  GWEN_DB_NODE *db;
80  GWEN_BUFFER *tbuf;
81  int rv;
82 
83  baseLayer=baseSio;
84 
85  if (strcasecmp(sProtocol, "https")==0) {
86  /* create TLS layer */
87  sio=GWEN_SyncIo_Tls_new(baseLayer);
88  if (sio==NULL) {
89  DBG_INFO(GWEN_LOGDOMAIN, "here");
90  GWEN_SyncIo_free(baseLayer);
91  GWEN_Url_free(u);
92  return NULL;
93  }
94  if (addr)
96  baseLayer=sio;
97  }
98 
99  /* create buffered layer as needed for HTTP */
100  sio=GWEN_SyncIo_Buffered_new(baseLayer);
101  if (sio==NULL) {
102  DBG_INFO(GWEN_LOGDOMAIN, "here");
103  GWEN_SyncIo_free(baseLayer);
104  GWEN_Url_free(u);
105  return NULL;
106  }
107  baseLayer=sio;
108 
109  /* create HTTP layer */
110  sio=GWEN_SyncIo_Http_new(baseLayer);
111  if (sio==NULL) {
112  DBG_INFO(GWEN_LOGDOMAIN, "here");
113  GWEN_SyncIo_free(baseLayer);
114  GWEN_Url_free(u);
115  return NULL;
116  }
117 
118  /* setup default command and header */
119  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
121 
122  /* get command string (e.g. server-relative path plus variables) */
123  rv=GWEN_Url_toCommandString(u, tbuf);
124  if (rv<0) {
125  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid path in URL, ignoring (%d)", rv);
126  }
127  else
129  GWEN_Buffer_free(tbuf);
130 
131  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "command", "GET");
132  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", "HTTP/1.0");
133 
134  /* preset some headers */
137  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
138 
139  /* done */
140  GWEN_Url_free(u);
141  return sio;
142  }
143  else {
144  /* just return raw base layer */
145  DBG_INFO(GWEN_LOGDOMAIN, "No special handling of protocol \"%s\", returning raw base layer.",
146  sProtocol?sProtocol:"(empty)");
147  return baseSio;
148  }
149 }
150 
151 
152 
154  const char *url,
155  const char *defaultProto,
156  int defaultPort,
157  GWEN_SYNCIO **pSio)
158 {
159  GWEN_URL *u;
160  const char *s;
161  int port;
162  const char *addr;
163  GWEN_SYNCIO *sio;
164  GWEN_SYNCIO *baseLayer;
165 
166  if (!(url && *url)) {
167  DBG_ERROR(GWEN_LOGDOMAIN, "Empty URL");
168  return GWEN_ERROR_INVALID;
169  }
170 
171  u=GWEN_Url_fromString(url);
172  if (u==NULL) {
173  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid URL [%s]", url);
174  return GWEN_ERROR_INVALID;
175  }
176 
177  /* determine protocol and port */
179  if (!(s && *s))
180  s=defaultProto;
181  if (!(s && *s))
182  s="http";
183  port=GWEN_Url_GetPort(u);
184  if (port<1)
185  port=defaultPort;
186  if (port<1)
187  port=80;
188  addr=GWEN_Url_GetServer(u);
189  if (!(addr && *addr)) {
190  DBG_ERROR(GWEN_LOGDOMAIN, "Missing server in URL [%s]", url);
191  GWEN_Url_free(u);
192  return GWEN_ERROR_INVALID;
193  }
194 
195 
196  /* create base io */
198  if (sio==NULL) {
199  DBG_INFO(GWEN_LOGDOMAIN, "here");
200  GWEN_Url_free(u);
201  return GWEN_ERROR_GENERIC;
202  }
204  GWEN_SyncIo_Socket_SetPort(sio, port);
205  baseLayer=sio;
206 
207  sio=GWEN_Gui_ExtendSyncIo(url, defaultProto, defaultPort, baseLayer);
208  if (sio==NULL) {
209  DBG_INFO(GWEN_LOGDOMAIN, "here");
210  GWEN_SyncIo_free(baseLayer);
211  GWEN_Url_free(u);
212  return GWEN_ERROR_GENERIC;
213  }
214 
215  /* done */
216  GWEN_Url_free(u);
217  *pSio=sio;
218  return 0;
219 }
220 
221 
222 
223 
void GWEN_Url_free(GWEN_URL *st)
Definition: url.c:40
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_ERROR_INVALID
Definition: error.h:67
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1324
#define NULL
Definition: binreloc.c:300
void GWEN_SyncIo_Socket_SetAddress(GWEN_SYNCIO *sio, const char *s)
const char * GWEN_Url_GetProtocol(const GWEN_URL *st)
Definition: url.c:164
int GWEN_Url_GetPort(const GWEN_URL *st)
Definition: url.c:208
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
int GWEN_Url_toCommandString(const GWEN_URL *url, GWEN_BUFFER *buf)
Definition: urlfns.c:387
GWEN_SYNCIO * GWEN_SyncIo_Http_new(GWEN_SYNCIO *baseIo)
Definition: syncio_http.c:52
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
GWEN_SYNCIO * GWEN_SyncIo_Buffered_new(GWEN_SYNCIO *baseIo)
GWEN_SYNCIO * GWEN_SyncIo_Tls_new(GWEN_SYNCIO *baseIo)
Definition: syncio_tls.c:72
struct GWEN_URL GWEN_URL
Definition: url.h:77
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
GWEN_SYNCIO * GWEN_Gui_ExtendSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO *baseSio)
Definition: gui_syncio.c:29
GWEN_GUI * GWEN_Gui_GetGui(void)
Definition: gui.c:160
#define GWEN_ERROR_GENERIC
Definition: error.h:62
void GWEN_SyncIo_Tls_SetRemoteHostName(GWEN_SYNCIO *sio, const char *s)
Definition: syncio_tls.c:297
void GWEN_SyncIo_Socket_SetPort(GWEN_SYNCIO *sio, int i)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
const char * GWEN_Url_GetServer(const GWEN_URL *st)
Definition: url.c:186
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
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
struct GWEN_GUI GWEN_GUI
Definition: gui.h:176
GWEN_SYNCIO * GWEN_SyncIo_Socket_new(GWEN_SOCKETTYPE sockType, GWEN_AddressFamily addressFamily)
Definition: syncio_socket.c:54
int GWENHYWFAR_CB GWEN_Gui_Internal_GetSyncIo(GWEN_UNUSED GWEN_GUI *gui, const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui_syncio.c:153
#define GWEN_UNUSED