Object Hierarchy:

Soup.Message Soup.Message Soup.Message GLib.Object GLib.Object GLib.Object->Soup.Message


[ CCode ( type_id = "soup_message_get_type ()" ) ]
public class Message : Object

Represents an HTTP message being sent or received.

status_code will normally be a Status value, eg, OK, though of course it might actually be an unknown status code. reason_phrase is the actual text returned from the server, which may or may not correspond to the "standard" description of status_code. At any rate, it is almost certainly not localized, and not very descriptive even if it is in the user's language; you should not use reason_phrase in user-visible messages. Rather, you should look at status_code, and determine an end-user-appropriate message based on that and on what you were trying to do.

As described in the MessageBody documentation, the request_body and response_body data fields will not necessarily be filled in at all times. When the body fields are filled in, they will be terminated with a '\0' byte (which is not included in the length), so you can use them as ordinary C strings (assuming that you know that the body doesn't have any other '\0' bytes).

For a client-side Message, request_body's data is usually filled in right before libsoup writes the request to the network, but you should not count on this; use flatten if you want to ensure that data is filled in. If you are not using Request to read the response, then response_body's data will be filled in before finished is emitted. (If you are using Request, then the message body is not accumulated by default, so response_body 's data will always be null.)

For a server-side Message, request_body's data will be filled in before got_body is emitted.

To prevent the data field from being filled in at all (eg, if you are handling the data from a got_chunk, and so don't need to see it all at the end), call set_accumulate on response_body or request_body as appropriate, passing false.

Example: Cookies, sync:

public static int main (string[] args) {
// Create a session:
Soup.Session session = new Soup.Session ();

// Add a logger:
Soup.Logger logger = new Soup.Logger (Soup.LoggerLogLevel.MINIMAL, -1);
session.add_feature (logger);

// Create a cookie:
Soup.Cookie cookie = new Soup.Cookie ("soup-cookie", "my-val", "", "/", -1);
SList<Soup.Cookie> list = new SList<Soup.Cookie> ();
list.append (cookie);

// Send a request:
Soup.Message msg = new Soup.Message ("GET", "");
Soup.cookies_to_request (list, msg);
session.send_message (msg);

// Process the result:
msg.response_headers.foreach ((name, val) => {
print ("%s = %s\n", name, val);

print ("Status Code: %u\n", msg.status_code);
print ("Message length: %lld\n", msg.response_body.length);
print ("Data: \n%s\n", (string);

GLib.SList<Soup.Cookie> cookies = Soup.cookies_from_request (msg);
print ("Cookies from request: (%u)\n", cookies.length ());

foreach (Soup.Cookie c in cookies) {
print (" %s: %s\n",, c.value);

cookies = Soup.cookies_from_response (msg);
print ("Cookies from response: (%u)\n", cookies.length ());

foreach (Soup.Cookie c in cookies) {
print (" %s: %s\n",, c.value);

return 0;

valac --pkg libsoup-2.4 cookie-sample-sync.vala

Namespace: Soup
Package: libsoup-2.4



Creation methods:




Inherited Members: