• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
1

socket connection not returning/reading response

Explorer ,
Feb 07, 2014 Feb 07, 2014

Copy link to clipboard

Copied

Env: Indesign CS 5.5 and Indesign CS 6; Mac OS 10.8.4

I have a strange issue with reading the response from the server that just started after a client upgraded from a previous OS to Mac OS 10.8.4. However, this particular script has worked on other 10.8.4 machines so I believe it is another issue.

Here is the code in question:

var rtnData = "";

conn = new Socket;

if (File.fs == "Windows") var isMac=0;

          else var isMac=1;

var myRequest = "GET "+vSubDir+"/get_Pathnames.asp?ismac="+isMac+" HTTP/1.0\n\n";

 

if (debug) $.writeln(myRequest);

   

if (conn.open (vHost))

{       

       

        conn.write (myRequest);       // send a HTTP request

        rtnData = conn.read(999999);  // and read the server’s reply

       

        conn.close();

}

vHost=I.P address of server

vSubDir=subdirectory to the file

So some of the tests I ran already:

conn.open(vHost) returns true.

When I go to vHost+vSubDir+"/get_Pathnames.asp?ismac="+isMac+" directly in the browser I receive the response I expect.

Essentially Indesign is connecting to the server but not reading the response that I know exists. Has anyone else experienced this issue or something similiar? I can't recreate it anywhere but the client's machine.

TOPICS
Scripting

Views

4.0K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guru ,
Feb 11, 2014 Feb 11, 2014

Copy link to clipboard

Copied

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Feb 20, 2014 Feb 20, 2014

Copy link to clipboard

Copied

edit: The client has sent me a 10.8.5 OS laptap to test with and it does not work on this Mac either.

Hey Trevor. So I downloaded thes script and tried making the socket call using the GetURL() method. Still I get no response. I decided to step through what the script was doing and it looks like it is an infinite loop because I really am getting no response. The script gets all the way down to this line:

readState.dataAvailable = readState.buffer.length > 0;

which returns false and then we go back through the loop.

So this is the request that the getURL() function is using to open the socket with where the parsedURL.path and parsedURL.address are correct and are the same as being using in the browser to connect:

        "GET /" + parsedURL.path + " HTTP/1.0\n" +

        "Host: " + parsedURL.address + "\n" +

        "User-Agent: InDesign ExtendScript\n" +

        "Accept: text/xml,text/*,*/*\n" +

        "Accept-Encoding:\n" +

        "Connection: keep-alive\n" +

        "Accept-Language: *\n" +

        "Accept-Charset: utf-8\n\n";

Not sure if it helpful but the response headers are as follows:

  1. HTTP/1.1 200 OK Cache-Control: private
  2. Content-Type: text/html
  3. Content-Encoding: gzip
  4. Vary: Accept-Encoding
  5. Server: Microsoft-IIS/8.5 Date: Thu, 20 Feb 2014 18:09:14 GMT
  6. Content-Length: 216

I get the headers by browsing to the URL in the browser. Can anyone think of any other avenues to look at?

EDIT #2 POST request also do not return any data. After executing the following code the reply is blank.

  

if (conn.open(vHost))

{

       

    conn.write("POST " +vSubDir+"/get_pathnames.asp HTTP/1.1\r\n");

    conn.write("Host: " + vHost + "\r\n");

    conn.write("Content-Length: " + data_string.length + "\r\n");

    conn.write("Content-Type: application/x-www-form-urlencoded\r\n");

    conn.write("\r\n");

   

    conn.write(data_string);

    var reply = "";

    reply = conn.read(999999);

    conn.close();

   

    if (debug) $.writeln("\n----------- return from pathnames -------------\n");

    if (debug) $.writeln(reply);

    if (debug) $.writeln("\n----------- return from pathnames END -------------\n");

}


Message was edited by: bduff323

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guru ,
Feb 20, 2014 Feb 20, 2014

Copy link to clipboard

Copied

Hi bduff323

Sorry I can't help you.

All I can say is that I had a lot of problem without the script to get info from the web to indesign but with the script I have had no problems at all of sending or receiving data to a remote server on the web on both Windows and Mac.

Maybe send Kris an invite (PM or email) to the tread to see if he can help you out.

