Message
Object Hierarchy:
Description:
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", "api.valadoc.org", "/", -1);
SList<Soup.Cookie> list = new SList<Soup.Cookie> ();
list.append (cookie);
// Send a request:
Soup.Message msg = new Soup.Message ("GET", "http://api.valadoc.org/soup-samples/print-and-create-cookies.php");
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) msg.response_body.data);
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.name, 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.name, c.value);
}
return 0;
}
valac --pkg libsoup-2.4 cookie-sample-sync.vala