xref: /aosp_15_r20/external/google-breakpad/src/common/mac/minidump_upload.m (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle// Copyright 2006 Google LLC
2*9712c20fSFrederick Mayle//
3*9712c20fSFrederick Mayle// Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle// modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle// met:
6*9712c20fSFrederick Mayle//
7*9712c20fSFrederick Mayle//     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle// notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle//     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle// copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle// in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle// distribution.
13*9712c20fSFrederick Mayle//     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle// contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle// this software without specific prior written permission.
16*9712c20fSFrederick Mayle//
17*9712c20fSFrederick Mayle// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle
29*9712c20fSFrederick Mayle// minidump_upload.m: Upload a minidump to a HTTP server.  The upload is sent as
30*9712c20fSFrederick Mayle// a multipart/form-data POST request with the following parameters:
31*9712c20fSFrederick Mayle//  prod: the product name
32*9712c20fSFrederick Mayle//  ver: the product version
33*9712c20fSFrederick Mayle//  symbol_file: the breakpad format symbol file
34*9712c20fSFrederick Mayle
35*9712c20fSFrederick Mayle#import <unistd.h>
36*9712c20fSFrederick Mayle
37*9712c20fSFrederick Mayle#import <Foundation/Foundation.h>
38*9712c20fSFrederick Mayle
39*9712c20fSFrederick Mayle#import "common/mac/HTTPMultipartUpload.h"
40*9712c20fSFrederick Mayle
41*9712c20fSFrederick Mayletypedef struct {
42*9712c20fSFrederick Mayle  NSString* minidumpPath;
43*9712c20fSFrederick Mayle  NSString* uploadURLStr;
44*9712c20fSFrederick Mayle  NSString* product;
45*9712c20fSFrederick Mayle  NSString* version;
46*9712c20fSFrederick Mayle  BOOL success;
47*9712c20fSFrederick Mayle} Options;
48*9712c20fSFrederick Mayle
49*9712c20fSFrederick Mayle//=============================================================================
50*9712c20fSFrederick Maylestatic void Start(Options* options) {
51*9712c20fSFrederick Mayle  NSURL* url = [NSURL URLWithString:options->uploadURLStr];
52*9712c20fSFrederick Mayle  HTTPMultipartUpload* ul = [[HTTPMultipartUpload alloc] initWithURL:url];
53*9712c20fSFrederick Mayle  NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
54*9712c20fSFrederick Mayle
55*9712c20fSFrederick Mayle  // Add parameters
56*9712c20fSFrederick Mayle  [parameters setObject:options->product forKey:@"prod"];
57*9712c20fSFrederick Mayle  [parameters setObject:options->version forKey:@"ver"];
58*9712c20fSFrederick Mayle  [ul setParameters:parameters];
59*9712c20fSFrederick Mayle
60*9712c20fSFrederick Mayle  // Add file
61*9712c20fSFrederick Mayle  [ul addFileAtPath:options->minidumpPath name:@"upload_file_minidump"];
62*9712c20fSFrederick Mayle
63*9712c20fSFrederick Mayle  // Send it
64*9712c20fSFrederick Mayle  NSError* error = nil;
65*9712c20fSFrederick Mayle  NSData* data = [ul send:&error];
66*9712c20fSFrederick Mayle  NSString* result = [[NSString alloc] initWithData:data
67*9712c20fSFrederick Mayle                                           encoding:NSUTF8StringEncoding];
68*9712c20fSFrederick Mayle
69*9712c20fSFrederick Mayle  NSLog(@"Send: %@", error ? [error description] : @"No Error");
70*9712c20fSFrederick Mayle  NSLog(@"Response: %ld", (long)[[ul response] statusCode]);
71*9712c20fSFrederick Mayle  NSLog(@"Result: %lu bytes\n%@", (unsigned long)[data length], result);
72*9712c20fSFrederick Mayle
73*9712c20fSFrederick Mayle  [result release];
74*9712c20fSFrederick Mayle  [ul release];
75*9712c20fSFrederick Mayle  options->success = !error;
76*9712c20fSFrederick Mayle}
77*9712c20fSFrederick Mayle
78*9712c20fSFrederick Mayle//=============================================================================
79*9712c20fSFrederick Maylestatic void Usage(int argc, const char* argv[]) {
80*9712c20fSFrederick Mayle  fprintf(stderr, "Submit minidump information.\n");
81*9712c20fSFrederick Mayle  fprintf(stderr,
82*9712c20fSFrederick Mayle          "Usage: %s -p <product> -v <version> <minidump> "
83*9712c20fSFrederick Mayle          "<upload-URL>\n",
84*9712c20fSFrederick Mayle          argv[0]);
85*9712c20fSFrederick Mayle  fprintf(stderr, "<minidump> should be a minidump.\n");
86*9712c20fSFrederick Mayle  fprintf(stderr, "<upload-URL> is the destination for the upload\n");
87*9712c20fSFrederick Mayle
88*9712c20fSFrederick Mayle  fprintf(stderr, "\t-h: Usage\n");
89*9712c20fSFrederick Mayle  fprintf(stderr, "\t-?: Usage\n");
90*9712c20fSFrederick Mayle}
91*9712c20fSFrederick Mayle
92*9712c20fSFrederick Mayle//=============================================================================
93*9712c20fSFrederick Maylestatic void SetupOptions(int argc, const char* argv[], Options* options) {
94*9712c20fSFrederick Mayle  extern int optind;
95*9712c20fSFrederick Mayle  char ch;
96*9712c20fSFrederick Mayle
97*9712c20fSFrederick Mayle  while ((ch = getopt(argc, (char* const*)argv, "p:v:h?")) != -1) {
98*9712c20fSFrederick Mayle    switch (ch) {
99*9712c20fSFrederick Mayle      case 'p':
100*9712c20fSFrederick Mayle        options->product = [NSString stringWithUTF8String:optarg];
101*9712c20fSFrederick Mayle        break;
102*9712c20fSFrederick Mayle      case 'v':
103*9712c20fSFrederick Mayle        options->version = [NSString stringWithUTF8String:optarg];
104*9712c20fSFrederick Mayle        break;
105*9712c20fSFrederick Mayle
106*9712c20fSFrederick Mayle      default:
107*9712c20fSFrederick Mayle        Usage(argc, argv);
108*9712c20fSFrederick Mayle        exit(0);
109*9712c20fSFrederick Mayle        break;
110*9712c20fSFrederick Mayle    }
111*9712c20fSFrederick Mayle  }
112*9712c20fSFrederick Mayle
113*9712c20fSFrederick Mayle  if ((argc - optind) != 2) {
114*9712c20fSFrederick Mayle    fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]);
115*9712c20fSFrederick Mayle    Usage(argc, argv);
116*9712c20fSFrederick Mayle    exit(1);
117*9712c20fSFrederick Mayle  }
118*9712c20fSFrederick Mayle
119*9712c20fSFrederick Mayle  options->minidumpPath = [NSString stringWithUTF8String:argv[optind]];
120*9712c20fSFrederick Mayle  options->uploadURLStr = [NSString stringWithUTF8String:argv[optind + 1]];
121*9712c20fSFrederick Mayle}
122*9712c20fSFrederick Mayle
123*9712c20fSFrederick Mayle//=============================================================================
124*9712c20fSFrederick Mayleint main(int argc, const char* argv[]) {
125*9712c20fSFrederick Mayle  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
126*9712c20fSFrederick Mayle  Options options;
127*9712c20fSFrederick Mayle
128*9712c20fSFrederick Mayle  bzero(&options, sizeof(Options));
129*9712c20fSFrederick Mayle  SetupOptions(argc, argv, &options);
130*9712c20fSFrederick Mayle  Start(&options);
131*9712c20fSFrederick Mayle
132*9712c20fSFrederick Mayle  [pool release];
133*9712c20fSFrederick Mayle  return options.success ? 0 : 1;
134*9712c20fSFrederick Mayle}
135