Trevor

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guru ,
Feb 20, 2014 Feb 20, 2014

Copy link to clipboard

Copied

By the way this is a real good one!!

instead of if (debug) $.writeln(....

just do this

DEBUG = true; // global

function wl (s) {if (DEBUG) $.writeln(s)}

the instead of typing if (debug) $.writeln(....) you just type wl(...)

A lot easier on the fingers!

possibly my most useful function

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Feb 21, 2014 Feb 21, 2014

Copy link to clipboard

Copied

haha that seems like a great idea. It's not as bad as it looks on my end because I created a snippet in sublime to only have to type "con" (came from console, I'm more of a web developer) and then if ($debug) $.writeln("...") came out. But I like your solution much better and will make the change.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Feb 21, 2014 Feb 21, 2014

Copy link to clipboard

Copied

Another sanity check update:

Its not just my socket calls that are not working. In the getURL.zip that you linked me to there was also a sample document. When I execute the script on that document none of the images get filled in so it isn't just my custom script causing this issue. It makes me wonder why more people wouldn't be experiencing this issue. I sent kris a private message but it looks like he has like 3 accounts in these forums under rorohiko. If all else fails maybe I'll tweet him a PM. Thanks for your help!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Feb 21, 2014 Feb 21, 2014

Copy link to clipboard

Copied

Hi BDuff,

Haven't seen any messages. My e-mail is kris at rorohiko.com.

The first thing to try is to check whether anything is being transmitted. Try using Wireshark to see whether anything goes out, and whether anything comes back.

Also turn off any firewalls and things like Little Snitch etc... - they can complicate diagnosing things.

Cheers,

Kris

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Feb 24, 2014 Feb 24, 2014

Copy link to clipboard

Copied

Hi Kris, thanks for jumping in the discussion.

I took your advice and downloaded wireshark. I've only used it once before back in college so I'm not terribly familiar with it. What I did was just use the default capture options and start capturing. I then ran a script for a test socket call. I was expecting to see a http protocol packet from my IP to the server IP, however I did not. Any suggestions? The firewall is turned off.

To anyone else who views this thread that is running 10.8.5, if you can download and run the script on the sample document in http://www.rorohiko.com/podcast/geturl.zip and see if the images get filled in that would at least narrow it down to something specific to my machine/network.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Feb 24, 2014 Feb 24, 2014

Copy link to clipboard

Copied

Hi BDuff,

I don't have an installed 10.8.x any more - I have a few 10.6, and the rest is 10.9 - so I cannot try that out. I gave 10.9 + InDesign CC a quick test, and that all seems to work fine.

But it sounds odd - my hunch is that there is a problem with your setup. Things I'd try:

* If the user is not an admin user, try again as an admin user

* Go and check the various logs on the machine - there might be interesting tidbits there. /var/log/system.log for example

* Create a brand new admin user account, log in as that user, and try again. If that works, reset your ID prefs.

* Run Disk Utility on startup (if I remember correctly, hold Command-R on startup) and verify/repair disk and permissions

* Make sure there is no confusion with multiple network adapters (e.g. Wifi vs. wired ethernet). With Wireshark it's easy to pick the wrong adapter and see nothing useful. Turn off any network adapters not relevant to the exercise via the System Preferences

Cheers,

Kris

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Feb 25, 2014 Feb 25, 2014

Copy link to clipboard

Copied

I am getting the same results as you are with my machines. I just can't seem to figure this one out!

*I operating under an admin user

*I checked the logs and didn't find anything too useful

*Created a new admin user and tried that but got the same results as previous admin user

*Ran the disk utility and verified the disk permissions and there were only some language files and itunes files that had mismatched permissions

*When using wireshark I was able to start the capture, visit google or yahoo and see the http request sent. And then during the same capture I ran the indesign script I did not see any packets being sent.

I also tried httpScoop with no luck either. I'm tapped out of ideas. Can you think of any other direction?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Feb 25, 2014 Feb 25, 2014

Copy link to clipboard

Copied

On the slight off-chance: the one thing I forgot to ask: " 'ave you tried turning if off and on again? " - i.e. did you happen to try rebooting the machine? Nowadays, machines have such stable OS that I sometimes overlook doing a good reboot.

There's also all these magical 'moves': PRAM reset, power manager reset etc... You can try them for good measure, but I doubt they'll help.

It sounds like one of those where diagnosing it would be fun, given unlimited time and money.

But barring that, I'd personally haul out the big hammer - deactivate/uninstall/Adobe's CC Cleaner tool/reinstall/reactivate. And if that does not help, the even bigger hammer (OS reinstall).

Given that the issue started after an upgrade to the OS, I fear you might be in for the use of the even bigger hammer.

Not very elegant, but at some point, fixing the problem becomes more important than an accurate diagnosis 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Mar 12, 2014 Mar 12, 2014

Copy link to clipboard

Copied

I'm happy to say that I have fixed the issue! I had to get permission from the client but after uninstalling and reinstalling Indesign everything worked just as peachy as before! So I'm not sure exactly what caused the issue in the first place but I am sure relieved that it has been resolved. Thanks for all your help guys! I atleast learned a lot along the way.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guru ,
Mar 12, 2014 Mar 12, 2014

Copy link to clipboard

Copied

Glad to hear you got it sorted out. Seem's that it took you quite a while to pluck up the courage and take Kris's advice .

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Sep 27, 2014 Sep 27, 2014

Copy link to clipboard

Copied

Note 1 :

I have tried your example and it does work if I used URLs that starts with "http".

In your INDD file example, the rectangle labels have "http://" prefix but when accessed using the Socket object it goes to a 302 Found which leads to a URL that has a "https://" prefix.  This has cause the sample to break.

I had to use some other "http://" link (that does not redirect to a "https") to get it working.

But I wonder is there a way to connect to "https" links using sockets?

Side Note :

I have tried Extendables: a stalwart little framework for Adobe ExtendScript but the httpRequest object does not seem to work (I keep getting 404.  Checked the link with the browser and the link loads with 200 OK).  Which lead me to this thread.

Thanks a lot Kris for well thought sample

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Oct 28, 2014 Oct 28, 2014

Copy link to clipboard

Copied

Hi Wanyuee,

No, https is not part of the picture: I don't think it's feasible to write up https support on top of the Socket: I haven't tried, but I am pretty sure ExtendScript is a bit too slow for that.

Sorry about that!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guru ,
Oct 28, 2014 Oct 28, 2014

Copy link to clipboard

Copied

Hi Kris,

I don't have the script in front of me but I remember thinking when a looked at it that you could speed things up by changing the result method from

result += newBytes

to

result[n++] = newBytes

// ..... End of loop

result = result.join("");

The variable names are made up and not the ones you used but I think you get the idea.

As the bytes are being read on a byte by byte basis I think the change could drastically speed things up.

I have not tested this as I use the script for transferring very  small bits of info to and from the sever but I would be very surprised if the difference is not significant for transferring large quantities of data like images or InDesign Files.

Just thinking out loud very much off the cuff... perhaps one could read all or most of the data at one time and process the result rather than fetching the data so many times from the server byte by byte.

I'm probably way off on that one as I don't have the script in front of me and you have way more experience with this stuff than me, but it's a point to ponder.

Regards

Trevor

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Oct 28, 2014 Oct 28, 2014

Copy link to clipboard

Copied

Hi Trevor,

You're absolutely right. I checked the code, and it is not yet using the join() trick - it was all written before I cottoned on to that trick, and it would nearly certainly make a big difference on larger data transfers. However, it won't solve https - the hard part is writing the decryption. I don't think it is impossible, but I expect it to be slow - a lot of low-level bit manipulations going on, which is not exactly JavaScript's forte.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Oct 28, 2014 Oct 28, 2014

Copy link to clipboard

Copied

LATEST

P.S. For our own use, I've taken a different tack: I've extended our APID ToolAssistant plugin to include a full http/https stack, so I can call from ExtendScript into APID ToolAssistant and that handles the HTTPS magic. All through the magic of C++ libraries like boost and urdl. I've not exposed that information as it's more of an in-house hack, but if there is interest, I can write up a bit of documentation on it. It's not a full-fledged solution, just a very basic 'fetchURL' which supports both http and https. Call it, get data back in synchronous fashion. Not very neat or tidy, but does the trick for what I needed.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines