struct http_request *http_dorequest_url( char *url_string, http_input_function func, gpointer data ) { url_t *url = g_new0( url_t, 1 ); char *request; void *ret; if( !url_set( url, url_string ) ) { g_free( url ); return NULL; } if( url->proto != PROTO_HTTP && url->proto != PROTO_HTTPS ) { g_free( url ); return NULL; } request = g_strdup_printf( "GET %s HTTP/1.0\r\n" "Host: %s\r\n" "Connection: close\r\n" "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n" "\r\n", url->file, url->host ); ret = http_dorequest( url->host, url->port, url->proto == PROTO_HTTPS, request, func, data ); g_free( url ); g_free( request ); return ret; }
static void omegle_get(void *to_pass, char *host, char *path, http_input_function callback) { GString *request; request = g_string_new(""); g_string_append_printf(request, "GET %s HTTP/1.0\r\n", path); g_string_append_printf(request, "Host: %s\r\n", host); g_string_append_printf(request, "User-Agent: BitlBee %s\r\n", BITLBEE_VERSION); g_string_append_printf(request, "\r\n"); http_dorequest(host, 80, 0, request->str, callback, to_pass); g_string_free(request, TRUE); }
static void omegle_post(void *to_pass, char *session_id, char *host, char *path, char *data, http_input_function callback) { GString *request; GString *form; request = g_string_new(""); form = g_string_new(""); g_string_append_printf(form, "id=%s&%s", session_id, data); g_string_append_printf(request, "POST %s HTTP/1.0\r\n", path); g_string_append_printf(request, "Host: %s\r\n", host); g_string_append_printf(request, "User-Agent: BitlBee %s\r\n", BITLBEE_VERSION); g_string_append_printf(request, "Content-Type: application/x-www-form-urlencoded\r\n"); g_string_append_printf(request, "Content-Length: %zd\r\n\r\n", form->len); g_string_append_printf(request, "%s", form->str); http_dorequest(host, 80, 0, request->str, callback, to_pass); g_string_free(request, TRUE); g_string_free(form, TRUE); }
/** * Sends a #SteamHttpReq. * * @param req The #SteamHttpReq. **/ void steam_http_req_send(SteamHttpReq *req) { gchar *str; gchar *hs; gchar *ps; g_return_if_fail(req != NULL); steam_http_req_asm(req, &hs, &ps, &str); #ifdef DEBUG_STEAM steam_http_req_debug(req, FALSE, hs, ps); #endif /* DEBUG_STEAM */ req->request = http_dorequest(req->host, req->port, (req->flags & STEAM_HTTP_REQ_FLAG_SSL), str, steam_http_req_cb, req); g_hash_table_add(req->http->reqs, req); g_free(hs); g_free(ps); g_free(str); if (G_UNLIKELY(req->request == NULL)) { g_set_error(&req->err, STEAM_HTTP_ERROR, STEAM_HTTP_ERROR_INIT, "Failed to init request"); steam_http_req_done(req); return; } /* Prevent automatic redirection */ req->request->redir_ttl = 0; if (req->timeout > 0) { req->toid = b_timeout_add(req->timeout, steam_http_req_send_timeout, req); } }
/** * Do a request. * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c */ struct http_request *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, gpointer data, int is_post, char **arguments, int arguments_len) { struct twitter_data *td = ic->proto_data; char *tmp; GString *request = g_string_new(""); void *ret; char *url_arguments; url_t *base_url = NULL; url_arguments = g_strdup(""); // Construct the url arguments. if (arguments_len != 0) { int i; for (i = 0; i < arguments_len; i += 2) { tmp = twitter_url_append(url_arguments, arguments[i], arguments[i + 1]); g_free(url_arguments); url_arguments = tmp; } } if (strstr(url_string, "://")) { base_url = g_new0(url_t, 1); if (!url_set(base_url, url_string)) { g_free(base_url); return NULL; } } // Make the request. g_string_printf(request, "%s %s%s%s%s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n", is_post ? "POST" : "GET", base_url ? base_url->file : td->url_path, base_url ? "" : url_string, is_post ? "" : "?", is_post ? "" : url_arguments, base_url ? base_url->host : td->url_host); // If a pass and user are given we append them to the request. if (td->oauth_info) { char *full_header; char *full_url; if (base_url) { full_url = g_strdup(url_string); } else { full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url"), url_string, NULL); } full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET", full_url, url_arguments); g_string_append_printf(request, "Authorization: %s\r\n", full_header); g_free(full_header); g_free(full_url); } else { char userpass[strlen(ic->acc->user) + 2 + strlen(ic->acc->pass)]; char *userpass_base64; g_snprintf(userpass, sizeof(userpass), "%s:%s", ic->acc->user, ic->acc->pass); userpass_base64 = base64_encode((unsigned char *) userpass, strlen(userpass)); g_string_append_printf(request, "Authorization: Basic %s\r\n", userpass_base64); g_free(userpass_base64); } // Do POST stuff.. if (is_post) { // Append the Content-Type and url-encoded arguments. g_string_append_printf(request, "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: %zd\r\n\r\n%s", strlen(url_arguments), url_arguments); } else { // Append an extra \r\n to end the request... g_string_append(request, "\r\n"); } if (base_url) { ret = http_dorequest(base_url->host, base_url->port, base_url->proto == PROTO_HTTPS, request->str, func, data); } else { ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data); } g_free(url_arguments); g_string_free(request, TRUE); g_free(base_url); return ret; }