This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 018e4f445fe SOLR-17494: Remove language specific writer types (#2758)
018e4f445fe is described below

commit 018e4f445fe558d4383ea5bc9f84400da74f9517
Author: Eric Pugh <[email protected]>
AuthorDate: Mon Oct 21 16:16:26 2024 -0400

    SOLR-17494: Remove language specific writer types (#2758)
    
    wt=python, ruby, php, and phps response writers are removed.
---
 dev-tools/scripts/smokeTestRelease.py              |   2 -
 solr/CHANGES.txt                                   |   2 +
 .../solr/bench/search/QueryResponseWriters.java    |  12 +-
 .../src/java/org/apache/solr/core/SolrCore.java    |   8 -
 .../apache/solr/response/PHPResponseWriter.java    | 124 ---------
 .../solr/response/PHPSerializedResponseWriter.java | 282 ---------------------
 .../apache/solr/response/PythonResponseWriter.java | 158 ------------
 .../apache/solr/response/RubyResponseWriter.java   |  92 -------
 .../org/apache/solr/response/JSONWriterTest.java   |  18 +-
 .../response/TestPHPSerializedResponseWriter.java  |  97 -------
 solr/example/exampledocs/test_utf8.sh              |  93 -------
 .../solr/configsets/_default/conf/solrconfig.xml   |   4 -
 .../conf/solrconfig.xml                            |   4 -
 .../modules/deployment-guide/pages/python.adoc     |  42 +--
 .../modules/deployment-guide/pages/ruby.adoc       | 115 +++------
 .../pages/tutorial-techproducts.adoc               |   1 -
 .../indexing-guide/pages/indexing-with-tika.adoc   |   2 +-
 .../query-guide/pages/response-writers.adoc        |  66 +----
 .../pages/major-changes-in-solr-10.adoc            |   3 +
 19 files changed, 46 insertions(+), 1079 deletions(-)

diff --git a/dev-tools/scripts/smokeTestRelease.py 
b/dev-tools/scripts/smokeTestRelease.py
index 97ca684ff56..acfa109f2fc 100755
--- a/dev-tools/scripts/smokeTestRelease.py
+++ b/dev-tools/scripts/smokeTestRelease.py
@@ -774,8 +774,6 @@ def testSolrExample(binaryDistPath, javaPath):
       raise RuntimeError('Failed to run the techproducts example, check log 
for previous errors.')
 
     os.chdir('example')
-    print('      test utf8...')
-    run('sh ./exampledocs/test_utf8.sh 
http://localhost:8983/solr/techproducts', 'utf8.log')
     print('      run query...')
     s = load('http://localhost:8983/solr/techproducts/select/?q=video')
     if s.find('"numFound":3,') == -1:
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 1b60d044ad0..1eff932d698 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -73,6 +73,8 @@ Deprecation Removals
 
 * SOLR-17400: Remove deprecated script snapshotcli.sh.  bin/solr snapshot-* 
commands have replaced this. (Eric Pugh)
 
+* SOLR-17494: Remove language specific writer types (i.e wt= ruby, python, 
php, and phps). (Eric Pugh)
+
 Dependency Upgrades
 ---------------------
 (No changes)
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
 
b/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
index 15b4526d49e..3c3217cc085 100644
--- 
a/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
+++ 
b/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
@@ -59,17 +59,7 @@ public class QueryResponseWriters {
   public static class BenchState {
 
     /** See {@link SolrCore#DEFAULT_RESPONSE_WRITERS} */
-    @Param({
-      CommonParams.JAVABIN,
-      CommonParams.JSON,
-      "cbor",
-      "smile",
-      "xml",
-      "python",
-      "phps",
-      "ruby",
-      "raw"
-    })
+    @Param({CommonParams.JAVABIN, CommonParams.JSON, "cbor", "smile", "xml", 
"raw"})
     String wt;
 
     private int docs = 100;
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java 
b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index da78f08fdc4..f56cb846767 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -128,13 +128,9 @@ import org.apache.solr.response.CborResponseWriter;
 import org.apache.solr.response.GeoJSONResponseWriter;
 import org.apache.solr.response.GraphMLResponseWriter;
 import org.apache.solr.response.JacksonJsonWriter;
-import org.apache.solr.response.PHPResponseWriter;
-import org.apache.solr.response.PHPSerializedResponseWriter;
 import org.apache.solr.response.PrometheusResponseWriter;
-import org.apache.solr.response.PythonResponseWriter;
 import org.apache.solr.response.QueryResponseWriter;
 import org.apache.solr.response.RawResponseWriter;
-import org.apache.solr.response.RubyResponseWriter;
 import org.apache.solr.response.SchemaXmlResponseWriter;
 import org.apache.solr.response.SmileResponseWriter;
 import org.apache.solr.response.SolrQueryResponse;
@@ -3015,10 +3011,6 @@ public class SolrCore implements SolrInfoBean, Closeable 
{
     m.put("standard", m.get(CommonParams.JSON));
     m.put("geojson", new GeoJSONResponseWriter());
     m.put("graphml", new GraphMLResponseWriter());
-    m.put("python", new PythonResponseWriter());
-    m.put("php", new PHPResponseWriter());
-    m.put("phps", new PHPSerializedResponseWriter());
-    m.put("ruby", new RubyResponseWriter());
     m.put("raw", new RawResponseWriter());
     m.put(CommonParams.JAVABIN, new BinaryResponseWriter());
     m.put("cbor", new CborResponseWriter());
diff --git a/solr/core/src/java/org/apache/solr/response/PHPResponseWriter.java 
b/solr/core/src/java/org/apache/solr/response/PHPResponseWriter.java
deleted file mode 100644
index b9f4c3417fd..00000000000
--- a/solr/core/src/java/org/apache/solr/response/PHPResponseWriter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.response;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.List;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.request.SolrQueryRequest;
-
-public class PHPResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_PHP_UTF8 = "text/x-php;charset=UTF-8";
-
-  private String contentType = CONTENT_TYPE_PHP_UTF8;
-
-  @Override
-  public void init(NamedList<?> namedList) {
-    String contentType = (String) namedList.get("content-type");
-    if (contentType != null) {
-      this.contentType = contentType;
-    }
-  }
-
-  @Override
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse 
rsp) throws IOException {
-    PHPWriter w = new PHPWriter(writer, req, rsp);
-    try {
-      w.writeResponse();
-    } finally {
-      w.close();
-    }
-  }
-
-  @Override
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse 
response) {
-    return contentType;
-  }
-}
-
-class PHPWriter extends JSONWriter {
-  public PHPWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) 
{
-    super(writer, req, rsp);
-  }
-
-  @Override
-  public void writeNamedList(String name, NamedList<?> val) throws IOException 
{
-    writeNamedListAsMapMangled(name, val);
-  }
-
-  @Override
-  public void writeMapOpener(int size) throws IOException {
-    writer.write("array(");
-  }
-
-  @Override
-  public void writeMapCloser() throws IOException {
-    writer.write(')');
-  }
-
-  @Override
-  public void writeArrayOpener(int size) throws IOException {
-    writer.write("array(");
-  }
-
-  @Override
-  public void writeArray(String name, List<?> l, boolean raw) throws 
IOException {
-    writeArray(name, l.iterator(), raw);
-  }
-
-  @Override
-  public void writeArrayCloser() throws IOException {
-    writer.write(')');
-  }
-
-  @Override
-  public void writeNull(String name) throws IOException {
-    writer.write("null");
-  }
-
-  @Override
-  public void writeKey(String fname, boolean needsEscaping) throws IOException 
{
-    writeStr(null, fname, needsEscaping);
-    writer.write('=');
-    writer.write('>');
-  }
-
-  @Override
-  public void writeStr(String name, String val, boolean needsEscaping) throws 
IOException {
-    if (needsEscaping) {
-      writer.write('\'');
-      for (int i = 0; i < val.length(); i++) {
-        char ch = val.charAt(i);
-        switch (ch) {
-          case '\'':
-          case '\\':
-            writer.write('\\');
-            writer.write(ch);
-            break;
-          default:
-            writer.write(ch);
-        }
-      }
-      writer.write('\'');
-    } else {
-      writer.write('\'');
-      writer.write(val);
-      writer.write('\'');
-    }
-  }
-}
diff --git 
a/solr/core/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java 
b/solr/core/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java
deleted file mode 100644
index 0a6f828936f..00000000000
--- 
a/solr/core/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.response;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import org.apache.lucene.util.ArrayUtil;
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.UnicodeUtil;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.search.ReturnFields;
-
-/**
- * A description of the PHP serialization format can be found here:
- * http://www.hurring.com/scott/code/perl/serialize/
- */
-public class PHPSerializedResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_PHP_UTF8 = "text/x-php-serialized;charset=UTF-8";
-
-  private String contentType = CONTENT_TYPE_PHP_UTF8;
-
-  @Override
-  public void init(NamedList<?> namedList) {
-    String contentType = (String) namedList.get("content-type");
-    if (contentType != null) {
-      this.contentType = contentType;
-    }
-  }
-
-  @Override
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse 
rsp) throws IOException {
-    PHPSerializedWriter w = new PHPSerializedWriter(writer, req, rsp);
-    try {
-      w.writeResponse();
-    } finally {
-      w.close();
-    }
-  }
-
-  @Override
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse 
response) {
-    return contentType;
-  }
-}
-
-class PHPSerializedWriter extends JSONWriter {
-  byte[] utf8;
-
-  public PHPSerializedWriter(Writer writer, SolrQueryRequest req, 
SolrQueryResponse rsp) {
-    super(writer, req, rsp);
-    this.utf8 = BytesRef.EMPTY_BYTES;
-    // never indent serialized PHP data
-    doIndent = false;
-  }
-
-  @Override
-  public void writeResponse() throws IOException {
-    Boolean omitHeader = req.getParams().getBool(CommonParams.OMIT_HEADER);
-    if (omitHeader != null && omitHeader) rsp.removeResponseHeader();
-    writeNamedList(null, rsp.getValues());
-  }
-
-  @Override
-  public void writeNamedList(String name, NamedList<?> val) throws IOException 
{
-    writeNamedListAsMapMangled(name, val);
-  }
-
-  @Override
-  public void writeStartDocumentList(
-      String name, long start, int size, long numFound, Float maxScore, 
Boolean numFoundExact)
-      throws IOException {
-    writeMapOpener(headerSize(maxScore, numFoundExact));
-    writeKey("numFound", false);
-    writeLong(null, numFound);
-    writeKey("start", false);
-    writeLong(null, start);
-
-    if (maxScore != null) {
-      writeKey("maxScore", false);
-      writeFloat(null, maxScore);
-    }
-    if (numFoundExact != null) {
-      writeKey("numFoundExact", false);
-      writeBool(null, numFoundExact);
-    }
-    writeKey("docs", false);
-    writeArrayOpener(size);
-  }
-
-  @Override
-  public void writeEndDocumentList() throws IOException {
-    writeArrayCloser(); // doc list
-    writeMapCloser();
-  }
-
-  @Override
-  public void writeSolrDocument(String name, SolrDocument doc, ReturnFields 
returnFields, int idx)
-      throws IOException {
-    writeKey(idx, false);
-
-    LinkedHashMap<String, Object> single = new LinkedHashMap<>();
-    LinkedHashMap<String, Object> multi = new LinkedHashMap<>();
-
-    for (String fname : doc.getFieldNames()) {
-      if (returnFields != null && !returnFields.wantsField(fname)) {
-        continue;
-      }
-
-      Object val = doc.getFieldValue(fname);
-      if (val instanceof Collection) {
-        multi.put(fname, val);
-      } else {
-        single.put(fname, val);
-      }
-    }
-
-    writeMapOpener(single.size() + multi.size());
-    for (Map.Entry<String, Object> entry : single.entrySet()) {
-      String fname = entry.getKey();
-      Object val = entry.getValue();
-      writeKey(fname, true);
-      writeVal(fname, val);
-    }
-
-    for (Map.Entry<String, Object> entry : multi.entrySet()) {
-      String fname = entry.getKey();
-      writeKey(fname, true);
-
-      Object val = entry.getValue();
-      if (!(val instanceof Collection)) {
-        // should never be reached if multivalued fields are stored as a 
Collection
-        // so I'm assuming a size of 1 just to wrap the single value
-        writeArrayOpener(1);
-        writeVal(fname, val);
-        writeArrayCloser();
-      } else {
-        writeVal(fname, val);
-      }
-    }
-
-    writeMapCloser();
-  }
-
-  @Override
-  public void writeArray(String name, Object[] val, boolean raw) throws 
IOException {
-    assert !raw;
-    writeMapOpener(val.length);
-    for (int i = 0; i < val.length; i++) {
-      writeKey(i, false);
-      writeVal(String.valueOf(i), val[i]);
-    }
-    writeMapCloser();
-  }
-
-  @Override
-  public void writeArray(String name, Iterator<?> val, boolean raw) throws 
IOException {
-    assert !raw;
-    ArrayList<Object> vals = new ArrayList<>();
-    while (val.hasNext()) {
-      vals.add(val.next());
-    }
-    writeArray(name, vals.toArray(), false);
-  }
-
-  @Override
-  public void writeMapOpener(int size) throws IOException, 
IllegalArgumentException {
-    // negative size value indicates that something has gone wrong
-    if (size < 0) {
-      throw new IllegalArgumentException("Map size must not be negative");
-    }
-    writer.write("a:" + size + ":{");
-  }
-
-  @Override
-  public void writeMapSeparator() throws IOException {
-    /* NOOP */
-  }
-
-  @Override
-  public void writeMapCloser() throws IOException {
-    writer.write('}');
-  }
-
-  @Override
-  public void writeArrayOpener(int size) throws IOException, 
IllegalArgumentException {
-    // negative size value indicates that something has gone wrong
-    if (size < 0) {
-      throw new IllegalArgumentException("Array size must not be negative");
-    }
-    writer.write("a:" + size + ":{");
-  }
-
-  @Override
-  public void writeArraySeparator() throws IOException {
-    /* NOOP */
-  }
-
-  @Override
-  public void writeArrayCloser() throws IOException {
-    writer.write('}');
-  }
-
-  @Override
-  public void writeNull(String name) throws IOException {
-    writer.write("N;");
-  }
-
-  @Override
-  public void writeKey(String fname, boolean needsEscaping) throws IOException 
{
-    writeStr(null, fname, needsEscaping);
-  }
-
-  void writeKey(int val, boolean needsEscaping) throws IOException {
-    writeInt(null, String.valueOf(val));
-  }
-
-  @Override
-  public void writeBool(String name, boolean val) throws IOException {
-    writer.write(val ? "b:1;" : "b:0;");
-  }
-
-  @Override
-  public void writeBool(String name, String val) throws IOException {
-    writeBool(name, val.charAt(0) == 't');
-  }
-
-  @Override
-  public void writeInt(String name, String val) throws IOException {
-    writer.write("i:" + val + ";");
-  }
-
-  @Override
-  public void writeLong(String name, String val) throws IOException {
-    writeInt(name, val);
-  }
-
-  @Override
-  public void writeFloat(String name, String val) throws IOException {
-    writeDouble(name, val);
-  }
-
-  @Override
-  public void writeDouble(String name, String val) throws IOException {
-    writer.write("d:" + val + ";");
-  }
-
-  @Override
-  public void writeStr(String name, String val, boolean needsEscaping) throws 
IOException {
-    // serialized PHP strings don't need to be escaped at all, however the
-    // string size reported needs be the number of bytes rather than chars.
-    utf8 = ArrayUtil.grow(utf8, val.length() * 
UnicodeUtil.MAX_UTF8_BYTES_PER_CHAR);
-    final int nBytes = UnicodeUtil.UTF16toUTF8(val, 0, val.length(), utf8);
-
-    writer.write("s:");
-    writer.write(Integer.toString(nBytes));
-    writer.write(":\"");
-    writer.write(val);
-    writer.write("\";");
-  }
-}
diff --git 
a/solr/core/src/java/org/apache/solr/response/PythonResponseWriter.java 
b/solr/core/src/java/org/apache/solr/response/PythonResponseWriter.java
deleted file mode 100644
index d50fb95e287..00000000000
--- a/solr/core/src/java/org/apache/solr/response/PythonResponseWriter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.response;
-
-import java.io.IOException;
-import java.io.Writer;
-import org.apache.solr.request.SolrQueryRequest;
-
-public class PythonResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_PYTHON_ASCII = "text/x-python;charset=US-ASCII";
-
-  @Override
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse 
rsp) throws IOException {
-    PythonWriter w = new PythonWriter(writer, req, rsp);
-    try {
-      w.writeResponse();
-    } finally {
-      w.close();
-    }
-  }
-
-  @Override
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse 
response) {
-    return CONTENT_TYPE_TEXT_ASCII;
-  }
-}
-
-class PythonWriter extends JSONResponseWriter.NaNFloatWriter {
-  @Override
-  protected String getNaN() {
-    return "float('NaN')";
-  }
-
-  @Override
-  protected String getInf() {
-    return "float('Inf')";
-  }
-
-  public PythonWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse 
rsp) {
-    super(writer, req, rsp);
-  }
-
-  @Override
-  public void writeNull(String name) throws IOException {
-    writer.write("None");
-  }
-
-  @Override
-  public void writeBool(String name, boolean val) throws IOException {
-    writer.write(val ? "True" : "False");
-  }
-
-  @Override
-  public void writeBool(String name, String val) throws IOException {
-    writeBool(name, val.charAt(0) == 't');
-  }
-
-  /* optionally use a unicode python string if necessary */
-  @Override
-  public void writeStr(String name, String val, boolean needsEscaping) throws 
IOException {
-    if (!needsEscaping) {
-      writer.write('\'');
-      writer.write(val);
-      writer.write('\'');
-      return;
-    }
-
-    // use python unicode strings...
-    // python doesn't tolerate newlines in strings in its eval(), so we must 
escape them.
-
-    StringBuilder sb = new StringBuilder(val.length());
-    boolean needUnicode = false;
-
-    for (int i = 0; i < val.length(); i++) {
-      char ch = val.charAt(i);
-      switch (ch) {
-        case '\'':
-        case '\\':
-          sb.append('\\');
-          sb.append(ch);
-          break;
-        case '\r':
-          sb.append("\\r");
-          break;
-        case '\n':
-          sb.append("\\n");
-          break;
-        case '\t':
-          sb.append("\\t");
-          break;
-        default:
-          // we don't strictly have to escape these chars, but it will 
probably increase
-          // portability to stick to visible ascii
-          if (ch < ' ' || ch > 127) {
-            unicodeEscape(sb, ch);
-            needUnicode = true;
-          } else {
-            sb.append(ch);
-          }
-      }
-    }
-
-    if (needUnicode) {
-      writer.write('u');
-    }
-    writer.write('\'');
-    writer.append(sb);
-    writer.write('\'');
-  }
-
-  /*
-  old version that always used unicode
-  public void writeStr(String name, String val, boolean needsEscaping) throws 
IOException {
-    // use python unicode strings...
-    // python doesn't tolerate newlines in strings in its eval(), so we must 
escape them.
-    writer.write("u'");
-    // it might be more efficient to use a stringbuilder or write substrings
-    // if writing chars to the stream is slow.
-    if (needsEscaping) {
-      for (int i=0; i<val.length(); i++) {
-        char ch = val.charAt(i);
-        switch(ch) {
-          case '\'':
-          case '\\': writer.write('\\'); writer.write(ch); break;
-          case '\r': writer.write("\\r"); break;
-          case '\n': writer.write("\\n"); break;
-          default:
-            // we don't strictly have to escape these chars, but it will 
probably increase
-            // portability to stick to visible ascii
-            if (ch<' ' || ch>127) {
-              unicodeChar(ch);
-            } else {
-              writer.write(ch);
-            }
-        }
-      }
-    } else {
-      writer.write(val);
-    }
-    writer.write('\'');
-  }
-  */
-
-}
diff --git 
a/solr/core/src/java/org/apache/solr/response/RubyResponseWriter.java 
b/solr/core/src/java/org/apache/solr/response/RubyResponseWriter.java
deleted file mode 100644
index bce2c2c9498..00000000000
--- a/solr/core/src/java/org/apache/solr/response/RubyResponseWriter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.response;
-
-import java.io.IOException;
-import java.io.Writer;
-import org.apache.solr.request.SolrQueryRequest;
-
-public class RubyResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_RUBY_UTF8 = "text/x-ruby;charset=UTF-8";
-
-  @Override
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse 
rsp) throws IOException {
-    RubyWriter w = new RubyWriter(writer, req, rsp);
-    try {
-      w.writeResponse();
-    } finally {
-      w.close();
-    }
-  }
-
-  @Override
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse 
response) {
-    return CONTENT_TYPE_TEXT_UTF8;
-  }
-}
-
-class RubyWriter extends JSONResponseWriter.NaNFloatWriter {
-
-  @Override
-  protected String getNaN() {
-    return "(0.0/0.0)";
-  }
-
-  @Override
-  protected String getInf() {
-    return "(1.0/0.0)";
-  }
-
-  public RubyWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse 
rsp) {
-    super(writer, req, rsp);
-  }
-
-  @Override
-  public void writeNull(String name) throws IOException {
-    writer.write("nil");
-  }
-
-  @Override
-  public void writeKey(String fname, boolean needsEscaping) throws IOException 
{
-    writeStr(null, fname, needsEscaping);
-    writer.write('=');
-    writer.write('>');
-  }
-
-  @Override
-  public void writeStr(String name, String val, boolean needsEscaping) throws 
IOException {
-    // Ruby doesn't do unicode escapes... so let the servlet container write 
raw UTF-8
-    // bytes into the string.
-    //
-    // Use single quoted strings for safety since no evaluation is done within 
them.
-    // Also, there are very few escapes recognized in a single quoted string, 
so
-    // only escape the backslash and single quote.
-    writer.write('\'');
-    if (needsEscaping) {
-      for (int i = 0; i < val.length(); i++) {
-        char ch = val.charAt(i);
-        if (ch == '\'' || ch == '\\') {
-          writer.write('\\');
-        }
-        writer.write(ch);
-      }
-    } else {
-      writer.write(val);
-    }
-    writer.write('\'');
-  }
-}
diff --git a/solr/core/src/test/org/apache/solr/response/JSONWriterTest.java 
b/solr/core/src/test/org/apache/solr/response/JSONWriterTest.java
index 6d45634da78..5ccf19cdecf 100644
--- a/solr/core/src/test/org/apache/solr/response/JSONWriterTest.java
+++ b/solr/core/src/test/org/apache/solr/response/JSONWriterTest.java
@@ -39,7 +39,7 @@ import org.apache.solr.search.SolrReturnFields;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-/** Test some aspects of JSON/python writer output (very incomplete) */
+/** Test some aspects of JSON writer output */
 public class JSONWriterTest extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
@@ -53,25 +53,17 @@ public class JSONWriterTest extends SolrTestCaseJ4 {
   }
 
   @Test
-  public void testTypes() throws IOException {
+  public void testSimpleJson() throws IOException {
     SolrQueryRequest req = req("q", "dummy", "indent", "off");
     SolrQueryResponse rsp = new SolrQueryResponse();
-    QueryResponseWriter w = new PythonResponseWriter();
+    QueryResponseWriter w = new JSONResponseWriter();
 
     StringWriter buf = new StringWriter();
+
     rsp.add("data1", Float.NaN);
     rsp.add("data2", Double.NEGATIVE_INFINITY);
     rsp.add("data3", Float.POSITIVE_INFINITY);
-    w.write(buf, req, rsp);
-    jsonEq(buf.toString(), 
"{'data1':float('NaN'),'data2':-float('Inf'),'data3':float('Inf')}");
-
-    w = new RubyResponseWriter();
-    buf = new StringWriter();
-    w.write(buf, req, rsp);
-    jsonEq(buf.toString(), 
"{'data1'=>(0.0/0.0),'data2'=>-(1.0/0.0),'data3'=>(1.0/0.0)}");
 
-    w = new JSONResponseWriter();
-    buf = new StringWriter();
     w.write(buf, req, rsp);
     jsonEq(buf.toString(), 
"{\"data1\":\"NaN\",\"data2\":\"-Infinity\",\"data3\":\"Infinity\"}");
     req.close();
@@ -326,7 +318,7 @@ public class JSONWriterTest extends SolrTestCaseJ4 {
     JacksonJsonWriter w = new JacksonJsonWriter();
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     w.write(baos, req, rsp);
-    String received = new String(baos.toByteArray(), StandardCharsets.UTF_8);
+    String received = baos.toString(StandardCharsets.UTF_8);
     String expected = "testFun( {\n  \"param0\":\"v0\",\n  \"param1\":42\n} )";
     jsonEq(expected, received);
     req.close();
diff --git 
a/solr/core/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java
 
b/solr/core/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java
deleted file mode 100644
index de6339650a3..00000000000
--- 
a/solr/core/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.response;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.request.SolrQueryRequest;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-/** Basic PHPS tests based on JSONWriterTest */
-public class TestPHPSerializedResponseWriter extends SolrTestCaseJ4 {
-  @BeforeClass
-  public static void beforeClass() throws Exception {
-    initCore("solrconfig.xml", "schema.xml");
-  }
-
-  @Test
-  public void testSimple() throws IOException {
-    SolrQueryRequest req = req("dummy");
-    SolrQueryResponse rsp = new SolrQueryResponse();
-    QueryResponseWriter w = new PHPSerializedResponseWriter();
-
-    StringWriter buf = new StringWriter();
-    rsp.add("data1", "hello");
-    rsp.add("data2", 42);
-    rsp.add("data3", true);
-    w.write(buf, req, rsp);
-    assertEquals(
-        
"a:3:{s:5:\"data1\";s:5:\"hello\";s:5:\"data2\";i:42;s:5:\"data3\";b:1;}", 
buf.toString());
-    req.close();
-  }
-
-  @Test
-  public void testSolrDocuments() throws IOException {
-    SolrQueryRequest req = req("q", "*:*");
-    SolrQueryResponse rsp = new SolrQueryResponse();
-    QueryResponseWriter w = new PHPSerializedResponseWriter();
-    StringWriter buf = new StringWriter();
-
-    SolrDocument d = new SolrDocument();
-
-    SolrDocument d1 = d;
-    d.addField("id", "1");
-    d.addField("data1", "hello");
-    d.addField("data2", 42);
-    d.addField("data3", true);
-
-    // multivalued fields:
-
-    // extremely odd edge case: value is a map
-
-    // we use LinkedHashMap because we are doing a string comparison
-    // later, and we need predictable ordering
-    LinkedHashMap<String, String> nl = new LinkedHashMap<>();
-    nl.put("data4.1", "hashmap");
-    nl.put("data4.2", "hello");
-    d.addField("data4", nl);
-    // array value
-    d.addField("data5", Arrays.asList("data5.1", "data5.2", "data5.3"));
-
-    // adding one more document to test array indexes
-    d = new SolrDocument();
-    SolrDocument d2 = d;
-    d.addField("id", "2");
-
-    SolrDocumentList sdl = new SolrDocumentList();
-    sdl.add(d1);
-    sdl.add(d2);
-    rsp.addResponse(sdl);
-
-    w.write(buf, req, rsp);
-    assertEquals(
-        
"a:1:{s:8:\"response\";a:4:{s:8:\"numFound\";i:0;s:5:\"start\";i:0;s:13:\"numFoundExact\";b:1;s:4:\"docs\";a:2:{i:0;a:6:{s:2:\"id\";s:1:\"1\";s:5:\"data1\";s:5:\"hello\";s:5:\"data2\";i:42;s:5:\"data3\";b:1;s:5:\"data4\";a:2:{s:7:\"data4.1\";s:7:\"hashmap\";s:7:\"data4.2\";s:5:\"hello\";}s:5:\"data5\";a:3:{i:0;s:7:\"data5.1\";i:1;s:7:\"data5.2\";i:2;s:7:\"data5.3\";}}i:1;a:1:{s:2:\"id\";s:1:\"2\";}}}}",
-        buf.toString());
-    req.close();
-  }
-}
diff --git a/solr/example/exampledocs/test_utf8.sh 
b/solr/example/exampledocs/test_utf8.sh
deleted file mode 100755
index 9032e12ffe3..00000000000
--- a/solr/example/exampledocs/test_utf8.sh
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#Test script to tell if the server is accepting UTF-8
-#The python writer currently escapes non-ascii chars, so it's good for testing
-
-SOLR_URL=http://localhost:8983/solr
-
-if [ ! -z $1 ]; then
-  SOLR_URL=$1
-fi
-
-curl "$SOLR_URL/select?q=hello&params=explicit&wt=python" 2> /dev/null | grep 
'hello' > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "Solr server is up."
-else
-  echo "ERROR: Could not curl to Solr - is curl installed? Is Solr not 
running?"
-  exit 1
-fi
-
-curl "$SOLR_URL/select?q=h%C3%A9llo&echoParams=explicit&wt=python" 2> 
/dev/null | grep 'h\\u00e9llo' > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "HTTP GET is accepting UTF-8"
-else
-  echo "ERROR: HTTP GET is not accepting UTF-8"
-fi
-
-curl $SOLR_URL/select --data-binary 
'q=h%C3%A9llo&echoParams=explicit&wt=python' -H 
'Content-type:application/x-www-form-urlencoded; charset=UTF-8' 2> /dev/null | 
grep 'h\\u00e9llo' > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "HTTP POST is accepting UTF-8"
-else
-  echo "ERROR: HTTP POST is not accepting UTF-8"
-fi
-
-curl $SOLR_URL/select --data-binary 
'q=h%C3%A9llo&echoParams=explicit&wt=python' 2> /dev/null | grep 'h\\u00e9llo' 
> /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "HTTP POST defaults to UTF-8"
-else
-  echo "HTTP POST does not default to UTF-8"
-fi
-
-
-#A unicode character outside of the BMP (a circle with an x inside)
-CHAR="𐌈"
-CODEPOINT='0x10308'
-#URL encoded UTF8 of the codepoint
-UTF8_Q='%F0%90%8C%88'
-#expected return of the python writer (currently uses UTF-16 surrogates)
-EXPECTED='\\ud800\\udf08'
-
-curl "$SOLR_URL/select?q=$UTF8_Q&echoParams=explicit&wt=python" 2> /dev/null | 
grep $EXPECTED > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "HTTP GET is accepting UTF-8 beyond the basic multilingual plane"
-else
-  echo "ERROR: HTTP GET is not accepting UTF-8 beyond the basic multilingual 
plane"
-fi
-
-curl $SOLR_URL/select --data-binary "q=$UTF8_Q&echoParams=explicit&wt=python"  
-H 'Content-type:application/x-www-form-urlencoded; charset=UTF-8' 2> /dev/null 
| grep $EXPECTED > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "HTTP POST is accepting UTF-8 beyond the basic multilingual plane"
-else
-  echo "ERROR: HTTP POST is not accepting UTF-8 beyond the basic multilingual 
plane"
-fi
-
-curl "$SOLR_URL/select?q=$UTF8_Q&echoParams=explicit&wt=python" --data-binary 
'' 2> /dev/null | grep $EXPECTED > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "HTTP POST + URL params is accepting UTF-8 beyond the basic 
multilingual plane"
-else
-  echo "ERROR: HTTP POST + URL params is not accepting UTF-8 beyond the basic 
multilingual plane"
-fi
-
-#curl "$SOLR_URL/select?q=$UTF8_Q&echoParams=explicit" 2> /dev/null | od -tx1 
-w1000 | sed 's/ //g' | grep 'f4808198' > /dev/null 2>&1
-curl "$SOLR_URL/select?q=$UTF8_Q&echoParams=explicit" 2> /dev/null | grep 
"$CHAR" > /dev/null 2>&1
-if [ $? = 0 ]; then
-  echo "Response correctly returns UTF-8 beyond the basic multilingual plane"
-else
-  echo "ERROR: Response can't return UTF-8 beyond the basic multilingual plane"
-fi
-
-
diff --git a/solr/server/solr/configsets/_default/conf/solrconfig.xml 
b/solr/server/solr/configsets/_default/conf/solrconfig.xml
index 825993191ae..5bc2cf13415 100644
--- a/solr/server/solr/configsets/_default/conf/solrconfig.xml
+++ b/solr/server/solr/configsets/_default/conf/solrconfig.xml
@@ -999,10 +999,6 @@
                           default="true"
                           class="solr.XMLResponseWriter" />
      <queryResponseWriter name="json" class="solr.JSONResponseWriter"/>
-     <queryResponseWriter name="python" class="solr.PythonResponseWriter"/>
-     <queryResponseWriter name="ruby" class="solr.RubyResponseWriter"/>
-     <queryResponseWriter name="php" class="solr.PHPResponseWriter"/>
-     <queryResponseWriter name="phps" 
class="solr.PHPSerializedResponseWriter"/>
      <queryResponseWriter name="csv" class="solr.CSVResponseWriter"/>
      <queryResponseWriter name="schema.xml" 
class="solr.SchemaXmlResponseWriter"/>
     -->
diff --git 
a/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml 
b/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
index c8250755dc7..8350831eeb9 100644
--- 
a/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
+++ 
b/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
@@ -1243,10 +1243,6 @@ via parameters.  The below configuration supports 
hl.method=original and fastVec
                           default="true"
                           class="solr.XMLResponseWriter" />
      <queryResponseWriter name="json" class="solr.JSONResponseWriter"/>
-     <queryResponseWriter name="python" class="solr.PythonResponseWriter"/>
-     <queryResponseWriter name="ruby" class="solr.RubyResponseWriter"/>
-     <queryResponseWriter name="php" class="solr.PHPResponseWriter"/>
-     <queryResponseWriter name="phps" 
class="solr.PHPSerializedResponseWriter"/>
      <queryResponseWriter name="csv" class="solr.CSVResponseWriter"/>
      <queryResponseWriter name="schema.xml" 
class="solr.SchemaXmlResponseWriter"/>
     -->
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/python.adoc 
b/solr/solr-ref-guide/modules/deployment-guide/pages/python.adoc
index f2fbd3bf5c6..0c94ef5606d 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/python.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/python.adoc
@@ -16,45 +16,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-Solr includes an output format specifically for 
xref:query-guide:response-writers.adoc#python-response-writer[Python Response 
Writer], but the 
xref:query-guide:response-writers.adoc#json-response-writer[JSON Response 
Writer] is a little more robust.
+== Python
 
-== Simple Python
-
-Making a query is a simple matter.
-First, tell Python you will need to make HTTP connections.
-
-[source,python]
-----
-from urllib2 import *
-----
-
-Now open a connection to the server and get a response.
-The `wt` query parameter tells Solr to return results in a format that Python 
can understand.
-
-[source,python]
-----
-connection = 
urlopen('http://localhost:8983/solr/collection_name/select?q=cheese&wt=python')
-response = eval(connection.read())
-----
-
-Now interpreting the response is just a matter of pulling out the information 
that you need.
-
-[source,python]
-----
-print response['response']['numFound'], "documents found."
-
-# Print the name of each document.
-
-for document in response['response']['docs']:
-  print "  Name =", document['name']
-----
-
-== Python with JSON
-
-JSON is a more robust response format, and Python has support for it in its 
standard library since version 2.6.
-
-Making a query is nearly the same as before.
-However, notice that the `wt` query parameter is now `json` (which is also the 
default if no `wt` parameter is specified), and the response is now digested by 
`json.load()`.
+JSON is the preferred interchange format for Python users, and Python has 
support for it in its standard library since version 2.6.
 
 [source,python]
 ----
@@ -69,3 +33,5 @@ print response['response']['numFound'], "documents found."
 for document in response['response']['docs']:
   print "  Name =", document['name']
 ----
+
+You can even skip the `wt=json` as it's the default writer type.
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/ruby.adoc 
b/solr/solr-ref-guide/modules/deployment-guide/pages/ruby.adoc
index 92b71b5a708..7f82e552e84 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/ruby.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/ruby.adoc
@@ -16,100 +16,43 @@
 // specific language governing permissions and limitations
 // under the License.
 
-Solr has an optional Ruby response format that extends the 
xref:query-guide:response-writers.adoc#json-response-writer[JSON Response 
Writer] to allow the response to be safely eval'd by Ruby's interpreter
 
-This Ruby response format differs from JSON in the following ways:
+== Ruby
 
-* Ruby's single quoted strings are used to prevent possible string exploits
-** `\` and `'` are the only two characters escaped...
-** unicode escapes not used... data is written as raw UTF-8
-* nil used for null
-* `\=>` used as the key/value separator in maps
-
-Here's an example Ruby response from Solr, for a request like 
`\http://localhost:8983/solr/techproducts/select?q=iPod&wt=ruby&indent=on` 
(with Solr launching using `bin/solr start -e techproducts`):
-
-[source,ruby]
-----
-{
-  'responseHeader'=>{
-    'status'=>0,
-    'QTime'=>0,
-    'params'=>{
-      'q'=>'iPod',
-      'indent'=>'on',
-      'wt'=>'ruby'}},
-  'response'=>{'numFound'=>3,'start'=>0,'docs'=>[
-      {
-        'id'=>'IW-02',
-        'name'=>'iPod & iPod Mini USB 2.0 Cable',
-        'manu'=>'Belkin',
-        'manu_id_s'=>'belkin',
-        'cat'=>['electronics',
-          'connector'],
-        'features'=>['car power adapter for iPod, white'],
-        'weight'=>2.0,
-        'price'=>11.5,
-        'price_c'=>'11.50,USD',
-        'popularity'=>1,
-        'inStock'=>false,
-        'store'=>'37.7752,-122.4232',
-        'manufacturedate_dt'=>'2006-02-14T23:55:59Z',
-        '_version_'=>1491038048794705920},
-      {
-        'id'=>'F8V7067-APL-KIT',
-        'name'=>'Belkin Mobile Power Cord for iPod w/ Dock',
-        'manu'=>'Belkin',
-        'manu_id_s'=>'belkin',
-        'cat'=>['electronics',
-          'connector'],
-        'features'=>['car power adapter, white'],
-        'weight'=>4.0,
-        'price'=>19.95,
-        'price_c'=>'19.95,USD',
-        'popularity'=>1,
-        'inStock'=>false,
-        'store'=>'45.18014,-93.87741',
-        'manufacturedate_dt'=>'2005-08-01T16:30:25Z',
-        '_version_'=>1491038048792608768},
-      {
-        'id'=>'MA147LL/A',
-        'name'=>'Apple 60 GB iPod with Video Playback Black',
-        'manu'=>'Apple Computer Inc.',
-        'manu_id_s'=>'apple',
-        'cat'=>['electronics',
-          'music'],
-        'features'=>['iTunes, Podcasts, Audiobooks',
-          'Stores up to 15,000 songs, 25,000 photos, or 150 hours of video',
-          '2.5-inch, 320x240 color TFT LCD display with LED backlight',
-          'Up to 20 hours of battery life',
-          'Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video',
-          'Notes, Calendar, Phone book, Hold button, Date display, Photo 
wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 
compatibility, Playback speed control, Rechargeable capability, Battery level 
indication'],
-        'includes'=>'earbud headphones, USB cable',
-        'weight'=>5.5,
-        'price'=>399.0,
-        'price_c'=>'399.00,USD',
-        'popularity'=>10,
-        'inStock'=>true,
-        'store'=>'37.7752,-100.0232',
-        'manufacturedate_dt'=>'2005-10-12T08:00:00Z',
-        '_version_'=>1491038048799948800}]
-  }}
-----
-
-Here is a simple example of how one may query Solr using the Ruby response 
format:
+JSON is the preferred interchange format for Ruby users.
 
 [source,ruby]
 ----
 require 'net/http'
+require 'json'
 
 h = Net::HTTP.new('localhost', 8983)
-http_response = h.get('/solr/techproducts/select?q=iPod&wt=ruby')
-rsp = eval(http_response.body)
+http_response = h.get('/solr/techproducts/select?q=iPod&wt=json')
 
-puts 'number of matches = ' + rsp['response']['numFound'].to_s
-#print out the name field for each returned document
-rsp['response']['docs'].each { |doc| puts 'name field = ' + doc['name'] }
+# Parse the JSON response
+rsp = JSON.parse(http_response.body)
+
+puts 'Number of matches = ' + rsp['response']['numFound'].to_s
+
+# Print out the name field for each returned document
+rsp['response']['docs'].each do |doc|
+  puts 'Name field = ' + doc['name']
+end
 ----
 
-For simple interactions with Solr, this may be all you need!
-If you are building complex interactions with Solr, then consider the 
libraries mentioned in the 
https://cwiki.apache.org/confluence/display/solr/Ruby+Response+Format#RubyResponseFormat-Libraries[Solr
 Wiki].
+You can even skip the `wt=json` as it's the default writer type.
+
+If you are building complex interactions with Solr, then consider these 
libraries:
+
+=== Active
+* link:http://rubygems.org/gems/rsolr[RSolr]: A lightweight, general purpose 
client library for Solr.
+  ** link:https://github.com/sunspot/sunspot[Sunspot]: A nice DSL framework 
for integrating Solr into your models. Built on top of RSolr.
+* link:http://projectblacklight.org[Blacklight]: A popular and well-maintained 
Ruby on Rails framework for building flexible and attractive front-ends to Solr.
+
+=== Inactive
+* link:http://rubygems.org/gems/solr-ruby[Solr-ruby]: Low-level access to Solr 
from Ruby.
+* link:http://rubygems.org/gems/flare[Flare]: A plugin adding faceted 
browsing, AJAX suggest, and more to Rails controllers.
+* link:http://acts_as_solr.railsfreaks.com/[acts_as_solr]: A plugin to add 
full-text search capabilities using Solr to ActiveRecord models. 
link:http://www.quarkruby.com/2007/8/12/acts_as_solr-for-search-and-faceting/[nice
 acts_as_solr tutorial]
+* 
link:http://rubyforge.org/projects/background-solr/[acts_as_background_solr]: 
An extension to acts_as_solr moving more processing to the background.
+* link:http://mojodna.net/searchable/ruby/[Searchable]: A Rails plugin that 
provides search integration with ActiveRecord. (an alternative to acts_as_solr)
+* link:http://delsolr.rubyforge.org/[DelSolr]: A Solr wrapper designed to 
simplify facet and filter queries.
diff --git 
a/solr/solr-ref-guide/modules/getting-started/pages/tutorial-techproducts.adoc 
b/solr/solr-ref-guide/modules/getting-started/pages/tutorial-techproducts.adoc
index e397ccf9db9..be9060e6230 100644
--- 
a/solr/solr-ref-guide/modules/getting-started/pages/tutorial-techproducts.adoc
+++ 
b/solr/solr-ref-guide/modules/getting-started/pages/tutorial-techproducts.adoc
@@ -195,7 +195,6 @@ POSTing file sample.html (text/html) to [base]/extract
 POSTing file sd500.xml (application/xml) to [base]
 POSTing file solr-word.pdf (application/pdf) to [base]/extract
 POSTing file solr.xml (application/xml) to [base]
-POSTing file test_utf8.sh (application/octet-stream) to [base]/extract
 POSTing file utf8-example.xml (application/xml) to [base]
 POSTing file vidcard.xml (application/xml) to [base]
 20 files indexed.
diff --git 
a/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-tika.adoc 
b/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-tika.adoc
index 14b26ed556d..3d4e1509fbe 100644
--- a/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-tika.adoc
+++ b/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-tika.adoc
@@ -603,7 +603,7 @@ The output includes XML generated by Tika (and further 
escaped by Solr's XML) us
 
 [,console]
 ----
-$ bin/solr post -c gettingstarted --params 
"extractOnly=true&wt=ruby&indent=true" --out yes example/exampledocs/sample.html
+$ bin/solr post -c gettingstarted --params 
"extractOnly=true&wt=json&indent=true" --out yes example/exampledocs/sample.html
 ----
 
 === Using Solr Cell with a POST Request
diff --git 
a/solr/solr-ref-guide/modules/query-guide/pages/response-writers.adoc 
b/solr/solr-ref-guide/modules/query-guide/pages/response-writers.adoc
index d4961312f34..84e938da5fb 100644
--- a/solr/solr-ref-guide/modules/query-guide/pages/response-writers.adoc
+++ b/solr/solr-ref-guide/modules/query-guide/pages/response-writers.adoc
@@ -24,14 +24,11 @@ Solr supports a variety of Response Writers to ensure that 
query responses can b
 The `wt` parameter selects the Response Writer to be used.
 The list below describe shows the most common settings for the `wt` parameter, 
with links to further sections that discuss them in more detail.
 
+* <<CBOR Response Writer,cbor>>
 * <<CSV Response Writer,csv>>
 * <<GeoJSON Response Writer,geojson>>
 * <<Binary Response Writer,javabin>>
 * <<JSON Response Writer,json>>
-* <<php-writer,php>>
-* <<php-writer,phps>>
-* <<Python Response Writer,python>>
-* <<Ruby Response Writer,ruby>>
 * <<Smile Response Writer,smile>>
 * <<XLSX Response Writer,xlsx>>
 * <<Standard XML Response Writer,xml>>
@@ -285,67 +282,6 @@ Returns Solr results in http://geojson.org[GeoJSON] 
augmented with Solr-specific
 To use this, set `wt=geojson` and `geojson.field` to the name of a spatial 
Solr field.
 Not all spatial fields types are supported, and you'll get an error if you use 
an unsupported one.
 
-== Python Response Writer
-
-Solr has an optional Python response format that extends its JSON output in 
the following ways to allow the response to be safely evaluated by the python 
interpreter:
-
-* true and false changed to True and False
-* Python unicode strings are used where needed
-* ASCII output (with unicode escapes) is used for less error-prone 
interoperability
-* newlines are escaped
-* null changed to None
-
-[[php-writer]]
-== PHP Response Writer and PHP Serialized Response Writer
-
-Solr has a PHP response format that outputs an array (as PHP code) which can 
be evaluated.
-Setting the `wt` parameter to `php` invokes the PHP Response Writer.
-
-Example usage:
-
-[source,php]
-----
-$code = 
file_get_contents('http://localhost:8983/solr/techproducts/select?q=iPod&wt=php');
-eval("$result = " . $code . ";");
-print_r($result);
-----
-
-Solr also includes a PHP Serialized Response Writer that formats output in a 
serialized array.
-Setting the `wt` parameter to `phps` invokes the PHP Serialized Response 
Writer.
-
-Example usage:
-
-[source,php]
-----
-$serializedResult = 
file_get_contents('http://localhost:8983/solr/techproducts/select?q=iPod&wt=phps');
-$result = unserialize($serializedResult);
-print_r($result);
-----
-
-== Ruby Response Writer
-
-Solr has an optional Ruby response format that extends its JSON output in the 
following ways to allow the response to be safely evaluated by Ruby's 
interpreter:
-
-* Ruby's single quoted strings are used to prevent possible string exploits.
-* \ and ' are the only two characters escaped.
-* Unicode escapes are not used.
-Data is written as raw UTF-8.
-* nil used for null.
-* \=> is used as the key/value separator in maps.
-
-Here is a simple example of how one may query Solr using the Ruby response 
format:
-
-[source,ruby]
-----
-require 'net/http'
-h = Net::HTTP.new('localhost', 8983)
-hresp, data = h.get('/solr/techproducts/select?q=iPod&wt=ruby', nil)
-rsp = eval(data)
-puts 'number of matches = ' + rsp['response']['numFound'].to_s
-#print out the name field for each returned document
-rsp['response']['docs'].each { |doc| puts 'name field = ' + doc['name'\] }
-----
-
 == CSV Response Writer
 
 The CSV response writer returns a list of documents in comma-separated values 
(CSV) format.
diff --git 
a/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc 
b/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
index 532c13fabe0..0f86500fac7 100644
--- 
a/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
+++ 
b/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
@@ -64,3 +64,6 @@ has been removed. Please use `-Dsolr.hiddenSysProps` or the 
envVar `SOLR_HIDDEN_
 * The `BlobRepository`, which was deprecated in 8x in favour of the 
`FileStore` approach is removed.   
 Users should migrate to the `FileStore` implementation (per node stored file) 
and the still existing `BlobHandler` (across the cluster storage backed by 
`.system` collection).
 Please note this also removes the ability to share resource intensive objects 
across multiple cores as this feature was tied to the `BlobRepository` 
implementation.
+
+* The language specific Response Writers, which were deprecated in 9.8 in 
favour of more widely used formats like JSON have been removed.
+The removed writer types (invoked as part of the `wt` parameter) include 
`python`, `ruby`, `php`, and `phps`.

Reply via email to