VirtualBox

source: vbox/trunk/src/VBox/Runtime/tools/RTHttp.cpp@ 65892

Last change on this file since 65892 was 62477, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.5 KB
Line 
1/* $Id: RTHttp.cpp 62477 2016-07-22 18:27:37Z vboxsync $ */
2/** @file
3 * IPRT - Utility for retriving URLs.
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*******************************************************************************
29* Header Files *
30*******************************************************************************/
31#include <iprt/http.h>
32
33#include <iprt/assert.h>
34#include <iprt/err.h>
35#include <iprt/getopt.h>
36#include <iprt/initterm.h>
37#include <iprt/message.h>
38#include <iprt/path.h>
39#include <iprt/stream.h>
40#include <iprt/string.h>
41#include <iprt/vfs.h>
42
43
44
45int main(int argc, char **argv)
46{
47 int rc = RTR3InitExe(argc, &argv, 0);
48 if (RT_FAILURE(rc))
49 return RTMsgInitFailure(rc);
50
51 /*
52 * Create a HTTP client instance.
53 */
54 RTHTTP hHttp;
55 rc = RTHttpCreate(&hHttp);
56 if (RT_FAILURE(rc))
57 return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTHttpCreate failed: %Rrc", rc);
58
59 /*
60 * Parse arguments.
61 */
62 static const RTGETOPTDEF s_aOptions[] =
63 {
64 { "--output", 'o', RTGETOPT_REQ_STRING },
65 { "--quiet", 'q', RTGETOPT_REQ_NOTHING },
66 { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
67 };
68
69 RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
70 const char *pszOutput = NULL;
71 unsigned uVerbosityLevel = 1;
72
73 RTGETOPTUNION ValueUnion;
74 RTGETOPTSTATE GetState;
75 RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
76 while ((rc = RTGetOpt(&GetState, &ValueUnion)))
77 {
78 switch (rc)
79 {
80 case 'o':
81 pszOutput = ValueUnion.psz;
82 break;
83
84 case 'q':
85 uVerbosityLevel--;
86 break;
87 case 'v':
88 uVerbosityLevel++;
89 break;
90
91 case 'h':
92 RTPrintf("Usage: %s [options] URL0 [URL1 [...]]\n"
93 "\n"
94 "Options:\n"
95 " -o,--output=file\n"
96 " Output file. If not given, the file is displayed on stdout.\n"
97 " -q, --quiet\n"
98 " -v, --verbose\n"
99 " Controls the verbosity level.\n"
100 " -h, -?, --help\n"
101 " Display this help text and exit successfully.\n"
102 " -V, --version\n"
103 " Display the revision and exit successfully.\n"
104 , RTPathFilename(argv[0]));
105 return RTEXITCODE_SUCCESS;
106
107 case 'V':
108 RTPrintf("$Revision: 62477 $\n");
109 return RTEXITCODE_SUCCESS;
110
111 case VINF_GETOPT_NOT_OPTION:
112 {
113 int rcHttp;
114 if (pszOutput && strcmp("-", pszOutput))
115 {
116 if (uVerbosityLevel > 0)
117 RTStrmPrintf(g_pStdErr, "Fetching '%s' into '%s'...\n", ValueUnion.psz, pszOutput);
118 rcHttp = RTHttpGetFile(hHttp, ValueUnion.psz, pszOutput);
119 }
120 else
121 {
122 if (uVerbosityLevel > 0)
123 RTStrmPrintf(g_pStdErr, "Fetching '%s'...\n", ValueUnion.psz);
124
125 void *pvResp;
126 size_t cbResp;
127 rcHttp = RTHttpGetBinary(hHttp, ValueUnion.psz, &pvResp, &cbResp);
128 if (RT_SUCCESS(rcHttp))
129 {
130 RTVFSIOSTREAM hVfsIos;
131 rc = RTVfsIoStrmFromStdHandle(RTHANDLESTD_OUTPUT, 0, true /*fLeaveOpen*/, &hVfsIos);
132 if (RT_SUCCESS(rc))
133 {
134 rc = RTVfsIoStrmWrite(hVfsIos, pvResp, cbResp, true /*fBlocking*/, NULL);
135 if (RT_FAILURE(rc))
136 rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error writing to stdout: %Rrc", rc);
137 RTVfsIoStrmRelease(hVfsIos);
138 }
139 else
140 rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening stdout: %Rrc", rc);
141 RTHttpFreeResponse(pvResp);
142 }
143 }
144 if (RT_FAILURE(rcHttp))
145 rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error %Rrc getting '%s'", rcHttp, ValueUnion.psz);
146 break;
147 }
148
149 default:
150 return RTGetOptPrintError(rc, &ValueUnion);
151 }
152 }
153
154 return rcExit;
155}
156
157
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette