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