/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
/*
 * Copyright (C) 2000-2003, Ximian, Inc.
 */

#pragma once

#include "soup-types.h"
#include "soup-message-body.h"
#include "soup-message-headers.h"
#include "soup-method.h"
#include "soup-multipart.h"

G_BEGIN_DECLS

#define SOUP_TYPE_MESSAGE (soup_message_get_type ())
SOUP_AVAILABLE_IN_ALL
G_DECLARE_FINAL_TYPE (SoupMessage, soup_message, SOUP, MESSAGE, GObject)

SOUP_AVAILABLE_IN_ALL
SoupMessage   *soup_message_new                   (const char        *method,
						   const char        *uri_string);
SOUP_AVAILABLE_IN_ALL
SoupMessage   *soup_message_new_from_uri          (const char        *method,
						   GUri              *uri);

SOUP_AVAILABLE_IN_ALL
SoupMessage   *soup_message_new_options_ping      (GUri              *base_uri);

SOUP_AVAILABLE_IN_ALL
SoupMessage   *soup_message_new_from_encoded_form (const char        *method,
						   const char        *uri_string,
						   char              *encoded_form);

SOUP_AVAILABLE_IN_ALL
SoupMessage   *soup_message_new_from_multipart    (const char        *uri_string,
						   SoupMultipart     *multipart);

SOUP_AVAILABLE_IN_ALL
void           soup_message_set_request_body    (SoupMessage       *msg,
						 const char        *content_type,
						 GInputStream      *stream,
						 gssize             content_length);
SOUP_AVAILABLE_IN_ALL
void           soup_message_set_request_body_from_bytes (SoupMessage  *msg,
							 const char   *content_type,
							 GBytes       *bytes);

SOUP_AVAILABLE_IN_ALL
SoupHTTPVersion  soup_message_get_http_version    (SoupMessage       *msg);

SOUP_AVAILABLE_IN_ALL
gboolean         soup_message_is_keepalive        (SoupMessage       *msg);

SOUP_AVAILABLE_IN_ALL
GUri           *soup_message_get_uri             (SoupMessage       *msg);
SOUP_AVAILABLE_IN_ALL
void             soup_message_set_uri             (SoupMessage       *msg,
						   GUri              *uri);
SOUP_AVAILABLE_IN_ALL
GUri            *soup_message_get_first_party     (SoupMessage       *msg);
SOUP_AVAILABLE_IN_ALL
void             soup_message_set_first_party     (SoupMessage       *msg,
						   GUri              *first_party);
SOUP_AVAILABLE_IN_ALL
GUri            *soup_message_get_site_for_cookies (SoupMessage      *msg);
SOUP_AVAILABLE_IN_ALL
void             soup_message_set_site_for_cookies (SoupMessage      *msg,
						    GUri             *site_for_cookies);
SOUP_AVAILABLE_IN_ALL
void             soup_message_set_is_top_level_navigation (SoupMessage      *msg,
			                                   gboolean          is_top_level_navigation);
SOUP_AVAILABLE_IN_ALL
gboolean         soup_message_get_is_top_level_navigation (SoupMessage      *msg);

typedef enum {
	SOUP_MESSAGE_NO_REDIRECT              = (1 << 1),
	SOUP_MESSAGE_NEW_CONNECTION           = (1 << 2),
	SOUP_MESSAGE_IDEMPOTENT               = (1 << 3),
	SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE    = (1 << 4),
        SOUP_MESSAGE_COLLECT_METRICS          = (1 << 5)
} SoupMessageFlags;

SOUP_AVAILABLE_IN_ALL
void             soup_message_set_flags           (SoupMessage           *msg,
						   SoupMessageFlags       flags);

SOUP_AVAILABLE_IN_ALL
SoupMessageFlags soup_message_get_flags           (SoupMessage           *msg);

SOUP_AVAILABLE_IN_ALL
void             soup_message_add_flags           (SoupMessage           *msg,
						   SoupMessageFlags       flags);

SOUP_AVAILABLE_IN_ALL
void             soup_message_remove_flags        (SoupMessage           *msg,
						   SoupMessageFlags       flags);

