Peer-reviewed code snippets that anyone can edit
A wiki for useful code snippets
Fetch web pages with Vala and Soup

This code is from Freespeak rewrite in Vala.

public static async string http_get (string uri, Cancellable? cancellable) throws Error
  {
    if (session == null)
      session = new Soup.SessionAsync ();
 
    cancellable.set_error_if_cancelled ();
 
    var message = new Soup.Message ("GET", uri);
    if (cancellable != null)
      cancellable.cancelled.connect (() => session.cancel_message (message, Soup.KnownStatusCode.CANCELLED));
 
    SourceFunc cb = http_get.callback;
    session.queue_message (message, (s, m) => Idle.add (cb));
    yield;
 
    if (message.status_code == Soup.KnownStatusCode.OK)
      return message.response_body.data.ndup ((size_t)message.response_body.length);
    else if (message.status_code == Soup.KnownStatusCode.CANCELLED)
      throw new IOError.CANCELLED ("Cancellation requested by the user");
    else
      throw new IOError.FAILED (Soup.status_get_phrase (message.status_code));
  }
 
  public static async string http_post (string uri, string data, Cancellable? cancellable) throws Error
  {
    if (session == null)
      session = new Soup.SessionAsync ();
 
    cancellable.set_error_if_cancelled ();
 
    var message = new Soup.Message ("POST", uri);
    message.set_request ("application/x-www-form-urlencoded",
                         Soup.MemoryUse.COPY, data, data.len ());
    if (cancellable != null)
      cancellable.cancelled.connect (() => session.cancel_message (message, Soup.KnownStatusCode.CANCELLED));
 
    SourceFunc cb = http_get.callback;
    session.queue_message (message, (s, m) => Idle.add (cb));
    yield;
 
    if (message.status_code == Soup.KnownStatusCode.OK)
      return message.response_body.data.ndup ((size_t)message.response_body.length);
 
    else if (message.status_code == Soup.KnownStatusCode.CANCELLED)
      throw new IOError.CANCELLED ("Cancellation requested by the user");
    else
      throw new IOError.FAILED (Soup.status_get_phrase (message.status_code));
  }