+static bool wait_conn(COMSTACK cs, int secs)
+{
+ struct yaz_poll_fd pfd;
+
+ yaz_poll_add(pfd.input_mask, yaz_poll_except);
+ if (cs->io_pending && CS_WANT_WRITE)
+ yaz_poll_add(pfd.input_mask, yaz_poll_write);
+ else if (cs->io_pending & CS_WANT_READ)
+ yaz_poll_add(pfd.input_mask, yaz_poll_read);
+
+ pfd.fd = cs_fileno(cs);
+ pfd.client_data = 0;
+
+ int ret = yaz_poll(&pfd, 1, secs, 0);
+ return ret > 0;
+}
+
+bool yf::Zoom::Impl::check_proxy(const char *proxy)
+{
+ COMSTACK conn = 0;
+ const char *uri = "http://localhost/";
+ void *add;
+ mp::odr odr;
+ bool outcome = false;
+ conn = cs_create_host_proxy(uri, 0, &add, proxy);
+
+ if (!conn)
+ return false;
+
+ Z_GDU *gdu = z_get_HTTP_Request_uri(odr, uri, 0, 1);
+ gdu->u.HTTP_Request->method = odr_strdup(odr, "GET");
+
+ if (z_GDU(odr, &gdu, 0, 0))
+ {
+ int len;
+ char *buf = odr_getbuf(odr, &len, 0);
+
+ int ret = cs_connect(conn, add);
+ if (ret > 0 || (ret == 0 && wait_conn(conn, 1)))
+ {
+ while (1)
+ {
+ ret = cs_put(conn, buf, len);
+ if (ret != 1)
+ break;
+ if (!wait_conn(conn, proxy_timeout))
+ break;
+ }
+ }
+ }
+ cs_close(conn);
+ return outcome;
+}
+