int main(int argc, const char* argv[]) { const char* inp_file = (argc > 5) ? argv[5] : ""; const char* user_header = (argc > 6) ? argv[6] : ""; SConnNetInfo* net_info; CONNECTOR connector; CONN conn; EIO_Status status; char buffer[100]; size_t n_read, n_written; /* Prepare to connect: parse and check cmd.-line args, etc. */ s_Args.host = (argc > 1) ? argv[1] : ""; s_Args.port = (argc > 2) ? argv[2] : ""; s_Args.path = (argc > 3) ? argv[3] : ""; s_Args.args = (argc > 4) ? argv[4] : ""; fprintf(stderr, "Running '%s':\n" " URL host: '%s'\n" " URL port: '%s'\n" " URL path: '%s'\n" " URL args: '%s'\n" " Input data file: '%s'\n" " User header: '%s'\n" "Reply(if any) from the hit URL goes to the standard output.\n\n", argv[0], s_Args.host, s_Args.port, s_Args.path, s_Args.args, inp_file, user_header); /* Log stream */ CORE_SetLOGFormatFlags(fLOG_None | fLOG_Level | fLOG_OmitNoteLevel | fLOG_DateTime); CORE_SetLOGFILE(stderr, 0/*false*/); /* Tune to the test URL using hard-coded pseudo-registry */ CORE_SetREG( REG_Create(0, s_REG_Get, 0, 0, 0) ); SOCK_SetupSSL(NcbiSetupTls); /* Usage */ if (argc < 4) { fprintf(stderr, "Usage: %s host port path [args] [inp_file] [user_header]\n" "Example: %s www.ncbi.nlm.nih.gov 80 " "/Service/bounce.cgi 'arg1+arg2+arg3'\n", argv[0], argv[0]); CORE_LOG(eLOG_Fatal, "Too few arguments"); return 1; } /* Connect */ if (atoi(s_Args.port) == CONN_PORT_HTTPS) { verify((net_info = ConnNetInfo_Create(0)) != 0); net_info->scheme = eURL_Https; } else net_info = 0; connector = HTTP_CreateConnector(net_info, user_header, 0); assert(connector); verify(CONN_Create(connector, &conn) == eIO_Success); ConnNetInfo_Destroy(net_info); /* If input file specified, then send its content (as HTTP request body) */ if (*inp_file) { FILE* inp_fp; if (strcmp(inp_file, "-") != 0) { static const char kDevNull[] = #ifdef NCBI_OS_MSWIN "NUL" #else "/dev/null" #endif /*NCBI_OS_MSWIN*/ ; if (strcmp(inp_file, "+") == 0) inp_file = kDevNull; if (!(inp_fp = fopen(inp_file, "rb"))) { CORE_LOGF(eLOG_Fatal, ("Cannot open file '%s' for reading", inp_file)); } } else inp_fp = stdin; for (;;) { n_read = fread(buffer, 1, sizeof(buffer), inp_fp); if (n_read <= 0) { assert(feof(inp_fp)); break; /* EOF */ } status = CONN_Write(conn, buffer, n_read, &n_written, eIO_WritePersist); if (status != eIO_Success) { CORE_LOGF(eLOG_Fatal, ("Unable to write to URL: %s",IO_StatusStr(status))); } assert(n_written == n_read); } fclose(inp_fp); } /* Read reply from connection, write it to standard output */ for (;;) { status = CONN_Read(conn,buffer,sizeof(buffer),&n_read,eIO_ReadPlain); if (status != eIO_Success) break; if (connector) puts("----- [BEGIN] HTTP Content -----"); fwrite(buffer, 1, n_read, stdout); fflush(stdout); connector = 0; } if (!connector) { puts("\n----- [END] HTTP Content -----"); fclose(stdout); } if (status != eIO_Closed) { CORE_LOGF(eLOG_Fatal, ("Unable to read from URL: %s", IO_StatusStr(status))); } /* Success: close the connection, cleanup, and exit */ CONN_Close(conn); CORE_SetREG(0); CORE_LOG(eLOG_Note, "TEST completed successfully"); CORE_SetLOG(0); return 0; }
int main(int argc, char* argv[]) { char* user_header = 0; CONNECTOR connector; FILE* data_file; STimeout timeout; THTTP_Flags flags; /* Log and data-log streams */ CORE_SetLOGFormatFlags(fLOG_None | fLOG_Level | fLOG_OmitNoteLevel | fLOG_DateTime); CORE_SetLOGFILE(stderr, 0/*false*/); data_file = fopen("test_ncbi_http_connector.log", "ab"); assert(data_file); /* Tune to the test URL using hard-coded pseudo-registry */ CORE_SetREG( REG_Create(0, s_REG_Get, 0, 0, 0) ); /* Connection timeout */ timeout.sec = 5; timeout.usec = 123456; if (argc > 1) { /* Generate user header and check graceful failure with * bad request status if the header ends up too large. */ static const char kHttpHeader[] = "My-Header: "; size_t n, header_size = (size_t) atoi(argv[1]); user_header = (char*) malloc(sizeof(kHttpHeader) + header_size); if (user_header) { header_size += sizeof(kHttpHeader)-1; memcpy(user_header, kHttpHeader, sizeof(kHttpHeader)-1); for (n = sizeof(kHttpHeader)-1; n < header_size; n++) user_header[n] = '.'; user_header[n] = '\0'; } } /* Run the tests */ flags = fHTTP_KeepHeader | (fHCC_UrlCodec|fHCC_UrlEncodeArgs)/*obsolete*/; connector = HTTP_CreateConnector(0, user_header, flags); CONN_TestConnector(connector, &timeout, data_file, fTC_SingleBouncePrint); flags = 0; connector = HTTP_CreateConnector(0, user_header, flags); CONN_TestConnector(connector, &timeout, data_file, fTC_SingleBounceCheck); flags = fHTTP_AutoReconnect; connector = HTTP_CreateConnector(0, user_header, flags); CONN_TestConnector(connector, &timeout, data_file, fTC_Everything); flags = fHTTP_AutoReconnect | fHCC_UrlCodec/*obsolete*/; connector = HTTP_CreateConnector(0, user_header, flags); CONN_TestConnector(connector, &timeout, data_file, fTC_Everything); /* Cleanup and Exit */ CORE_SetREG(0); fclose(data_file); if (user_header) free(user_header); CORE_LOG(eLOG_Note, "TEST completed successfully"); CORE_SetLOG(0); return 0; }