SOUP_AVAILABLE_IN_ALL
gboolean         soup_message_query_flags         (SoupMessage           *msg,
                                                   SoupMessageFlags       flags);

SOUP_AVAILABLE_IN_ALL
GTlsCertificate     *soup_message_get_tls_peer_certificate                         (SoupMessage     *msg);

SOUP_AVAILABLE_IN_ALL
GTlsCertificateFlags soup_message_get_tls_peer_certificate_errors                  (SoupMessage     *msg);

SOUP_AVAILABLE_IN_ALL
GTlsProtocolVersion  soup_message_get_tls_protocol_version                         (SoupMessage     *msg);

SOUP_AVAILABLE_IN_ALL
const char          *soup_message_get_tls_ciphersuite_name                         (SoupMessage     *msg);

SOUP_AVAILABLE_IN_ALL
void                 soup_message_set_tls_client_certificate                       (SoupMessage     *msg,
                                                                                    GTlsCertificate *certificate);

SOUP_AVAILABLE_IN_ALL
void                 soup_message_tls_client_certificate_password_request_complete (SoupMessage     *msg);


/* Specialized signal handlers */
SOUP_AVAILABLE_IN_ALL
guint          soup_message_add_header_handler  (SoupMessage       *msg,
						 const char        *signal,
						 const char        *header,
						 GCallback          callback,
						 gpointer           user_data);

SOUP_AVAILABLE_IN_ALL
guint          soup_message_add_status_code_handler (
						 SoupMessage       *msg,
						 const char        *signal,
						 guint              status_code,
						 GCallback          callback,
						 gpointer           user_data);

SOUP_AVAILABLE_IN_ALL
void           soup_message_disable_feature     (SoupMessage       *msg,
						 GType              feature_type);

SOUP_AVAILABLE_IN_ALL
gboolean       soup_message_is_feature_disabled (SoupMessage       *msg,
						 GType              feature_type);


typedef enum {
	SOUP_MESSAGE_PRIORITY_VERY_LOW = 0,
	SOUP_MESSAGE_PRIORITY_LOW,
	SOUP_MESSAGE_PRIORITY_NORMAL,
	SOUP_MESSAGE_PRIORITY_HIGH,
	SOUP_MESSAGE_PRIORITY_VERY_HIGH
} SoupMessagePriority;

SOUP_AVAILABLE_IN_ALL
void                soup_message_set_priority   (SoupMessage        *msg,
						 SoupMessagePriority priority);


SOUP_AVAILABLE_IN_ALL
SoupMessagePriority soup_message_get_priority   (SoupMessage        *msg);

SOUP_AVAILABLE_IN_ALL
const char         *soup_message_get_method     (SoupMessage        *msg);

SOUP_AVAILABLE_IN_ALL
void                soup_message_set_method     (SoupMessage        *msg,
                                                 const char         *method);

SOUP_AVAILABLE_IN_ALL
SoupStatus          soup_message_get_status     (SoupMessage        *msg);

SOUP_AVAILABLE_IN_ALL
const char         *soup_message_get_reason_phrase (SoupMessage     *msg);

SOUP_AVAILABLE_IN_ALL
SoupMessageHeaders *soup_message_get_request_headers  (SoupMessage  *msg);

SOUP_AVAILABLE_IN_ALL
SoupMessageHeaders *soup_message_get_response_headers (SoupMessage  *msg);

SOUP_AVAILABLE_IN_ALL
gboolean            soup_message_get_is_options_ping  (SoupMessage  *msg);

SOUP_AVAILABLE_IN_ALL
void                soup_message_set_is_options_ping  (SoupMessage  *msg,
                                                       gboolean      is_options_ping);
SOUP_AVAILABLE_IN_ALL
guint64             soup_message_get_connection_id    (SoupMessage *msg);

SOUP_AVAILABLE_IN_ALL
GSocketAddress     *soup_message_get_remote_address   (SoupMessage *msg);

SOUP_AVAILABLE_IN_ALL
SoupMessageMetrics *soup_message_get_metrics          (SoupMessage  *msg);


G_END_DECLS
