static int curls_set_proxy(git_stream *stream, const char *proxy_url) { CURLcode res; curl_stream *s = (curl_stream *) stream; if ((res = curl_easy_setopt(s->handle, CURLOPT_PROXY, proxy_url)) != CURLE_OK) return seterr_curl(s); return 0; }
static int curls_connect(git_stream *stream) { curl_stream *s = (curl_stream *) stream; long sockextr; int failed_cert = 0; CURLcode res; res = curl_easy_perform(s->handle); if (res != CURLE_OK && res != CURLE_PEER_FAILED_VERIFICATION) return seterr_curl(s); if (res == CURLE_PEER_FAILED_VERIFICATION) failed_cert = 1; if ((res = curl_easy_getinfo(s->handle, CURLINFO_LASTSOCKET, &sockextr)) != CURLE_OK) return seterr_curl(s); s->socket = sockextr; if (s->parent.encrypted && failed_cert) return GIT_ECERTIFICATE; return 0; }
static ssize_t curls_read(git_stream *stream, void *data, size_t len) { int error; size_t read; CURLcode res; curl_stream *s = (curl_stream *) stream; do { if ((error = wait_for(s->socket, true)) < 0) return error; res = curl_easy_recv(s->handle, data, len, &read); } while (res == CURLE_AGAIN); if (res != CURLE_OK) return seterr_curl(s); return read; }
static int curls_certificate(git_cert **out, git_stream *stream) { int error; CURLcode res; struct curl_slist *slist; struct curl_certinfo *certinfo; git_vector strings = GIT_VECTOR_INIT; curl_stream *s = (curl_stream *) stream; if ((res = curl_easy_getinfo(s->handle, CURLINFO_CERTINFO, &certinfo)) != CURLE_OK) return seterr_curl(s); /* No information is available, can happen with SecureTransport */ if (certinfo->num_of_certs == 0) { s->cert_info.parent.cert_type = GIT_CERT_NONE; s->cert_info.data = NULL; s->cert_info.len = 0; return 0; } if ((error = git_vector_init(&strings, 8, NULL)) < 0) return error; for (slist = certinfo->certinfo[0]; slist; slist = slist->next) { char *str = git__strdup(slist->data); GITERR_CHECK_ALLOC(str); git_vector_insert(&strings, str); } /* Copy the contents of the vector into a strarray so we can expose them */ s->cert_info_strings.strings = (char **) strings.contents; s->cert_info_strings.count = strings.length; s->cert_info.parent.cert_type = GIT_CERT_STRARRAY; s->cert_info.data = &s->cert_info_strings; s->cert_info.len = strings.length; *out = &s->cert_info.parent; return 0; }
static ssize_t curls_write(git_stream *stream, const char *data, size_t len, int flags) { int error; size_t off = 0, sent; CURLcode res; curl_stream *s = (curl_stream *) stream; GIT_UNUSED(flags); do { if ((error = wait_for(s->socket, false)) < 0) return error; res = curl_easy_send(s->handle, data + off, len - off, &sent); if (res == CURLE_OK) off += sent; } while ((res == CURLE_OK || res == CURLE_AGAIN) && off < len); if (res != CURLE_OK) return seterr_curl(s); return len; }