-/*
- * Copyright (C) 1995-2007, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2010 Index Data
* See the file LICENSE for details.
- *
- * $Id: tst_comstack.c,v 1.1 2007-01-11 10:30:41 adam Exp $
*/
#include <stdlib.h>
+#include <string.h>
#include <stdio.h>
#include <yaz/test.h>
#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
static void tst_http_request(void)
{
"\r\n"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 16), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 17), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 18), 18);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 19), 18);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 16), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 17), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 18), 18);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 19), 18);
}
{
/* one header, no content */
"\r\n"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 34), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 35), 35);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 36), 35);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 34), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 35);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 36), 35);
}
{
/* one content-length header, length 0 */
"\r\n"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 35), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 37), 37);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 38), 37);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 37), 37);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 37);
}
{
/* one content-length header, length 5 */
"ABCDE"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 41), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 42), 42);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 43), 42);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 42);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 43), 42);
}
{
/* LF only in GET, one content-length header, length 5 */
"ABCDE"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 40), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 41), 41);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 42), 41);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 41);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 41);
}
{
/* LF only in all places, one content-length header, length 5 */
"ABCDE"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 38), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 39), 39);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 40), 39);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 39);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 39);
}
{
"\r\n"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 45), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 46), 46);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 45), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 46), 46);
}
{
"0\r\n\r\n"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 58), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 59), 59);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 58), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 59), 59);
}
{
"0\r\n\r\n"
"GET / HTTP/1.0\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 64), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 65), 65);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 64), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 65), 65);
}
}
"\r\n"
"HTTP/1.1 200 OK\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 24), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 0);
}
{
/* response, content */
"12"
"HTTP/1.1 200 OK\r\n";
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 39), 0);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 40), 40);
- YAZ_CHECK_EQ(cs_complete_http(http_buf, 41), 40);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 0);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 40);
+ YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 40);
+ }
+}
+
+/** \brief COMSTACK synopsis from manual, doc/comstack.xml */
+static int comstack_example(const char *server_address_str)
+{
+ COMSTACK stack;
+ char *buf = 0;
+ int size = 0, length_incoming;
+ void *server_address_ip;
+ int status;
+
+ char *protocol_package = "GET / HTTP/1.0\r\n\r\n";
+ int protocol_package_length = strlen(protocol_package);
+
+ stack = cs_create(tcpip_type, 1, PROTO_HTTP);
+ if (!stack) {
+ perror("cs_create"); /* use perror() here since we have no stack yet */
+ return -1;
+ }
+
+ server_address_ip = cs_straddr(stack, server_address_str);
+ if (!server_address_ip)
+ {
+ fprintf(stderr, "cs_straddr: address could not be resolved\n");
+ return -1;
+ }
+
+ status = cs_connect(stack, server_address_ip);
+ if (status != 0) {
+ fprintf(stderr, "cs_connect: %s\n", cs_strerror(stack));
+ return -1;
+ }
+
+ status = cs_put(stack, protocol_package, protocol_package_length);
+ if (status) {
+ fprintf(stderr, "cs_put: %s\n", cs_strerror(stack));
+ return -1;
+ }
+
+ /* Now get a response */
+
+ length_incoming = cs_get(stack, &buf, &size);
+ if (!length_incoming) {
+ fprintf(stderr, "Connection closed\n");
+ return -1;
+ } else if (length_incoming < 0) {
+ fprintf(stderr, "cs_get: %s\n", cs_strerror(stack));
+ return -1;
}
+
+ /* Print result */
+ fwrite(buf, length_incoming, 1, stdout);
+
+ /* clean up */
+ cs_close(stack);
+ if (buf)
+ free(buf);
+ return 0;
}
{
YAZ_CHECK_INIT(argc, argv);
YAZ_CHECK_LOG();
+ if (argc == 2)
+ comstack_example(argv[1]);
tst_http_request();
tst_http_response();
YAZ_CHECK_TERM;
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab