HTML truncated because of NULL character - html

I am downloading HTML from a server (one that I cannot control), and sometimes the response will include a NULL character in the middle somewhere. Because of this, the response is being truncated at that point. How do I remove that NULL character and prevent it from being truncated? Here's the code I'm using:
ASIHTTPRequest *_request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:#"%#%#", [DEFAULTS objectForKey:#"gradespeed_url"], #"ParentStudentGrades.aspx"]]];
__weak ASIHTTPRequest *request = _request;
[request setAllowCompressedResponse:NO];
[request setValidatesSecureCertificate:NO];
[request setCompletionBlock:^{
NSData *response_data = [request responseData];
NSString *response_string = [request responseString];
}];
The NSString is truncated, but maybe it's possible to manipulate the NSData? Please advise.

Don't rely on [request responseString] do your own conversion from [request responseData] handling the null as appropriate.
Or examine the ASIHTTP code to find out exactly what is happening.

The solution I discovered was actually quite simple. I just needed to add the following code to remove the random NULL characters:
response_string = [response_string stringByReplacingOccurrencesOfString:#"\0" withString:#""];

Related

How to pass an HTML string in a Query String in IOS

I have a simple IOS application that I created for consultants where I work. It has a custom keyboard with notation that they use that includes superscript and subscript characters. The easiest way that I found to handle those characters was using HTML and a WebView, which works just fine.
I am now attempting to send this information to a web application that will insert it into a SQL database. Sending all of the other information works just fine, until I get to the transcript with HTML in it. I am encoding each of the values that I send through the query string with stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding but the query string fails when HTML elements are included. I believe this is due to the / that is not removed during the escape encoding. For example the HTML break tag becomes %3Cbr%20/%3E. So the < > and space are replaced, but not the /.
Should I be using a different method? Is there an easy way to send HTML over Query String? Am I correct that the / character is what is breaking my query string?
Here is the code I have now:
NSString *datePE =[dateString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *studentPE =[student stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *teacherPE =[teacher stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *transcriberPE =[transcriber stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *vrPE =[vrTextField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *totalTimePE =[totalTimeString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *transcriptPE =[transcriptString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
parameters = [NSString stringWithFormat:#"dateQS=%#&studentQS=%#&teacherQS=%#&transcriberQS=%#&vrQS=%#&totalTimeQS=%#&transcriptQS=%#",datePE ,studentPE,teacherPE,transcriberPE,vrPE,totalTimePE, transcriptPE];
request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:#"http://server.domain.net/folder/subfolder/Default.aspx?"]];
[request setHTTPMethod:#"POST"];
[request setHTTPBody:[parameters dataUsingEncoding:NSUTF8StringEncoding]];
connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];

XCode GET POST WebServer

I'm beginner from Xcode. I have to do an application that get and send data from embedded webserver that I designed in a microcontroller MICROCHIP.
Now I'm able to get information from webserver ( In my webserver I have a /status.xml file where I have all the dynamic variables)
Now I am not able to click a button. The HTML code to click a button is
onmousedown="newAJAXCommand('buttons.cgi?btn=1')"
In my webserver I have a file buttons.cgi.
My target is designed a button in Xcode that he does this action
I tried to use NSMutableURLRequest class and SetHTTPMethod:#"GET" or #"POST" but this code doesn't work
NSString *post = #"btn=1";
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
NSString *Get_lenght = [NSString stringWithFormat:#"%d",[postData length]];
NSURL *serviceURL = [NSURL URLWithString:#"http://mywebserver.com/buttons.cgi?"];
NSMutableURLRequest *serviceRequest = [NSMutableURLRequest requestWithURL:serviceURL];
[serviceRequest setValue:Get_lenght forHTTPHeaderField:#"Content-type"];
[serviceRequest setHTTPMethod:#"POST"];
[serviceRequest setHTTPBody:postData];
There are multiple errors in the codes:
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
Why don't you use UTF-8 ?
NSString *Get_lenght = [NSString stringWithFormat:#"%d",[postData length]];
[serviceRequest setValue:Get_lenght forHTTPHeaderField:#"Content-type"];
You can't set Content-Type as an integer.
Last, you didn't send out the NSMutableURLRequest. To send out the request, use :
NSString *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&response error:&error];
where response will contain the response data, if you need it; and the error will contain error during request & response, if there is any error.

App is STILL not updating database when string contains spaces

Slowly but surely I think I'm going mad. After getting the solution to my problem and the app now also accepting spaces, it still won't add the data that contains spaces to my mysql database. Here is the code:
NSString *strURL = [NSString stringWithFormat:#"http://www.bbc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
NSString *webStringURl = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);
NSLog(#"%#", webStringURl);
NSLog even tells me that it does exactly what I tell him to:
ProjectX[4003:15203] http://www.bbc.com/phpFile.php?number=11166&name=Yong%20Wang%20Ding&lastname=Blamblam
It works everytime when the variables do not contain spaces. When I open the php file in my browser and enter the variables by hand (with spaces) it adds them to my database. I have no clue why it refuses to work when doing exactly(?) the same thing with my app.
It doesn't look like you're using webStringURl (sic) anywhere other than in the final NSLog statement. Are you sure you didn't mean to write:
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:webStringURl];
...for the third line?
At the moment, you're calling dataWithContentsOfURL on your unescaped version of the URL (which may still contain spaces).

App is not updating database when string contains spaces

I ran into a weird problem. I built a mysql database where the user can store his contacts through an app. He just adds his contact information by clicking on a button. Then, the data is added to the database.
However, when the contact's information has spaces between his first name, last name or number the app refuses to accept the data. I dont get an error message or anything like that, but I also dont get any confirmation. The record does not exist in the database.
There is no problem with my php file (The file is definitely correct, I got it checked here, twice).
Here is my code:
NSString *strURL = [NSString stringWithFormat:#"http://www.abc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);
The space character is not allowed in a URI. Use %20 to encode the space. There are other characters that are also not allowed as part of the URI. Look up URI encoding.
NSString *strURL = [NSString stringWithFormat:#"http://www.abc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);

ASIFormDataRequest JSON encoding issues

I seem to have run into a rather trivia issue that I can't figure out. I am using ASIFormDataRequest for interacting with my Ruby on Rails app. I have a REST API that accepts a User object. I am using JSONKit to get the JSONString from a NSDictionary.
However, when I do a
[request setPostValue:[userObj JSONString] forKey:#"user"];
The request on the server side ends up escaping the quotes. Basically,
{"password":"hello","name":"user","email":"user#foo.com"}
TO
"{\"password\":\"hello\",\"name\":\"user\",\"email\":\"user#foo.com\"}"
This ends up confusing rails and it complains of an invalid object. Can I force ASIFormDataRequest to not escape the quotes? I understand this might be an issue with the JSONString itself but I can't figure out a good solution here.
Thanks
This is what worked for me:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
NSDictionary* inner = [[NSDictionary alloc] initWithObjectsAndKeys:username, #"login",password, #"password", nil];
NSDictionary* user = [[NSDictionary alloc] initWithObjectsAndKeys:inner, #"user", nil];
NSMutableData *requestBody = [[NSMutableData alloc] initWithData:[[user JSONString] dataUsingEncoding:NSUTF8StringEncoding]];
[request addRequestHeader:#"Content-Type" value:#"application/json; encoding=utf-8"];
[request addRequestHeader:#"Accept" value:#"application/json"];
[request setRequestMethod:#"POST"];
[request setPostBody:requestBody];
[request startAsynchronous];
It's not usual to mix ASIFormDataRequest and JSON - normally people encode things in the HTML form data format or they encode in JSON format. Not both!
Could you consider using pure JSON in this case? It might well make your life easier. Basically you would use an ASIHTTPRequest instead of an ASIFormDataRequest, and set it up like this:
NSString *postData = [userObj JSONString];
[request addRequestHeader: #"Content-Type" value: #"application/json; charset=utf-8"];
[request appendPostData:[postData dataUsingEncoding:NSUTF8StringEncoding]];
Aside from that, it's not really clear why it's going wrong - can you use something like wireshark to capture the raw text of the http request you're sending and add that to your question?
How are you extracting the JSON data from the form data on the Ruby side?