Ejemplo n.º 1
0
/**
 * soup_client_context_get_host:
 * @client: a #SoupClientContext
 *
 * Retrieves the IP address associated with the remote end of a
 * connection. (If you want the actual hostname, you'll have to call
 * soup_client_context_get_address() and then call the appropriate
 * #SoupAddress method to resolve it.)
 *
 * Return value: the IP address associated with the remote end of a
 * connection.
 **/
const char *
soup_client_context_get_host (SoupClientContext *client)
{
	SoupAddress *address;

	address = soup_client_context_get_address (client);
	return soup_address_get_physical (address);
}
void
gss_transaction_dump (GssTransaction * t)
{
  SoupMessageHeadersIter iter;
  const char *name;
  const char *value;

  g_print ("Request: %s %s\n", t->msg->method, t->path);
  if (t->query) {
    GHashTableIter iter;
    char *key, *value;

    g_hash_table_iter_init (&iter, t->query);
    while (g_hash_table_iter_next (&iter, (gpointer) & key, (gpointer) & value)) {
      g_print ("  %s=%s\n", key, value);
    }
  }
  if (t->msg->method == SOUP_METHOD_POST) {
    g_print ("Content:\n%s\n", t->msg->request_body->data);
  }
  g_print ("From: %s\n",
      soup_address_get_physical (soup_client_context_get_address (t->client)));
  g_print ("Status: %d\n", t->msg->status_code);
  g_print ("Request Headers:\n");
  soup_message_headers_iter_init (&iter, t->msg->request_headers);
  while (soup_message_headers_iter_next (&iter, &name, &value)) {
    g_print ("  %s: %s\n", name, value);
  }

  g_print ("Response Headers:\n");
  soup_message_headers_iter_init (&iter, t->msg->response_headers);
  while (soup_message_headers_iter_next (&iter, &name, &value)) {
    g_print ("  %s: %s\n", name, value);
  }
  g_print ("\n");

}
Ejemplo n.º 3
0
static void
gss_server_resource_callback (SoupServer * soupserver, SoupMessage * msg,
    const char *path, GHashTable * query, SoupClientContext * client,
    gpointer user_data)
{
  GssServer *server = (GssServer *) user_data;
  GssTransaction *t;
  GssSession *session;

  t = gss_transaction_new (server, soupserver, msg, path, query, client);

  t->resource = gss_server_lookup_resource (server, path);

  if (!t->resource) {
    gss_transaction_error_not_found (t, "resource not found");
    return;
  }

  if (t->resource->flags & GSS_RESOURCE_UI) {
    if (!server->enable_public_interface && soupserver == server->server) {
      gss_transaction_error_not_found (t, "public interface disabled");
      return;
    }
  }

  if (t->resource->flags & GSS_RESOURCE_HTTPS_ONLY) {
    if (soupserver != server->ssl_server) {
      gss_transaction_error_not_found (t, "resource https only");
      return;
    }
  }

  session = gss_session_get_session (query);
  if (session && soupserver != server->ssl_server) {
    gss_session_invalidate (session);
    session = NULL;
  }

  if (t->resource->flags & GSS_RESOURCE_USER) {
    if (session == NULL) {
      gss_transaction_error_not_found (t, "resource requires login");
      return;
    }
  }
  t->session = session;

  if (t->resource->flags & GSS_RESOURCE_ADMIN) {
    if (session == NULL || !session->is_admin ||
        !gss_addr_range_list_check_address (server->admin_arl,
            soup_client_context_get_address (client))) {
      gss_html_error_401 (server, msg);
      return;
    }
  }

  if (t->resource->content_type) {
    soup_message_headers_replace (msg->response_headers, "Content-Type",
        t->resource->content_type);
  }

  if (t->resource->etag) {
    const char *inm;

    soup_message_headers_append (msg->response_headers, "Cache-Control",
        "max-age=86400");
    inm = soup_message_headers_get_one (msg->request_headers, "If-None-Match");
    if (inm && !strcmp (inm, t->resource->etag)) {
      soup_message_set_status (msg, SOUP_STATUS_NOT_MODIFIED);
      return;
    }
  } else {
    soup_message_headers_append (msg->response_headers, "Cache-Control",
        "must-revalidate");
  }


  if (t->resource->flags & GSS_RESOURCE_HTTP_ONLY) {
    if (soupserver != server->server) {
      gss_resource_onetime_redirect (t);
      return;
    }
  }

  soup_message_set_status (msg, SOUP_STATUS_OK);

  if ((msg->method == SOUP_METHOD_GET || msg->method == SOUP_METHOD_HEAD)
      && t->resource->get_callback) {
    t->resource->get_callback (t);
  } else if (msg->method == SOUP_METHOD_PUT && t->resource->put_callback) {
    t->resource->put_callback (t);
  } else if (msg->method == SOUP_METHOD_POST && t->resource->post_callback) {
    t->resource->post_callback (t);
  } else if (msg->method == SOUP_METHOD_SOURCE && t->resource->put_callback) {
    t->resource->put_callback (t);
  } else if (msg->method == SOUP_METHOD_OPTIONS) {
    soup_message_headers_replace (msg->response_headers,
        "Access-Control-Allow-Origin", "*");
    soup_message_headers_replace (msg->response_headers,
        "Access-Control-Allow-Headers", "origin,range,content-type");
    soup_message_headers_replace (msg->response_headers,
        "Access-Control-Expose-Headers", "Server,range");
    soup_message_headers_replace (msg->response_headers,
        "Access-Control-Allow-Methods", "GET, HEAD, OPTIONS");
  } else {
    gss_html_error_405 (server, msg);
  }

  if (t->s) {
    int len;
    gchar *content;

    len = t->s->len;
    content = g_string_free (t->s, FALSE);
    soup_message_body_append (msg->response_body, SOUP_MEMORY_TAKE,
        content, len);
  }
}